Доставка — или «быстрейший способ обанкротиться на Kickstarter»

В последнее время быстро набирает обороты явление, именуюмое в России странным словом Крауфандинг. Хочу обратить внимание уважаемых читателей на один из аспектов, который редко рассматривается при обсуждении его возможностей для стартапа Вашего проекта. Это логистика. Как и множество других подводных камней, недооценка данного фактора на стадии расчёта предварительной стоимости лотов может привести к убыточности проекта, который успешно собрал средства на площадке Kickstarterа.
Если Вы задумываетесь о запуске своего проекта, то это статья о чужом печальном опыте и тонкостях почтовых отправлений в США несомненно для Вас. Многим другим тоже может быть интересно.
И так представляю перевод свежего поста Эриком Дэльмана от 28 января 2013 года о проекте создания игральных карт.

Высокие цены на доставку товаров не раз подвергались жестокой критике. Многие из бекеров (жертвователей, которые делают ставки), удивлялись, что аналогичные проекты стоили им значительно дешевле, почему же наш столь затратен? Причина довольно проста, всё из-за расходов на доставку.

Возьмём, к примеру, простой карточный проект “Зов Ктулху”.
2500 карточных колод, это то то, чего мы хотели достичь за сорок дней развития нашего проекта игральных карт “Зов Ктулху” от бренда Bicycle. Мы рассчитывали, что пересылка двух-трёх колод обойдётся в несколько баксов у нас в стране и возможно в два раза дороже при доставке за рубеж. Сделав быстрые расчёты веса, мы подсчитали, что цена доставки за границу в 8 долларов покроет в подавляющем количестве случаев затраты на доставку. Мы представить себе не могли как ошибались ошибиться! На самом же деле мы были в корне неправы.
В течение первой недели мы получили заказы на 5000 колод. Воодушевлённые успехом мы начали искать дополнительные стимулы, чтобы поддержать популярность проекта в течение оставшихся тридцати дней. Вот тогда мы и столкнулись с трудностями.

Перечислим все подводные камни, на которые наткнулись мы и которых стоит опасаться нашим последователям.
Необходимо заранее точно определить размер упаковки

Прежде, чем вы начнёте рассылку, вы должны рассчитать, сколько товара поместится в каждую упаковку. Первоначально мы заказали тонну тяжёлых посылочных туб размером 4 на 30, рассчитывая, что мы сможем положить туда свёрнутые в трубку иллюстрации, а в середину поместить колоды. Когда мы получили тубы, иллюстрации и колоды, мы поняли, что наша идея не оправдала себя, так как колоды внутри скользили и таким образом могли порвать иллюстрации. Тогда мы привязали колоды в верхней части туб. Всё было бы хорошо, за исключением двух пунктов.

1. Верёвка держала плохо
2. Более крупные трубы были тяжелее, их общая масса превышала 16 унций. Критическое число же составляет 13 унций, это мы объясним ниже.

Таким образом, мы выработали две различные модели доставки, в зависимости от того, куда поставлялся товар. Первая – доставка в тубах размером 24 на 4, которые выдерживали неразрезанный лист с иллюстрациями, а также позволяли нам заполнить оба конца упакованными колодами, по 12 с каждой стороны. Мы использовали этот метод при доставке за рубеж, т.к. он позволял уместить всё в одну упаковку и стоил примерно 20-30$ на упаковку. Если бы мы упаковывали неразрезанные листы с иллюстрациями отдельно от колод, это обошлось бы нам в 13-16$ плюс ещё 17$ сверх.
В США любое количество колод свыше трёх сразу же упаковывают в небольшую коробку. К сожалению, в подобную коробку помещается не больше 8 колод, любой выход за пределы этой суммы повлёк бы за собой, либо увеличение размеров коробки, либо количества коробок. Стандартным упаковочным материалом является маленькая коробка за 5.35$ и туба стоимостью около 4$ (включая стоимость тубы).
Из-за того что размер и вес каждой ставки бекеров отличался, упаковочный процесс оказался непростым делом. В конце концов, я осматривал каждую упаковку, чтобы определить, какой будет наименьший вес упаковки, иногда я ошибался, и приходилось полностью перепаковывать содержимое. Должно быть, это происходило из-за доп. упаковочных материалов и тому подобного.

Каждая унция имеет значение/Будьте осторожны со всевозможными дополнениями (аксессуарами)

Самой большой нашей проблемой стали дополнения (аксессуары). С одной стороны они стимулировали инвесторов вкладывать в наш проект, а с другой, добавляли вес к каждой упаковке.
Скажем, иностранный инвестор начинает со ставки в 15$ за две колоды, притом, что транспортировка за рубеж стоит 8$. Затем в качестве вознаграждений были добавлены монета, покерный набор и 4 кубика. Изначально вес составлял около 8 унций. С дополнительными аксессуарами, весом в 2 унции каждый, общий вес оказался близким к 14 унциям.
В штатах это свело бы цену как минимум к 5.35 $ (вместо примерно 2.30$), за рубежом же до уровня 16.95$ (вместо 8-12$ в зависимости от страны)!
Помните ключевое число – 13 унций?
Всё что выходит за пределы 13 унций в США означает, что вам придётся перейти на коробки стоимостью 5.85$; мне казалось, ранее мы упоминали более низкую цифру — 5.35$. Так и было, но эта цифра была действенна лишь до 27го января. Угадайте почему? Вчера Почтовая служба США значительно подняла все свои расценки. Помните, независимо от того, каков вес, нужно округлять до ближайшей унции, причём в большую сторону. Далее представлена таблица расходов на транспортировку различных колод:
США
8 унций – 2 колоды – $2.55
11 унций – 3 – колоды – $3.08
4-8 колод — $5.85
Международный рынок
8 унций – 2 колоды – $12.75
11 унций – 3 колоды – $14.90
15 унций – 4 колоды – $16.75
5-8 колод– $24.95

Иллюстрации

Чтобы доставить всё это за границу нам потребовалось около 6$, плюс каждая туба по доллару. Заплатив по 8$ за иллюстрацию, как видите, мы не получили никакой выгоды, 8$ лишь покрывают транспортировку за границу. Мы были в плюсе лишь, когда инвестор заказывал до 5 штук (большее количество требовало использование ещё одной тубы).

Насколько же велики убытки?

На сегодняшний день мы потратили 13.700$ на транспортировку и более 2200$ на отправку по почте. В среднем 7.20$ на одного инвестора. Принимая во внимание 44$ средней ставки с инвестора, счета на транспортировку составили примерно 16% от этой ставки. Учитывая, что Kickstarter/Amazon забирает себе около 10%, следует убедиться, что затраты на производство составляют менее 74% от суммы ставки.

Обработка грузов

*(погрузочно-разгрузочные работы, сортировка, упаковка, маркировка и прочие работы)
Одна вещь, которую мы не включили в список – это обработка грузов. Числа, приведённые выше, включают лишь стоимость самой доставки. Мы не упоминали о бесконечно долгих часах (я насчитал где-то около 320), которые мы провели, упаковывая, взвешивая, печатая адреса и заполняя таможенные формы. Моя работа лишь управлять компанией и контролировать все эти процессы. Всё это заняло почти 2 месяца, и за это время я не получил никакой прибыли. Так что в следующий раз, когда захотите отправить почтой более 2000 упаковок (я пока отправил 2700), подумайте о том, насколько вам ценно ваше время. Всё это само собой не доставится.

ссылка на оригинал статьи http://habrahabr.ru/post/167839/

Trend Watching: 10 главных трендов 2013 года. Часть 2

Продолжаем публиковать подборку, наверное одних из самых необычных трендов. Ранее вы уже могли ознакомиться с первой частью статьи, в которой мы попытались изложить наше видение обзора трендов 2013 года, подготовленного Trend watching. Как вы понимаете, все эти идеи могут стать новыми многомилионными бизнесами (или провалами) в ближайшие 12 месяцев, поэтому читайте и вдохновляйтесь!

Настало время поговорить об экологии, моде и медицине:

4. Возвращаем долги природе

Сейчас речь пойдет о трендах 2013 года, имеющих отношение к экологии: например, о знаковом феномене продуктов и сервисов, которые буквально «содержат в себе новую жизнь».
Вместо того, чтобы быть утилизированными или переработанными, эти продукты могут органично «вернуться» в природную среду, чтобы дать жизнь чему-то новому, такому же «эко» по статусу.

Конечно продукты «новой жизни» не решат многих экологических проблем, но, как никогда ранее, 2013 год – это символ создания чего-то принципиально нового, продукта, дружественного природе.

Правильное позиционирование своих ценностей может найти отклик у ваших пользователей. Особенно если ваши слова подразумевают серьезные намерения совершать осознанные и экологически правильные действия.

«To Be Nature» палочки для еды: смена мышления в пользу растения
Корейский дизайнер Gyeongwan Koo создал «To Be Nature» палочки для еды в качестве альтернативы одноразовым палочкам. Одна из палочек снабжена колпачком, в котором расположены семена растения. После того, как обладатель таких палочек перестает ими пользоваться, их можно поместить кончиком в почву, где семена прорастут и дадут жизнь новому дереву. Вторую палочку (без насадки) можно использовать как опору, вдоль которой будет проходить рост.

Sprout: карандаш, который хочет стать растением
Sprout – это карандаш, который в перспективе может вырасти! Когда карандаш становится слишком коротким и неудобным для использования, его можно посадить в землю: на кончике карандаша, опять же, расположена капсула, которая растворяется при контакте с водой, что позволяет семенам внутри нее прорастать. На момент остановки процесса фандрайзинга в сентябре 2012, проект поднял $35 тысяч от более, чем 2000 поддержавших его «ожидателей».

Tierra Patagonia Hotel & Spa: семена, за которыми наблюдают.
Tierra Patagonia Hotel & Spa в Чили запустил программу, в рамках которой каждый постоялец получает «виртуальное» семя дерева. Гость сам может выбрать место в специально отведенном районе, на котором он хочет, чтобы его дерево было посажено. После посадки, гость получает ссылку на Google Maps с привязкой к местности, по которой можно следить за «своим» деревом.

Molson Canadian: подставки из посевного материала
В рамках специального проекта по естественному восстановлению леса Red Leaf Project, пивной канадский бренд Molson Canadian’s выпустил подставки под пивные куржки, сделанные из посевного материала, которые, оказавшись в почве, прорастали. Начиная с июня 2012, один миллион подставок был распространен по барам и вместе с ящиками для бутылок пива.

5. Digital-медицина

Цифровые технологии – новое слово в медицине. С учетом того, что App store сегодня насчитывают уже более 13 000 медицинских приложений, вопрос уже состоит не в том, что найти подобные приложения, а в том, чтобы выбрать лучшие, а также — учитывая тот факт, что вопрос касается здоровья человека — наиболее точные и безопасные из них.

В 2013 году ожидается, что пользователи будут обращаться к медикам и в различные медицинские институты и учреждения для подтверждения аттестации медицинских приложений и других технологий, либо для того, чтобы доктора им посоветовали такие приложения для лечения (в той же степени, что и лекарственные препараты). Профессиональные терапевты, в свою очередь, видят в медицинских приложениях реальных помощников в своей работе, призванных помочь добиться еще большего успеха и прогресса в лечении пациентов.

Приложения позволят сократить расходы и издержки на лечение, потому как они заставляют своих пользователей чаще задумываться о собственном состоянии здоровья, повышают уровень их сознательности при прохождении лечения, а также позволяют распознавать тревожные сигналы на ранних этапах в процессе мониторинга.

Даже если вы не являетесь частью индустрии, связанной со здравоохранением, и думаете, что digital-медицина не для вас, мы уверены, что время, потраченное на изучение данного тренда, а также тенденции, лежащей в основе процесса – переход к массовому использованию мобильных сервисов – может открыть для вас множество инсайтов, сулящих прибыль.

mRX: App store для профессионалов в области здравоохранения
Happtique (подразделение Greater New York Hospital Association) — app store для медицинских приложений, который создавался профессионалами для профессионалов. В августе 2012 года Happtique запустил пилотную программу, в рамках которой врачи рекомендовали своим пациентам проверенные приложения, а затем следили, чтобы каждый из них скачал предписанное.

Antibiotics Reminder
В июне 2012 года австралийская организация National Prescribing Service, поддерживаемая правительством, запустила проект Antibiotics Reminder. Бесплатное скачиваемое приложение является своего рода «напоминалкой» для приема лекарств: оно помогает следить за тем, чтобы лекарства были приняты, а также вести своеобразный «дневник», чтобы отслеживать прогресс. Цель приложения — помочь пользователям вовремя принимать лекарственные препараты, тем самым усиливая положительный эффект от лечения.

Proteus Digital Health: одобренный Комиссией по контролю за лекарствами и питательными веществами «проглатываемый» трекинг-сенсор.
В июле 2012, Food & Drug Administration в США проспонсировала Proteus Digital Health для разработки и испытаний «проглатываемого» сенсора, который должен следить за тем, принимает ли пациент предписанные лекарства или нет. Устройство активируется при попадании на него желудочного сока, и затем собирает данные о состоянии пациента, направляя их в мобильное приложение, которое позволяет просигнализировать, если лекарство не было принято пациентом вовремя.

6. Торжество национальной культуры

В 2012 году культурная составляющая глобализации продолжит самоуничтожаться так же, как и ее финансовый аспект. К чему это приведет? Развивающиеся рынки будут успешно экспортировать и распространять свое «культурное наследие» в ближайшие 12 месяцев. Символы, стиль жизни и традиции, значение которые раньше было преуменьшено (если не сказать, отвергнуто), станут объектом гордости и массового потребления для покупателей на внутреннем рынке, а также вызовут интерес у рынка глобального.

В случае, если вы до сих пор не принимаете во внимание торжество национальных культур, для вас настает удачное время для развития отношений с ведущими брендами развивающихся рынков, что поможет привнести их колорит в ваш бизнес, а также в ваши продукты для клиентов. Однако, даже если вы уже работаете на каком-нибудь из этих рынков, не пропустите подборку трендов и не забывайте о том, что нужно всегда уважать местную культуру:

NE-TIGER: Мода класса люкс «Из Китая на глобальный рынок»
Первый китайский luxury-бренд NE-TIGER, известный за свой этнический дизайн на стыке Востока и Запада. В сентябре 2012 года основатель компании Zhang Zhifeng выступил с речью под заголовком «Китай всему миру» перед презентацией своей новой коллекции в Милане.

House of Masaba: Pop Art сари
Модный дизайнерский дом (стиль luxury) из Мумбаи Masaba Gupta’s House of Masaba переосмыслил традиционный индийский женский наряд сари и добавил в него эксцентричные, современные краски и мотивы, а также Pop Art принты – акция, направленная на привлечение молодых девушек-покупательниц, модниц. Выпущенная весной 2012 черно-белая коллекция сари была признана многими знаменитостями Индии, равно как и версия с принтами животных. Цены варьировались от 8 до 10 тысяч индийских рупий (примерно $150-200).

Studio Tsimáni: мексиканский стиль
В апреле 2012 Studio Tsimáni присоединилась к программе Destination Mexico initiative в магазине MoMA Design Store в Нью-Йорке. Студия черпает вдохновение в традиционной мексиканской культуре и создает современную мебель и прочую домашнюю утварь, которая воплощает стремление людей к самоидентификации в родной стране.

tvN: K-Pop Star Hunt
В июле 2012 был дан старт второму сезону шоу tvN’s K-Pop Star Hunt, цель которого – найти новую поп-звезду в Азии. Поиски проводятся в 8 азиатских странах, включая Южную Корею, Японию, Малайзию, Вьетнам и Таиланд. Корейская музыка сейчас, конечно, на пике популярности, особенно после триумфа хита ‘Gangnam Style’ от PSY на международной сцене.

Sulwhasoo: корейская косметика на американском рынке
В 2013 году ожидается взлет популярности корейской косметической продукции, о котором так давно говорят. Так, например, уже в октябре 2012 покупатели магазинов Neiman Marcus в Сан-Франциско заказывали продукцию корейского косметического бренда Sulwhasoo. Данная продукция выделяется своим особенным дизайном упаковки, которая напоминает керамическое изделие, а также свойствами продукта, разработанного на основе корейских лечебных трав, включая женьшень и корень белого пиона.

Что отметили для себя? Какое направление, на ваш взгляд, наиболее перспективное?

Продолжение следует…

ссылка на оригинал статьи http://habrahabr.ru/company/startupacademy/blog/162337/

Валидация форм в AngularJS

Валидация — одна из автомагических возможностей AngularJS. Хотя магического здесь, конечно же, ничего нет. Просто такие стандартные теги html как form, input, select, textarea — это тоже директивы. И когда они объединяются с ngModel, required, ngPattern и т.п., начинает работать валидация.

ngModel

Директива, без которой валидация не заработает. Эта директива ответственна за:

  • two-way binding между моделью и представлением (необходимо для элементов управления/директив input, textarea, select и т.п.);
  • предоставляет интерфейс для валидации: $render(), $setValidity(), $setViewValue(), $parsers, $formatters и т.п. (необходимо для директив/валидаторов required, number, email, url, ngPattern и т.п.);
  • сохранение состояния элемента управления (valid/invalid, dirty/pristine, ошибки валидации);
  • установка соответствующих классов для элементов (ng-valid, ng-invalid, ng-dirty, ng-pristine);
  • регистрация элемента управления для родительской формы.

Практически все эти ответственности реализуются через NgModelController.

Простейший пример валидации email (демо).

    <input type="email" ng-model="myEmail"> 

Формы

Состояние формы зависит от всех зарегистрированных для нее элементов управления и вложенных форм. Форма будет валидна, если валидны все включенные в нее элементы управления и формы. Можно создавать иерархии форм с помощью директивы ngForm для более удобной обработки состояния отдельных частей одной большой формы. Если для формы задано имя с помощью атрибута name, то контроллер этой формы будет опубликован в соответствующей области видимости с этим именем. Примеры использования свойств формы и ее именованных элементов управления (демо):

  • myForm.myInput.$valid
  • myForm.myInput.$error
  • myForm.$invalid
  • myForm.$error.required

Информация о валидации и ошибках отражается также в классах форм и элементов управления. Например: ng-invalid-required, ng-dirty, ng-valid, ng-valid-email.

Создание директивы-валидатора

При создании директивы-валидатора необходимо реализовать обработчики для двух случаев:

  • изменение модели — конвеерно будут вызваны все функции из массива $formatters;
  • изменение представления — конвеерно будут вызваны все функции из массива $parsers. При реализации собственных директив с поддержкой валидации к вызову этих функций приведет вызов метода $setViewValue.

Пример валидатора, проверяющего параметры пароля — не менее 6 символов, как минимум, 1 цифра и, как минимум, один нецифровой символ (демо):

    mod.directive('strongPassRequired', function () {         var isValid = function(s) {             return s && s.length > 5 && /\D/.test(s) && /\d/.test(s);         };          return {             require:'ngModel',             link:function (scope, elm, attrs, ngModelCtrl) {                  ngModelCtrl.$parsers.unshift(function (viewValue) {                     ngModelCtrl.$setValidity('strongPass', isValid(viewValue));                     return viewValue;                 });                  ngModelCtrl.$formatters.unshift(function (modelValue) {                     ngModelCtrl.$setValidity('strongPass', isValid(modelValue));                     return modelValue;                 });             }         };     }); 

В методе $setValidity первым параметром идет строка, которая будет использоваться:

  • как свойство объекта $error для элемента управления, к которому будет применен данный валидатор. Например, myPassForm.myPass.$error.strongPass;
  • как css класс (ng-valid-strong-pass или ng-invalid-strong-pass) для элемента управления, к которому будет применен данный валидатор, и всех его родительских форм.

Визуальная директива с поддержкой валидаторов

Для примера реализуем свой checkbox с иконкой из Font Awesome, для которого можно будет использовать, например, валидатор required (демо — для второго checkbox-а как раз применен валидатор required).
Исходный код директивы:

.directive('uiCheckbox', function () {     return {         restrict: 'EA',         replace: true,         transclude: true,         template:             '<div class="checkbox-control" ng-click="toggle()">' +                 '<span ng-class="{\'icon-check-empty\': !value, \'icon-check\': value}"></span>' +                 '<span class="checkbox-label" ng-transclude></span>' +             '</div>',         require: 'ngModel',         scope: true,         link: function (scope, element, attrs, ngModelCtrl) {             scope.value = false;              ngModelCtrl.$render = function () {                 scope.value = ngModelCtrl.$viewValue;             };              scope.toggle = function () {                 scope.value = !scope.value;                 ngModelCtrl.$setViewValue(scope.value);             };         }     }; }); 

Ключевыми моментами здесь являются:

  • требование, чтобы в функцию link был передан ngModelControllerrequire: 'ngModel';
  • реализация метода ngModelCtrl.$render — вызывается, когда происходит обновление модели, указываемой в ngModel;
  • при действиях пользователя, которые должны привести к изменению модели, необходимо вызвать ngModelCtrl.$setViewValue. В этом случае будут вызваны все функции из массива $parsers.

Валидация и директивы с изолированной областью видимости

Допустим у вас есть блок с несколькими элементами интерфейса, сообщений по результатам валидации и т.п. И вам необходимо использовать его на нескольких страницах. Например, блок задания пароля с подтверждением, проверками на качество пароля, идентичность и т.п. и вы хотите использовать этот блок повторно на страницах регистрации пользователя и редактирования профиля. Для подобного случая вполне можно создать директиву с изолированной областью видимости. И результаты валидации будут прекрасно передаваться для родительских форм, т.к. поиск родительских форм происходит на основе иерархии DOM, а не иерархии областей видимости (scope).

Изолированная форма

Допустим есть такая задача: есть форма создания некоторого объекта. Для его создания необходимо заполнить название и необязательно заполнять описание и список сайтов с ссылками. Кнопка «Создать объект» будет неактивна, пока форма создания будет невалидна. При этом для добавление нового сайта в список необходимо обязательно заполнить поля Название и Url. И пока они не будут заполнены кнопка должна быть неактивна. Таким образом, для наполнения списка сайтов будет использоваться своя вложенная форма. Но состояние ее валидности не должно влиять на родительскую форму.

Для подобной задачи у меня есть работоспособное, но не очень красивое решение. Возможно, оно кому-нибудь пригодится. Или кто-то предложит решение лучше. Демо.
Исходный код директивы:

mod.directive('isolatedForm', function(){     return {         require: 'form',         link: function(scope, formElement, attrs, formController) {             var parentFormCtrl = formElement.parent().controller('form');             var core$setValidity = formController.$setValidity;             formController.$setValidity = function(validationToken, isValid, control) {                 core$setValidity(validationToken, isValid, control);                 if (!isValid && parentFormCtrl) {                     parentFormCtrl.$setValidity(validationToken, true, formController);                 }             }         }     }; }); 

Основная идея — каждый раз, когда форма хочет сообщить наверх, что в ней что-то невалидно, вместо этого сообщать, что оно валидно.

ссылка на оригинал статьи http://habrahabr.ru/post/167793/

Библиотека morelinq: то, чего не хватает в LINQ to Objects из коробки

Я думаю многим читателям блога .Net знакомо имя John Skeet. Особенно после вчерашнего поста юзера SergeyT. Поэтому я не буду повторять про сравнение с Чаком Норрисом и первое место по карме на StackOverflow.com. А вот упомянуть лишний раз про его замечательную книгу “C# In Depth” точно лишним не будет. Центральное место в ней занимает LINQ вообще и LINQ to Objects в частности. Джон очень обстоятельно описывает все возможности языка C# и платформы .Net, которые сделали возможным появление LINQ в его нынешнем виде, а также подробности его реализации. Именно после прочтения этой книги я стал активно использовать LINQ to Objects в своих проектах. Однако в стандартной библиотеке не хватает нескольких крайне нужных операторов. К счастью, Джон Скит исправил это недоразумение. Так появилась небольшая, но очень полезная библиотка morelinq. А с конца прошлого года она доступна в виде NuGet-пакета.

Операторы библиотеки morelinq

Batch Превращает одну последовательность в несколько последовательностей по n элементов.
Concat Присоединяет элемент к коллекции либо коллекцию к элементу.
Consume «Поглощает» коллекцию, не производя никаких действий над элементами.
DistinctBy Возвращает только уникальные элементы (по заданному критерию).
EquiZip Создает новую последовательность, где каждый элемент создается на основе соответствующих элементов исходных последовательностей. Если последовательности имеют различное количество элементов, будет брошено исключение InvalidOperationException.
ExceptBy Возвращает элементы первой последовательности, которые не содержатся во второй (по заданному критерию).
ForEach Выполняет действие над каждым элементом последовательности.
Generate Генерирует последовательности по начальному элементу и функции-генератору.
GenerateByIndex Генерирует последовательность по индексам элементов.
GroupAdjacent Подобен GroupBy, но в группу попадают только идущие подряд элементы.
Index Возвращает последовательность пар индекс-значение.
MaxBy Возвращает максимальный элемент последовательности по заданному критерию.
MinBy Возвращает минимальный элемент последовательности по заданному критерию.
Pad Если количество элементов последовательности меньше заданного, дополняет последовательность значениями по умолчанию до заданного количества.
Pairwise Возвращает последовательность результатов функции текущего и предыдущего элемента (не применяется к первому элементу).
Pipe Возвращает исходную последовательность, выполняя Action над каждым элементом.
Prepend Дополняет начало коллекции заданным элементом.
PreScan Возвращает последовательность исходной длины, в которой N-й элемент определяется применением заданного преобразования к N-1 элементов.
Scan Возвращает последовательность исходной длины, в которой N-й элемент определяется применением заданного преобразования к N элементов.
SingleOrFallback Возвращает единственный элемент последовательности либо результат заданного делегата, если последовательность пуста.
SkipUntil Пропускает элементы исходной последовательности, пока заданное условие не станет истинным. Текущий элемент будет последним пропущенным.
Split Разделяет последовательность заданным разделителем (возвращает последовательность последовательностей).
TakeEvery Возвращает каждый N-й элемент исходной последовательности.
TakeLast Возвращает последние N элементов исходной последовательности.
TakeUntil Возвращает элементы исходной последовательности, пока заданное условие не станет истинным. Текущий элемент будет последним возвращенным.
ToDataTable Позволяет преобразовать последовательность в новую DataTable или заполнить имеющуюся. Есть возможность задать лямдами получение из исходного элемента значений для полей таблицы.
ToDelimitedString Преобразует последовательность в строку с разделителями (то что обычно приходится делать через нудный Aggregate).
ToHashSet Возвращает HashSet〈T&кang; от исходных элементов.
Zip То же, что EquiZip, но длина результирующей последовательности будет равна длине наименьшей из исходных.
ZipLongest То же, что EquiZip, но длина результирующей последовательности будет равна длине наибольшей из исходных (в качестве недостающих значений будет использовано значение по умолчанию).

Большинство операторов перегружены для большей гибкости использования (например, можно задать свой IComparer и т.п.). Кроме перечисленных операторов, имеются еще два отладочных – AssertCount (проверяют количество элементов последовательности) и Trace (выводит все элементы в debug-консоль).

Вместе с исходниками библиотеки идет прекрасная документация в стиле MSDN, в которой подробно описаны все операторы, их параметры и имеются примеры использования. Также есть комментарии в исходном коде.

В заключение хочу обратить внимание читателей на две другие библиотеки авторства Джона Скита – MiscUtils и NodaTime (NuGet Package). Особенно интересна последняя – библиотека предназначена для работы с датой/временем. Джон занимался ей последние несколько лет и в ноябре прошлого года наконец выпустил версию 1.0. В его блоге можно почитать много интересного на тему того, чем плохи для этих целей стандартные классы .Net и какие подводные грабли поджидают разработчика, серьезно работающего со временем.

ссылка на оригинал статьи http://habrahabr.ru/post/167831/

Google запатентовала смартфон с 8-ю вспышками

На днях — 29 января 2013 года, google получила патент, заявку на который подала еще в сентябре прошлого года, в которой описывается смартфон, оборудованный сразу восемью(уж простите если правильно «восьмью») вспышками, расположенными вокруг линзы фотомодуля. Вспышки могут срабатывать синхронно, а также отдельно друг от друга в зависимости от степени освещенности.
Так что вероятно следующий nexus будет обладать этой несколько необычной вспышкой.

Светодиодная вспышка как известно хуже ксеноновой, но возможно несколько светодиодов наконец-то смогут дать достаточно освещения для того чтоб достичь ксенон качества. При меньшем энергопотреблении и меньшей толщине.

Так что же делать с несколькими вспышками?

Первое что приходит в голову это использовать их вместе одновременно, обеспечивая хорошее свечение, и меньшую тень.

Также можно использовать выборочное количество вспышек, основываясь на текущей освещенности, для того чтоб не переборщить, ведь много света тоже плохо.

И в HDR это найдет применение, сделав несколько снимков подряд с разным количеством задействованных светодиодов, а потом их все объединив в одно фото хорошего качества.

Ну и если проявить фантазию то можно что-то с обработкой тени от каждой вспышки придумать и потом анализируя каждый снимок получить приблизительный объем объекта например.

ссылка на оригинал статьи http://habrahabr.ru/post/167835/