-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

[Из песочницы] Искусство создания диаграмм процессов

Среда, 20 Сентября 2017 г. 18:43 + в цитатник
Shortki вчера в 18:43 Управление

Искусство создания диаграмм процессов

Когда хочешь быстро объяснить суть какого-то процесса, то обычно рисуешь на листке бумаги несколько прямоугольников с текстом и проводишь между ними связи. Этому нехитрому принципу следуют большинство методологий описания бизнес-процессов, технологических процессов и любой другой человеческой деятельности. Можно принять как данность, что подобные схемы очень важны в современной парадигме накопления знаний.

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

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

image

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

Итак, сначала договоримся об основном предмете статьи — диаграммах процессов (далее для лаконичности иногда просто диаграммы). Как правило, диаграмма процессов представляет собою набор графических объектов, поименованных текстом, которые связаны между собою стрелками. Объекты обозначают процессы, ресурсы, состояния и т. д. Стрелки же обозначают порядок перехода управления от одного объекта к другому. Следует отличать диаграммы процессов от внешне очень похожих структурных диаграмм, диаграммы процессов предполагают динамику, в то время когда структурные диаграммы носят статичный характер, описывая конструктивные взаимосвязи объектов, обычно это описание организационных иерархий, структур данных или “карты разума”.

Существует много нотаций описания диаграмм процессов, это IDEF0, BPMN, UML, EPC, CMMN и другие. Данная статья в равной степени относится к ним всем, в примерах использована нотация собственного приложения.

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

Так как именно динамика является основной отличительной чертой рассматриваемых нами диаграмм, то, следовательно, ключевой частью такой диаграммы является её сценарий. Основные требования к сценарию — это непротиворечивость и непрерывность. Противоречия возникают при неверном порядке причин и следствий, а также в ситуации, когда один объект должен быть одновременно в разных местах (или два совмещаться в одном и том же месте). Непрерывность теряется, когда следствия не обусловлены причинами либо когда утерян существенный фрагмент повествования.

Вот здесь нужно осветить один важный момент касательно сценария и диаграммы в целом. Цель создания диаграммы не только в описании конкретного процесса, но и в передаче этого знания адресату. То есть на сюжет диаграммы влияет как описываемый ею процесс, так и её аудитория. К примеру, если вам нужно разъяснить пункт ПДД детям, вы воспользуетесь иной методикой изложения, нежели та, что использована в официально установленных правилах. Как правило, если сюжет не адаптирован к аудитории, то теряется его непрерывность, поскольку отдельные причинно-следственные связи неочевидны или непонятны адресатам.

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

Шаг 1. Разместите свои цели как ресурсы в правом нижнем углу диаграммы.
Обычно процессы, которые имеет смысл описывать, имеют чётко выраженную конечную цель или группу целей. Такой целью может также служить состояние, после которого дальнейшее исполнение процесса не имеет смысла. Как правило, процессы создаются под конкретные цели, и зачастую очевидно, что написать в правом нижнем углу диаграммы. Однако иногда бывает дальновидным указать не только положительную цель, но перечислить состояния, в которых исполнение процесса прерывается, но исходная цель не достигнута или достигнута не полностью. Рекомендуется явно перечислять подобные негативные цели в случаях, если вероятность достижения основной цели ниже 60%.

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

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

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

Шаг 4. Перед целями, имеющимися на диаграмме, разместите процессы, которые приводят к достижению данных целей, и соедините новые процессы с их целями.
Заметьте, что пока на нашей диаграмме процессов не было ни одного процесса, это неслучайно. Специфика нашего мышления такова, что, начиная что-то делать, мы больше концентрируемся на процессах, немного забывая, что суть нашей деятельности в целях. Диаграммы процессов, состоящие из одних только процессов, — частое явление, однако следует помнить, что мы стремимся к непрерывности и ясности изложения, а зачастую указание целей исполнения процесса говорит о нём больше, нежели название процесса и его описание. Старайтесь всегда явно указывать цели процесса, на практике это означает, что стрелка от одного процесса к другому — это редкое явление, обычно между процессами располагается промежуточный ресурс, являющийся результатом исполнения одного процесса и исходным ресурсом для другого. В некоторых формализмах (например DFD) сама стрелка может являться описанием ресурса. Однако если такой промежуточный ресурс очевиден, то ради упрощения схемы его можно опустить и провести стрелку от одного процесса к другому. Например, если в прачечной после процесса “Сушка” следует процесс “Глаженье”, то в некоторых случаях промежуточный ресурс “Сухое бельё” можно пропустить.

Шаг 5. Проведите связи от имеющихся на диаграмме ресурсов к использующим их процессам; если необходимого для процесса ресурса нет на диаграмме, добавьте новую цель, вернувшись к Шагу 3 ^.
Очевидно, что если требуемого процессом ресурса нет, то это приводит к противоречию в исполнении задачи, так как соблюдены не все причины для желаемых следствий.  Следовательно, необходимо исполнить критерий полноты — всё необходимое для исполнения каждого процесса должно быть в наличии. Впрочем, не всегда оправдано явно указывать очевидные ресурсы, например, при обработке детали станком одним из очевидных ресурсов является электроэнергия, явное выделение этого ресурса, скорее всего, не сделает диаграмму понятнее, однако без значимых причин усложнит её. Помните о своей аудитории: часть диаграммы зритель всегда достраивает мысленно, это неизбежно. Старайтесь, чтобы мнимая часть диаграммы касалась очевидных всем моментов, более того, слишком явные вещи, выписанные на диаграмме, могут утомлять и даже раздражать.

Шаг 6. Проведите связи между процессами, исполнение которых зависит друг от друга.
Попарно проверьте все процессы, размещённые на диаграмме, нет ли между ними неявных зависимостей или взаимного влияния. Например, часто полезно “грязные” процессы группировать вместе, чтобы экономить на очистке рабочей области. Также если два процесса конкурентно используют ограниченный ресурс, то их следует развести во времени, проложив связь от одного из них к другому.  Заметьте, что ресурсы, которые мы не отображаем на диаграмме, тоже могут быть причиной скрытых зависимостей, к примеру, когда два процесса используют энергоёмкие станки, которые не следует включать одновременно.

Шаг 7. Убедитесь, что диаграмма легко читается и содержит не более 20 объектов; если это не так, сгруппируйте несколько контекстно связанных объектов в один объект подходящего типа с вложенной диаграммой, содержащей данную группу.
Практика показывает, что когда диаграмма содержит более 20 объектов (ресурсов или процессов), то схема перестаёт восприниматься цельно, а начинает выглядеть, как лабиринт, в котором зрителю нужно выискивать интересующие его пути. С другой стороны, редко какой проект или бизнес-процесс уложится в такое небольшое число объектов. К счастью, то, что не вместит одна диаграмма, поместится на нескольких, не стремитесь всё изложить сразу, помните: всегда можно сделать ещё одну диаграмму. 

Итак, если схема получилась громоздкой, выделите группу объектов, по возможности слабо связанных с другой частью диаграммы, и замените их одним процессом. Удалённые объекты станут основой новой диаграммы, которая будет пояснять суть нового процесса. 

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

Другим важным аспектом детализации диаграмм является возможность развести аудитории: как правило, диаграммы верхнего уровня интересны менеджерам, а вложенные диаграммы больше полезны техническим специалистам. Разбив диаграмму на уровни, мы можем каждую новую диаграмму проектировать с учётом её аудитории, формируя сюжет, понятный и увлекательный именно для неё.

Шаг 8. Убедитесь, что объекты имеют тип, соответствующий их сути, визуально разделите информационные и физические потоки. Если диаграмма содержит несколько контекстно связанных объектов, выделите их с помощью группы. В местах, требующих пояснений, разместите объекты типа комментарий.
В зависимости от выбранной нотации описания процессов нам будут доступны различные типы графических объектов, описывающих специфические аспекты задач, внимательно изучите перечень доступных объектов и используйте наиболее подходящее описание для каждой из задач. Иногда нотация позволяет отдельно выделить область на диаграмме, внутри которой можно расположить задачи, связанные каким-то общим признаком: исполнителем, местом исполнения и т. д.

Часто такие области оформляются как горизонтальные дорожки, после чего диаграмма выглядит, как бассейн, в котором каждый исполнитель плывёт по своей дорожке вдоль своих задач. Такая организация диаграммы довольно наглядна, но может иметь свои композиционные недостатки.

Шаг 9. Для процессов, не являющихся элементарными операциями, постройте вложенную диаграмму, начиная с Шага 1.
На Шаге 7 мы синтетически создавали новую задачу из группы объектов и детализировали её вложенной диаграммой. На этом шаге делается то же самое, но аналитически: мы пытаемся сложный объект разложить на более простые процессы и отобразить их во вложенной диаграмме. В управлении проектами этот процесс называют структурной декомпозицией работ. Разбивая задачи на более мелкие или объединяя их в более крупные, следует следить, чтобы задачи одного уровня, отображаемые в одной диаграмме, были приблизительно равны по значимости и трудоёмкости.

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

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

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

Ниже приложена диаграмма пошагового процесса, изложенного в статье, потратьте несколько минут на её изучение.
image
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338356/


Метки:  

В App Store появилась категория «Инди». Но речь не об этом

Среда, 20 Сентября 2017 г. 18:28 + в цитатник
Dreasj сегодня в 18:28 Маркетинг

В App Store появилась категория «Инди». Но речь не об этом

    Эта статья — привет из прошлого. Все, о чем в ней рассказывается, было актуально лишь в один-единственный день, 20 сентября 2017 года, когда в App Store появилась категория «Инди», а также «Игры с AR», «Дети», «Викторины» (вместо «Любопытные мелочи» — наконец-то адекватный перевд!) и «Обучающие» (вместо «Образование»). В первый день на первом месте в американском сторе в ней оказалась Indie Shuffle — New songs shared daily. Что-то не похоже на игру, скажете вы и будете правы. Это действительно было всего лишь приложение для тех, кто хочет, чтобы депрессивная музыка в стиле The National и Arcade Fire в их наушниках была вечной. Образцовый пример инди-игры, LIMBO, оказался всего лишь на четвертом месте.

    Таким образом, поиск по-прежнему не различает игры и прочие приложения — а жаль. Однако говорить мы будем не об этом, а о поисковой оптимизации для iOS11, а если точнее, о названиях категорий. А началось все с того, что в сообществе ASO-экспертов кто-то пустил слух, что выдача в iOS11 отныне включает названия категорий. Источником слухов послужило официальное заявление Apple.
    Apple Search Information

    ОК, но что из этого следует на практике? Практика, этот с трудом поддающийся заклинанию демон, ежедневно терзающий ASO-экспертов, до этого великого дня показывала примерно следующее. Названия категорий раньше, как минимум, входили в число ключевых слов, по которым индексируется приложение, хотя редко фигурировали в словосочетаниях. Если, например, поле ключевых слов вообще не заполнено для соответствующей страны, то игра будет проиндексирована только по названию и названию категории (например: my, talking, cthulhu, games, simulation, simulation games и т.д.) Правда, займет она по ним почетные 2700-е места, да и надеяться на хорошее место по cthulhu simulation не стоит.

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

    Реальность оказалась еще абсурднее.

    iOS 11


    Удивительно некрасивый баннер с названием категории просто-напросто оккупировал экранное место, вытеснив всех, кроме лидера в категории, в подвал, туда, куда еще скроллить и скроллить.

    По состоянию на 20 сентября эта реформа еще только начинается: баннера нет, если искать по словам adventure, arcade, card, casino, dice, family. Баннер есть в поиске по словам: board, role playing (а также role play, но не roleplay), simulation, sports, strategy, word.

    Как упоминалось выше, поиск не различает игры и прочие приложения, которые также «заслужили» не менее ужасные баннеры категорий. По слову music показывается общая категория приложений, а не игровая подкатегория. По слову educational показывается общая категория education. По слову word показывается реклама Word Connect и лидер выдачи — Microsoft Word.

    А вот еще кое-что интересное. В поиске по слову action баннер категории в выдаче отсутствует. Но зато вместо него сразу под рекламным объявлением красуется Story, в жанре The List, про игры-адреналиновые боевики (Adrenaline-pumping action games).
    image

    Знаете, какой самый адреналиновый боевик в App Store? Конечно же, Super Mario Run.

    По слову kids тоже сразу находится соответствующая Story — подборка лучших игр. По слову indie — подборка «лучших игр, в которые вы не играли», — The Best Games You've Never Played. По ar — целая история, практически лонгрид, о том, что такое дополненная реальность, и если вам очень нужен фичеринг — вперед, в AR, но помните: дедлайн был позавчера.

    Вероятно, скоро это нововведение станет нормой. Оно уже распространяется, как чума, и мы переживаем последние счастливые деньки, когда можно поискать в сторе puzzle и сразу же найти Candy Crush Saga. Но хватит смеяться, давайте начинать плакать. Главный вывод, который можно сделать из этого, — ASO-эксперты скоро могут оказаться никому не нужны, поскольку влияние поисковой оптимизации в iOS11 стало еще меньше. Если вам хочется поспорить — спорьте, но, только, пожалуйста, на конкретных примерах, а не на цитатах из тех самых ASO-экспертов, предчувствующих великое разоблачение.

    И наконец, срочный вопрос от наших читателей в реальном времени: как попасть в топ категории «Инди»? По состоянию на 20 сентября топа в категории инди как такового не было, но зато было несколько редакторских подборок вроде «Лучшие игры всех времен» (российский стор) или Our Favourites (американский стор). Редакторы Apple и раньше не раз высказывали свои симпатии к независимым разработчикам, так что большинство представленных здесь игр вы легко назовете сами, кроме разве что неожиданного попадания в российскую подборку «Поиграем!» «Assasin's Creed: Идентификация».

    К тому моменту в счастливом будущем, когда некоторые из вас прочитают эту статью, в iTunes Connect, вероятно, появится категория Indie. В нашем печальном прошлом ее пока что нет, как попасть в топ, мы не знаем и очень по этому поводу горюем. Так что, пожалуйста, как можно скорее напишите нам комментарий из будущего и скажите, что в iTunes Connect уже можно официально назваться достойным сыном Джонатана Блоу, племянником Рами Измаила или отцом Люка Винки.

    А пока этого не случилось, делайте все тоже, что вы делали раньше, чтобы получить фичеринг: например, напивайтесь на конференциях со всеми, кто теоретически может оказаться засланным казачком Apple. Говорят, что это действительно работает!
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338354/


    Метки:  

    [Из песочницы] Работа c Talend Open Studio на примере парсинга CSV файла

    Среда, 20 Сентября 2017 г. 17:35 + в цитатник
    railmisaka вчера в 17:35 Разработка

    Работа c Talend Open Studio на примере парсинга CSV файла

    Сбор данных из различных источников, преобразование с целью унифицирования либо удобства довольно распространенная задача. Конечно, в большинстве случаев можно обойтись собственным решением, но чтобы оно было гибким и легко расширяемым придется потратить немало времени. В таком случае разумным будет воспользоваться готовым решением. Talend Open Studio (TOS) одно из таких решений.

    Меня несколько удивило отсутствие статей про работу с TOS на Хабре. Возможно, тому есть причины, мне непонятные. Как бы то ни было, постараюсь восполнить этот пробел.

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

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

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

    Отдельное целостное преобразование данных в Talend называется задачей(job). Задача состоит из подзадач, которые, в свою очередь, состоят из компонент и связей. Компоненты непосредственно преобразуют данные либо занимаются вводом/выводом. Связи бывают нескольких типов. Основным средством обмена данными между компонентами являются связи типа “поток”(flow). Поток очень похож на таблицу в БД. У потока есть схема(названия, типы и атрибуты полей) и данные(значения полей). Как сами данные так и схема потока могут быть изменены в процессе обработки. Потоки в TOS не синхронизируются между собой. Они работают независимо друг от друга.

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

    Предположим у есть нас CSV файл вида:

    id,event_name,event_datetime,tag
    1,"Hello, world!",2017-01-10T18:00:00Z,
    2,"Event2",2017-01-10T19:00:00Z,tag1=q
    3,Event3,2017-01-10T20:00:00Z,
    4,"Hello, world!",2017-01-10T21:00:00Z,tag2=a
    5,Event2,2017-01-10T22:00:00Z,
    ...

    И мы хотим разделить данные по разным событиям(поле event).

    Перед началом работы с данными нам потребуется создать задачу. Процесс создания не описываю по причине его тривиальности.

    Итак, первое что нам надо сделать это прочитать и распарсить CSV. Для начала создадим запись метаданных для нашего входного CSV файла — это упростит дальнейшую работу (Metadata -> File delimited). Создание File delimited происходит более или менее интуитивно, поэтому подробное описание спрятано под спойлером.

    Единственное, что заслуживает упоминания, это расстановка кавычек, при подстановке значений в поля форм. Это относится не только к созданию File delimited но и к большинству других полей в формах. Дело в том, что большинство значений во всевозможных полях будут подставлены в Java код “как есть”, т.е. должны являться выражением Java определенного типа. Если мы задаем строковую константу ее придется написать в кавычках. Это дает нам дополнительную гибкость. Получается что везде, где требуется значение, можно подставить значение параметра или выражения.

    Создание File delimited


    Далее необходимо задать имя и выбрать файл. Выбираем наш CSV файл с входными данными.

    На следующем шаге необходимо настроить парсинг файла.



    Интересные поля:

    Разделитель полей — у нас запятая (comma).
    В секции “Escape Char Settings” нас интересует поле “Text Enclosure”. Зададим значение “\”” — т.е. “двойная кавычка”. Теперь весь текст внутри двойных кавычек будет интерпретироваться как единое целое, даже если внутри есть разделитель(запятая).
    В правой части можно настроить пропуск строк и ограничения. Нас это не интересует.
    Поставим галочку “Установить строку заголовка в качестве имен столбцов” т.к. у нас в первой строчке находятся имена столбцов. Эти значения станут именами полей.

    Кнопка “Refresh Preview” позволит обновить область предпросмотра. Убеждаемся, что все в порядке и идем дальше.

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



    Заголовки из CSV файла стали именами полей. Тип каждого поля определяется автоматически исходя из данных в файле. Здесь нас все устраивает, кроме формата даты. Дата в нашем файле выглядит примерно следующим образом 2017-01-10T22:00:00Z и для ее парсинга нужен шаблон «yyyy-MM-dd'T'HH:mm:ss'Z'». Обратите внимание на кавычки. Дело в том, что большинство значений во всевозможных полях будут подставлены в java код “как есть”, т.е. должны являться выражением Java определенного типа. Если мы задаем строковую константу ее придется написать в кавычках.

    Теперь у нас есть шаблон парсера CSV файлов заданного формата.

    Далее добавим компонент, который будет заниматься парсингом. Нужный нам компонент называется tFileInputDelimited.

    О добавлении компонентов
    Компоненты можно найти в меню компонентов (обычно справа) в разделе (tFileInputDelimited в разделе “Файл->Вход”) и перетащить в рабочую область, но можно поступить проще: кликнуть в любой точке рабочей области и начать набирать название компонента. Появится подсказка со списком компонент.



    О соединении компонентов
    Компонент можно выделить нажав на его иконку. При этом около иконки появится “язычок” “O” и в окне просмотра настроек компонента появится информация и текущем состоянии. “Язычок” “O” (output) это выходные данные. Потянув за него мы можем соединить компонент с другим компонентом.

    Далее, настроим наш парсер. Для компонента tFileInputDelimited в настройках установим “Property type” в значение “Repository” и выберем ранее созданный шаблон.

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

    Из этой ситуации есть два выхода. Первый — все время подменять файл из шаблона на нужный файл. Второй — развязать компонент парсера и шаблон. В этом случае настройки парсинга можно сохранить, но появляется возможность задать входной файл. Недостатки первого способа очевидны, к недостаткам второго относится отсутствие синхронизации между шаблоном и парсером. Если мы изменим шаблон то синхронизировать настройки парсера нужно будет вручную. Мы пойдем вторым путем и отвяжем парсер от шаблона. Для этого вернем значение “Build-In” в поле “Property type”. Настройки сохранились, но появилась возможность их менять.

    Изменим имя входного файла на выражение context.INPUT_CSV. Обратите внимание, имя было в кавычках (строковая константа), а наше выражение без кавычек. Оно является параметром контекста. Также нужно создать этот параметр на вкладке контекста. Для отладки можно задать значение по умолчанию. Параметры контекста можно задавать как параметры командной строки (примерно так --context_param INPUT_CSV=path). Это относится к запуску собранного пакета Java.

    Далее. Мы хотим разделить данные по именам событий.

    Для этого потребуется компонент tMap и несколько tFilterRow. Давайте пока ограничимся двумя tFilterRow т.е. будем выделять только два разных события. Соединим их как показано на рисунке:



    При соединении tMap и tFilterRow потребуется ввести имя для связи. Имя должно быть уникально. Далее нужно настроить компонент tMap. Для этого войдем в меню Map Editor либо дважды кликнув по иконке tMap, либо вызвав редактор из панели свойств компонента.

    В нашем случае нам нужно только “скопировать” поток, поэтому просто перетащим все поля входящих данных (слева) в каждый из потоков вывода (справа).



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

    Настройка фильтров tFilterRow не представляет из себя ничего особенного.

    О настройке tFilterRow
    Добавляем входную колонку, выбираем тип условия и вводим значение. Мы установим фильтры на поле event_name. Один фильтр будет проверять на равенство (==) «Hello, world!» (в кавычках), а второй «Event2».

    Параметр “Функция” в настройках компонента задает преобразование входных данных и задает функцию преобразования F. Тогда условия отбора будет: F(input_column) {comparator} value. У нас нет функции F,{comparator} это равенство, а value это «Hello, world!». Получаем в нашем случае input_column == «Hello, world!».

    Добавим после фильтров пару tLogRow, запустим и увидим что данные делятся. Единственно, лучше установить Mode для tLogRow в что-то отличное от “Основной”, иначе данные перемешаются.

    Вместо tLogRow можно добавить какой угодно другой компонент вывода данных, например tFileOutputDelimited для записи в CSV файл, или компонент базы данных для записи в таблицу.

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



    Компонент Connection задает параметры доступа к базе и устанавливает соединение. Компонент Close отключается от базы. В среднем блоке, где на рисунке находится единственный компонент Commit, можно использовать базу данных не устанавливая новых соединений. Для этого в настройках компонентов нужно выбрать опцию “Использовать существующее соединение” и выбрать нужный компонент Connection.

    Здесь также используется еще один механизм TOS — подзадачи (subjob). Путем создания подзадач можно добиться, чтобы некоторые части задачи завершались прежде, чем начнутся другие. В данной примере компонент Commit не начнет работу пока не установится соединение. Между подзадачами проводится связь OnSubjobOk (в контекстном меню компонента доступен пункт Trigger, внутри которого есть эта связь). Существуют и другие связи, например, ObSubjobError для обработки ошибок.

    Вернемся к нашему примеру с CSV файлом.

    Поле tag у нас не очень подходит для записи в базу данных — tag2=a. Наверняка мы захотим разделить пару ключ-значение по разным полям в базе. Это можно сделать разными способами, но мы сделаем это при помощи компонента tJavaFlex. tJavaFlex это компонент, поведение которого можно описать на языке Java. В его настройках присутствуют три секции — первая выполняется до начала обработки данных (инициализация), вторая занимается обработкой данных и третья выполняется после обработки всех данных. Также, как и у остальных компонент есть редактор схемы. Удалим из схемы данных на выходе поле tag и добавить пару новых — tag_name и tag_value (типа String).



    Далее, в средней секции компонента напишем
    row4.tag_name = "";
    row4.tag_value = "";
    
    if(row2.tag.contains("="))
    {
    String[] parts = row2.tag.split("=");
    row4.tag_name = parts[0];
    row4.tag_value = parts[1];
    }
    

    Код тривиальный, и, пожалуй единственной что стоит пояснить, это конструкции вида row4.tag_value. tag_value это имя поля, созданного нами. Таким же образом можно обращаться к другим полям. row4 это имя исходящего потока (row2 входящего). Их можно поменять.



    Таким образом, теги будут разделены на два поля. Однако нужно убедиться, что в настройках tJavaFlex стоит галочка “Авто-распространение данных”, иначе все остальные данные исчезнут. По сути мы просто дописали дополнительное преобразование. Прочие поля совпадают по названию и будут скопированы автоматически.

    Далее я расскажу о двух чуть более сложных и конкретных вещах.

    Предположим, что мы все же хотим сложить наши данные в базу данных. Соответственно, у нас есть табличка Event с полями: имя события, идентификатор события, дата события и ссылка на запись в таблице тегов. В таблице тегов два поля — ключ и значение. Мы хотим добавлять нашу пару ключ-значение в таблицу тегов только в том случае, если ее там нет. И хотим также добавлять связь между таблицами тегов и событий.
    Т.е. мы хотим:

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

    Для того чтобы добавить запись только в том случае если ее нет в Postgres можно использовать конструкцию вида
    INSERT
    WHERE NOT EXISTS
    Сделать это можно при помощи компонента tPostgresqlRow. Это компонент позволяет выполнить произвольный SQL запрос. Но нам придется подставить в наш запрос реальные данные. Это можно сделать, например, так

    String.format("
    INSERT INTO tag(tag_name, tag_value)
    	SELECT '%s', '%s'
    	WHERE NOT EXISTS
    	(SELECT * FROM tag
    	WHERE tag_name = '%s'
    	AND tag_value = '%s');",
    input_row.tag_name, input_row.tag_value,
    input_row.tag_name, input_row.tag_value)
    

    Да, параметры перечисляются два раза одни и те же (возможно я слишком плохо знаю Java). Обратите внимание, что точка с запятой в конце кода на Java не нужна.

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

    String.format("
    WITH T1 AS (
    	SELECT * 
    	FROM tag
    	WHERE tag_name = '%s'
    	AND tag_value = '%s'
    ), T2 AS (
    	INSERT INTO tag(tag_name, tag_value)
    	SELECT '%s', '%s'
    	WHERE NOT EXISTS (SELECT * FROM T1)
    	RETURNING tag_id
    )
    SELECT tag_id FROM T1
    UNION ALL
    SELECT tag_id FROM T2;",
    input_row.tag_name, input_row.tag_value,
    input_row.tag_name, input_row.tag_value)
    

    Как получить значение из запроса
    В случае если запрос должен возвращать значения в компоненте tPostgresqlRow нужно включить опцию “Propagate QUERY’s recordset” (на вкладке “Advanced settings”), а также в исходящем потоке нам потребуется поле типа Object, которое нужно указать как поле для распространения данных. Чтобы извлечь данные из recordset нам потребуется компонент tParseRecordSet. В настройках в поле “Prev. Comp. Column list” нужно выбрать наше поле, через которое распространяются данные. Далее в таблице атрибутов для полей прописать имена полей, возвращенных запросом.
    Должно получиться примерно следующее:



    Т.е. все наши поля автоматически будут установлены в нужные значения, а новое поле dbtag_id типа int будет взят из результатов запроса по ключу “tag_id”. Сложить все в таблицу event можно при помощи того же tPostgresqlRow или tProstgresqlOutput.

    В итоге получится примерно следующая схема:




    Отдельного рассмотрения заслуживает случай, когда у нас возникает необходимость в создании замкнутой структуры. TOS не позволяет делать замкнутых структур, даже если они не являются циклическими. Дело в том, что потоки данных живут каждый сами по себе, не синхронизируются, и могут нести разное количество записей. Наверняка, почти всегда можно обойтись без образования замкнутых контуров. Для этого придется не делить потоки и делать все в одном. Но если очень хочется, то при желании можно обойти ограничение на создание замкнутых структур. Нам потребуется компоненты tHashInput и tHashOutput.

    Как найти tHashInput и tHashOutput
    По умолчанию они не отображаются в панели компонент и их придется сначала добавить туда. Для этого нужно перейти в меню Файл -> Edit project properties -> Дизайнер -> Palette Settings далее в закладке технические найти наши компоненты и добавить в рабочий набор.

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

    Добавляем компонент tHashOutput и входящий поток, который хотим сохранить. Компоненту можно настроить на самостоятельную работу, либо на дописывание данных в другой tHashOutput компонент. В этом случае компонент будет работать подобно union из sql, т.е. данные будут записываться в один общий поток.Придется создать новую подзадачу, в которой будет осуществляться слияние. Не забудьте добавить связь OnSubjobOk.

    Для каждого потока, работающего индивидуально, нужно создать компоненту tHashInput. У этой компоненты есть недостаток — даже после указания компоненты tHashOutput, из которой будут браться данные, схема не подгрузится автоматически. Далее все tHashInput нужно объединить при помощи tMap. Только один поток будет помечен как Main, по нему будут синхронизироваться остальные входящие потоки, а также исходящий, остальные входящие потоки будут Lookup. Кроме того нам надо задать связь между потоками, иначе мы получим Cross Join.



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

    На этом все, спасибо всем кто дочитал до конца.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338352/


    Метки:  

    Как я создавал прибыльный глобальный SaaS проект, от разработки до продаж

    Среда, 20 Сентября 2017 г. 17:23 + в цитатник
    mskvsk сегодня в 17:23 Разработка

    Как я создавал прибыльный глобальный SaaS проект, от разработки до продаж

    • Tutorial
    Некоторые люди здесь знают меня как основателя двух прибыльных SaaS проектов и автора популярных статей о них (статья про Postio, статья про Menumake). В этом тьюториале я расскажу о том как я, обыкновенный разработчик, в одиночку создавал свой первый глобальный проект и что из этого получилось (TL;DR: хеппи-энд и первые продажи). Ну и заодно пробежимся по всем проблемным вопросам, начиная о том как найти неконкурентную и гарантированно прибыльную идею (оставим создание следующего Гугла более амбициозным и умным людям), и заканчивая тем, как принимать платежи глобально, находясь при этом в России. Летс гоу.

    Ищем идею


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

    Consider the following:
    1. Go to Fiverr
    2. Research the most popular gigs
    3. Read their reviews from customers
    4. Automatizing them.

    — Alex Moskovski (@mskvsk) July 12, 2017

    … то я буду пользоваться старым добрым Файвером. Есть еще одно пожелание: я люблю работать с социальными сетями и изображениями, поэтому первое куда мы пойдем — соответствующий раздел этой популярной фриланс-платформы.

    image

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

    Немного отступлю от темы и скажу, что несмотря на то, что в Рунете идея подобного проекта вызвала бы смех, то на Западе, где авторское право — не пустой звук, все гораздо более интересно. Цитаты там — это доступный и популярный формат, который используют небольшие (а иногда и крупные) компании, которые не могут позволить себе более дорогой тип контента. Поэтому такая популярность услуг по созданию уникальных картинок-цитат — не случайность.

    Итак, у нас есть фаворит; теперь давайте оценим сколько на этом можно заработать. Я не буду проводить полный анализ, поэтому ограничимся следующим: зайдем в профиль самого крупного специалиста по цитатам на Файвере и разделим общее число его заказов на время, которое он провел на платформе.



    Средний чек в этой нише — $15, его можно предположить, взяв за основу средний тарифный план этого парня.



    Число его заказов мы можем оценить приблизительно, взяв число отзывов оставленных его клиентами (6688 на момент написания статьи); разумеется отзывов намного меньше, чем заказов, поскольку не все клиенты оставляют отзыв. Время, в месяцах, проведенное на платформе можно получить из даты его регистрации (тоже приблизительно, он мог начать работать не сразу). Итого получается такая математика:

    6688 заказов / 36 месяцев x $15 = $2786

    $2786 в месяц — не самая сказочная цифра, согласен. Но для того, чтобы понять потенциальный доход в этой нише, давайте вспомним, что:

    • Мы оценили доход этого парня в сильно меньшую сторону, потому что взяли отзывы вместо числа заказов и время действия аккаунта, а не время его реальной работы;
    • Это всего лишь один человек из многих
    • Это всего лишь Файвер, одна платформа из многих
    • Наверняка нам удастся придумать что-то еще, что может увеличить средний чек (спойлер: удастся)

    Меня устраивают эти выкладки и эти цифры, поэтому сформулируем миссию проекта: массово и автоматически создавать уникальный контент в виде картинок-цитат под социальные сети с логотипом клиента.

    Массово — потому что клиентам удобно сразу получить пак картинок и закинуть их в постилку. Уникальный — потому что неуникального и так завались, а соцсети любят уникальность. С логотипом — потому что клиенты верят, что те, кто смотрят на цитату запомнят их брендинг. Картинок-цитат — потому что этот формат эффективен и дешев в изготовлении.

    Теперь за дело.

    Создаем минимальный прототип


    Поскольку мы будем создавать картинки-цитаты, нам потребуются следующие ингридиенты:

    1. Сами тексты цитат
    2. Изображения, незащищенные авторским правом
    3. Красивые шрифты
    4. Алгоритм, который смешает все это смузи вместе.

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

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

    function autoWrap($text, $maxWidth, $maxHeight, $lineMargin, $fontName) {
      $image = new Imagick();
      $draw = new ImagickDraw();
    
      $startFontSize = round($this->height / 4);
      $fontSize = $startFontSize;
    
      $draw->setFont($fontName);
    
      $lineWidth = 10;
      $custom = false;
      
      $text = preg_replace('/\s+/', ' ', $text);
      
      while (true) {
        $draw->setFontSize($fontSize);
    
        $fit = false;
    
        while (true) {
          if ($custom == false) {
            $lines = explode("\n", wordwrap($text, $lineWidth, "\n", false));
          }
    
          $longestLine = 0;
          $longestLineIndex = 0;
    
          // Search for the longest line for the current font size
          foreach ($lines as $i => $line) {
            $fontMetrics = $image->QueryFontMetrics($draw, $line);
    
            if ($fontMetrics['textWidth'] > $longestLine) {
              $longestLine = $fontMetrics['textWidth'];
              $longestLineIndex = $i;
    
              /*
              if the longest line is longer than the width then get out
              of the outer loop without $fit = true
              */
              if ($longestLine > $maxWidth) {
                break 2;
              }
            }
          }
    
          $fit = true;
          $resultLines = $lines;
          $resultLineHeight = $fontMetrics['textHeight'];
    
          if (count($lines) == 1) {
            break;
          }
    
          $lineWidth++;
        }
    
    
        if ($fit) {
          $totalHeight = count($resultLines) * ($resultLineHeight + $lineMargin) - $lineMargin;
    
          if ($totalHeight <= $maxHeight) {
            break;
          }
        }
        $fontSize--;
      }
    
      return array($resultLines, $fontSize);
    }
    

    К концу второй недели разработки мой генератор мог создавать вот такие изображения:



    Смотрится симпатично. Пока я игрался с генератором родилась идея делать анимированные гифки и видео с цитатами — достаточно просто генерировать последовательность кадров, а потом собирать ее в конечный файл. Для сборки в GIF использовался все тот же ImageMagick. Для создания MP4 я cначала создавал GIF, но потом перегонял его в видеофайл с помощью FFmpeg.

    Все это дало возможность делать вот такой контент:







    Почему бы не продавать его по удвоенной цене, увеличив таким образом средний чек?

    Окей, все это здорово, но это еще не продукт. Чтобы сделать все это готовым продуктом, нам потребуется выполнить следующие пункты.

    Сайт


    Для этого проекта я выбрал фреймворк Laravel и, несмотря на некоторые трудности…

    My activity the last two weeks. pic.twitter.com/KuW7xT3mA4

    — Alex Moskovski (@mskvsk) April 19, 2017

    … в конце-концов он сильно облегчил разработку. Да, были некоторые неприятные моменты, типа отсутствия нативной директории для функций-хелперов (по аналогии с Codeigniter) и сам фреймворк походил на сшитое из разных частей лоскутное одеяло, но свою функцию он выполняет на отлично.

    Наверное, самая главная часть в сайте — это инструмент создания заказов. Он получился таким:



    Прием платежей


    Чтобы быть бизнесом, нам нужно как-то принимать платежи. Если бы мы продавали в России, я бы использовал решения типа Яндекс.Кассы или Робокассы. Если бы я был инкорпорирован в стране первого мира, я бы использовал Stripe или Braintree. Но в этот раз, я сорвал джекпот проблем из-за необходимости принимать платежи глобально (основные клиенты нашего с вами сервиса находятся в США), будучи инкорпорированным в России.

    Единственной надежной системой, которую мне удалось найти, оказался Paypal. Они позволяют принимать платежи почти по всему миру, а потом выводить их на счет ООО или даже ИП, удерживая какие-то крохи комиссии. Все это, вместе с клевым российским налогом в 6%, удержало меня от желания инкорпорироваться в Делавере, Гонконге или Сингапуре в этот раз.

    Процесс подключения к палке прост:

    1. Создаете корпоративный аккаунт у них
    2. Загружаете документы о своей компании
    3. Ждете пару недель, отвечая на их письма с разными запросами
    4. Интегрируетесь технически — это заняло у меня ровно один день.



    Все, теперь вам могут платить со всего мира.

    Массовая генерация изображений


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

    Сама генерация была организована через встроенный в Laravel механизм очередей и воркеров. Одна очередь отвечала за поштучную генерацию изображений для заказа, а вторая — за их сборку в единый архив. Кстати, когда клиент заказывал пак изображений, ему автоматически в архив добавлялось и 10 видео — так я давал попробовать новый формат и немного радовал клиента неожиданным подарком.

    База изображений и цитат


    Тут все просто. Я зашел на Upwork, нанял там индуса, который собрал 500 мотивационных цитат, и 500 подходящих картинок с дорогами, энергичными людьми и живописными видами. Далее, запустив генератор, создал тысячи готовых картинок, где случайная цитата соединялась со случайной картинкой, и удалил неподходящие изображения — те, которые не на 100% соответствовали всем цитатам. Все.

    Лендинг


    Не буду пытаться изложить здесь принципы создания хорошей главной страницы (на эту тему написаны книги размером с трактаты Лао-Цзы), просто оставлю свой твит с быстрым чек-листом:

    A perfect landing page check list:
    Quick explanation
    Demo
    Major advantages
    Pricing
    Testimonials
     Call-To-Action

    — Alex Moskovski (@mskvsk) September 5, 2017

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

    Статистика и логи


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

    Начать можно с небольшой таблицы, например, для нашего с вами проекта она может быть такой:



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

    The fastest way to implement at least some stats in your app (and you should ALWAYS collect as much data as you can) is scattering GA events pic.twitter.com/vmQogPN7Rb

    — Alex Moskovski (@mskvsk) August 25, 2017

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

    Сервер


    Я ни разу не админ, поэтому, чтобы не париться с распараллеливанием генерации (ведь генерация изображений и тем более видео — затратный процесс), я решил просто арендовать мощный сервер у Hetzner и доверить деплой Laravel Forge. Оба продукта справились со своей задачей на пятерку.



    На саму разработку я потратил примерно пару месяцев. Теперь давайте смотреть куда нас приведут продажи.

    Запуск


    Нет места прекраснее для запуска проектов, чем ProductHunt. Раньше, я искал человека с прокачанным аккаунтом, чтобы он или она опубликовали мой продукт. В этот раз, я забил на все это и просто захантил проект самостоятельно, доверившись их инструкции и собственной лени.



    Сообщество PH отреагировало на проект очень положительно, и помимо классных отзывов и идей, принесло мне несколько продаж, две из США, одну из Великобритании:



    Несмотря на то, что QuoteArtist (так я окрестил сервис) занял какое-то там 25-е место, он пробился на главную страницу платформы, что дало достаточно трафика:



    Кстати, что особенно важно и круто — один из клиентов заказал не простые картинки, а их видео-варианты (помните, красивые гифки чуть выше?). Это значит, что идея валидирована и нам можно думать о том, как правильно ее продавать и масштабировать.

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

    Заключение


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

    Если хотя бы несколько людей, прочитав эту статью, начнут создавать свой первый проект, мне будет очень приятно. Спасибо за внимание и, как обычно, жду ваших вопросов в комментах.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338350/


    Метки:  

    Первый суперкомпьютер DGX-1 на базе Tesla V100 применят в медицине

    Среда, 20 Сентября 2017 г. 16:45 + в цитатник
    it_man сегодня в 16:45 Разработка

    Первый суперкомпьютер DGX-1 на базе Tesla V100 применят в медицине

      Ученые из Центра клинических научных исследований (Center of Clinical Data Science) станут первыми, кто сможет обрабатывать данные с помощью суперкомпьютера для глубокого обучения DGX-1 на базе восьми графических процессоров Tesla V100. V100 показывают результат в 960 терафлопс при вычислениях FP16 благодаря технологии Volta Tensor Core.


      / Flickr / Fritzchens Fritz / PD

      Платформу для дата-центров Tesla V100 представили в мае 2017 года. Она содержит 21,1 млн транзисторов, построена по 12-нанометровому техпроцессу FinFET, а отдельные 640 ядер Tensor используются для обеспечения работы нейронных сетей, выдавая 120 терафлопс при глубоком обучении.

      Nvidia провела апгрейд своей шины NVLink — теперь она «развивает» 300 Гбит/с, что почти в два раза больше по сравнению с предыдущей реализацией. Это стало возможно благодаря увеличению числа контактов с четырех до шести и расширению пропускной способности до 25 Гбит/с. Модуль 3D-памяти HBM2 также получил улучшения — пропускная способность выросла до 900 Гбит/с.

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

      «Врачи вынуждены иметь дело с огромным количеством информации: лабораторные исследования, МРТ, томография, данные о здоровье членов семьи и многое другое. Из-за этого принимать решения невероятно сложно. Технология, которая поможет врачам в диагностике, способна оптимизировать их работу», — рассказал исполнительный директор CCDS Марк Михалски (Mark Michalski).

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

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

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

      Кто еще использует GPU


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

      Согласно исследованию ученых Калифорнийского университета, по сравнению с дата-центрами с вычислительными ядрами одного типа, у гетерогенных на 21% выше производительность и на 23% — энергоэффективность.

      Использует мощности GPU в своих системах искусственного интеллекта и машинного обучения компания Facebook. Соответствующая лаборатория внутри компании разрабатывает нейронные сети для решения специфических задач.

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

      Например, Nike использует серверы с GPU и ПО MapD для анализа истории продаж и предсказания спроса в отдельных регионах. Еще один клиент MapD — Verizon — использует системы с GPU для анализа логов серверов, отслеживающих мобильные телефоны.

      Предлагают работу с серверами с GPU-ускорением и облачные провайдеры. В том числе и компания «ИТ-ГРАД». Решение позволяет экспериментировать с аналитическими или требующими визуальной поддержки проектами. GPU-системы дают организациям возможность быстро анализировать большие своды данных и в некоторых частных ситуациях способны заменить целые кластеры серверов.

      P.S. Несколько материалов по теме из нашего блога:

      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338210/


      Метки:  

      9 минут на ICO: обзор альтернативы IPO для бизнеса

      Среда, 20 Сентября 2017 г. 16:28 + в цитатник
      onbillion сегодня в 16:28 Управление

      9 минут на ICO: обзор альтернативы IPO для бизнеса



        Читайте оригинал статьи в Блоге DTI.

        Сегодня рассмотрим способ привлечения первичного капитала для компании с использованием криптовалюты. У него довольно много преимуществ перед стандартным IPO: позволяет привлечь больше средств, затратив на это в 10+ раз меньше средств, чем при стандартной процедуре размещения акций на бирже. Называется данный способ краудсейлом, или ICO (Inicial Coin Offering).

        ICO вместо IPO


        По большому счету, ICO можно рассматривать как аналог первичному публичному размещению акций (IPO, Initial Public Offering). Разница в том, что при IPO инвестор получает настоящие акции, а в случае с ICO — так называемые криптоакции — криптографические токены, акциями по сути не являющиеся, но позволяющие инвестору получать часть прибыли компании. Кроме того, проведение IPO, как правило, урегулировано национальным законодательством (в отличие от ICO).

        Так, например, в США для публичного размещения акций их эмитент (компания, обязательно инкорпорированная как акционерное общество) должен быть зарегистрирован в SEC (Комиссии по ценным бумагам и биржам). Сам процесс регистрации — сложный и длительный.

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

        Ниже рассмотрена сравнительная таблица ICO и IPO.



        Процесс выхода на ICO


        Механизм предварительной продажи токенов (ICO) прямо зависит от вида токенов. Можно выделить два основных вида:

        • Токены приложений
        • Токены-акции

        Отличие у них состоит в первую очередь в наличии/отсутствии исходного кода у компании.

        Важно! Компания в зависимости от своих потребностей самостоятельно определяет комбинацию токенов. Это могут быть только токены приложений, только токены-акции, или же их микс. Все это прописывается в Белой книге (White paper) и в условиях ICO (пример — https://goo.gl/YTHmRA).

        У компании есть исходный код >> Токены приложений


        Токены приложений/Аппкойны — форма валюты, необходимая пользователям для получения услуг, предоставляемых децентрализованной сетью. Их аналог — жетон для посещения аттракциона, те никаких прав у инвестора нет, только возможность пользоваться приложением.
        Токены-жетоны можно свободно купить/продать за любую криптовалюту на крипто-биржах, а также заработать, создавая ценности в соответствующей сети (баунти-программа).

        Варианты заработка: майнинг/подписка на новости/лайки и подписки в соцсетях/перевод материалов кампании на другие языки и модерация/публикация контента. Пример подобной программы: https://goo.gl/g9PNwJ

        Последовательность действий команды при ICO (токены приложений):

        1. Публикация White paper, а также ключевой и технической информацию о проекте: цель, временные рамки проведения ICO, команда, дорожная карта развития площадки, особенности проекта и прочие детали) в сообществах криптовалютных инвесторов (Bitcoin Talk, Reddit и др.)
        2. Объявление о предстоящей ICO и публикация исходного кода до генерации первого токена.
        3. Развертывание сети и генерация токенов-жетонов с помощью майнинга. Возможно резервирование части токенов для основателей, в качестве вознаграждения за идею и развитие сети.
        4. Реклама ICO и продажа токенов-жетонов всем желающим (принимаемые валюты устанавливает компания: могут быть только доллар/евро/итд, только криптовалюты, или их микс).
        5. Далее команда работает над развитием проекта согласно намеченному плану: создание сетевого эффекта, создание приложений и поддержка сети. По мере роста сети возрастает спрос на токены, что ведет к увеличению стоимости пользовательских токенов.

        У компании нет исходного кода >> Токены-акции


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

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

        Последовательность действий команды при ICO (токены акции):

        1. Публикация White paper, а также ключевой и технической информацию о проекте: цель, временные рамки проведения ICO, команда, дорожная карта развития площадки, особенности проекта и прочие детали) в сообществах криптовалютных инвесторов (Bitcoin Talk, Reddit и др.)
        2. Создание смарт-контракта с некоторым количеством токенов-акций, зарезервированных за основателями сети.
        3. Создание компании-провайдера, которая будет заниматься разработкой сети за вознаграждение.
        4. Реклама и продвижение предстоящей ICO и продажа токенов-акций всем желающим. Из вырученных денег производится оплата компании-провайдеру.
        5. Далее команда работает над развитием проекта согласно намеченному плану: расширяет сети, проводит сбор и распределение вознаграждения за пользование сетью.


        Еще есть кредитные токены — их можно рассматривать как краткосрочный займ сети, в обмен на процентный доход от суммы займа. Случаев их отдельного использования в процессе ICO еще не было, пока они используются в паре с одним из вышеупомянутых токенов. Одной из первых сетей, использующих кредитные токены (Steem Dollar (SD)), стала сеть Steemit.

        Интересно: некоторые государства всерьез рассматривают возможность выпуска правительственных криптооблигаций, Австралия даже уже приступила к реализации.


        DAO организации


        Как мы писали выше, во многих случаях токены-акции являются долями в DAO организациях. Данные организации представляют собой новую бизнес-модель: общие черты с юридическим лицом, существующим в цифровом виде в блокчейне, с кодом вместо уставных документов, отсутствием централизованного управления, где решения принимаются владельцами токенов акций посредством голосования. Модель подразумевает общий вклад и ответственность всех участников, без центральной управляющей компании. Эта бизнес-модель работает с сочетанием интернета и криптовалюты.

        Bitcoin и Эфириум были первыми, кто использовал эту децентрализованную модель, и они использовали ее для загрузки сети валют/транзакций. Та же самая модель в настоящее время используется для загрузки других сетей (Steem/Augur/Waves/Wings/Antshares/Golem/и др.).

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

        Как создать: некоторые проекты создали свои собственные blockchain (пример — DAO Steem). Другие были созданы на одном из цифровых валютных протоколов (пример — Golem, Augur на Эфириуме).

        Делимся с Вами туториалом, как создать DAO — организацию на Эфириуме: https://www.ethereum.org/dao#the-shareholder-association

        О том, как функционирует операционная модель DAO можно прочитать здесь — прочитать.

        Правовой статус ICO и краудсейла


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

        По сути, криптовалютная деятельность осуществляется в неформальном секторе экономики, а статус самой криптовалюты находится в правовом вакууме (так называемой «серой зоне»). Кроме того, сложно определить и правовую природу отношений, возникающих при проведении ICO или краудсейла, поскольку классическими отношениями финансирования назвать их сложно. Очевидно, что это именно тот случай, когда право не успевает за развитием технологий.

        В настоящее время SEC разрабатывает ряд уточнений к законодательству, которые позволят регулировать блокчейн в качестве трансфер-агента.

        Рассмотрим несколько кейсов по теме.

        Кейс 1.


        Предварительная продажа эфира (криптовалюта платформы Эфириум) проводилась Фондом Эфириум, некоммерческой организацией, зарегистрированной в Швейцарии. Единственная декларируемая цель Фонда — управление средствами, вырученными от продажи эфира, и развитие экосистемы Эфириума. Для того, чтобы граждане США могли покупать эфир без разрешения SEC, Фонд оформил предварительную продажу эфира (ETH) как продажу «криптотоплива», необходимого для работы приложений, разработанных на платформе Эфириум. Разработка программного кода проводилась компанией Ethereum Switzerland GmbH, базирующейся в Швейцарии.

        Кейс 2.


        Еще один экспериментальный подход использует Singular-DTV — основанная на блокчейне студия развлечений. CODE — аббревиатура, сочетание двух элементов:

        CO (Central Organized) — управляющий компонент в форме швейцарского GmbH
        DE (Decentralized Entity) — децентрализованная экосистема, основанная на сети Эфириум.
        GmbH отвечает за расходование эфира, собранного в ходе предварительной продажи токенов через DE. Цель проекта — создание медийных проектов сбор доходов от них. Предполагается, что модель CODE удовлетворяет регуляторному и налоговому законодательству, защищая владельцев токенов от возможной ответственности.

        Кейс 3.

        Эмиссия токенов и поддержка сети происходят независимо от создателя системы. Токены эмитируются посредством компьютерного алгоритма, в котором отсутствует публичный ключ для получения вырученных средств. Создатель системы получает свою долю токенов от майнинга, поскольку он и есть первый майнер в готовой сети. Такой подход применяет сеть Steemit и ее создатель — компания Delaware C Corp.

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

        Продолжение аналитической записки доступно по ссылке: blog.dti.team
        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/338348/


        Метки:  

        Внедрение code style в существующий проект

        Среда, 20 Сентября 2017 г. 15:48 + в цитатник
        dvalid сегодня в 15:48 Разработка

        Внедрение code style в существующий проект

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


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


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


          Что мы имеем


          • База кода (PHP, MySQL, HTML, SCSS, JavaScript), формировавшаяся на протяжении 10 лет;
          • Негласное понимание общего формата, к которому можно отнести:
            — snake_case для названий переменных и функций в бэкенде;
            — базовые правила форматирования (отступы, пробелы, переносы);
            — регламент написания sql запросов;
            — наименования таблиц и колонок;
            — венгерскую нотацию для переменных, содержащих вводные данные.
            Это лишь несколько примеров тех нюансов, которых существует огромное множество в каждом проекте.

          Чего у нас нет?


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


          Осознание проблемы


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


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


          for ($i=0; $i<$num; $i++)
          {
              if (in_array($items[$i]['value'],$filtered))
              continue;
          
              array_push($valid, $items[$i]);
          
              if(!$items[$i]['in_menu']) continue;
          
              $in_menu[] = $items[$i];
          }

          Но если внутри команды всегда есть возможность оперативно обсудить и решить спорные вопросы, то при работе со сторонними разработчиками возникает гораздо больше сложностей. Мы привлекали сторонних специалистов к разработке клиентской части, и именно в фронтенд-коде появился наибольший разброс в стилях. Например, в наименовании классов в одном блоке HTML кода могли сочетаться разные нотации и даже разные имплементации БЭМа.


          Но вот главная сложность, которая возникла при сотрудничестве со специалистами извне: как поддерживать код, написанный с использованием практик и подходов, которыми владеют не все разработчики проекта?


          Несогласованный выбор методологии в вёрстке и последующее редактирование иногда приводили к подобному:


          ...

          или


          ...

          Если в первом случае прослеживается использование БЭМ, то во втором случае понять «что происходит» вообще невозможно. Кроме того, использование БЭМ в наименовании классов в HTML иногда вовсе не влекло за собой преимуществ в CSS. Класс из первого варианта, содержащий в себе описание вложенности элемента, всё равно описывался с помощью вложенных стилей в CSS:


          .i-article__item .i-article__item__item .i-article__item__item__content {
          ...
          }

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


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


          Выработка решения


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


          Далее следовало определиться с самим форматом. Выяснилось, что у участников команды были существенные различия во взглядах на «правильный стиль»: одни предпочитали camelCase, другие настаивали на использовании snake_case во всём, даже в клиентском JavaScript.



          В данном случае большую роль играет уровень и бэкграунд разработчика. Как вы уже догадались, во втором случае речь идет о бэкенд-программисте с длительным стажем.


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


          За довольно короткий период мы сформировали собственные style guide по php, sql и частично JavaScript коду. На очереди были CSS и SCSS.


          В формирование CSS кода вносили свой вклад наибольшее число разработчиков, в том числе и удаленных, а CSS – язык, можно сказать, располагающий к различным вольностям… Очень скоро стало понятно, что соблюдение единого стиля возможно только при максимально чётком и подробном описании всех правил, с приведением множества примеров того, как надо, и как не следует делать.


          Обсуждение сильно затянулось, и команде никак не удавалось прийти к консенсусу по целому ряду пунктов. В результате, для SCSS и CSS мы решили применить готовый сторонний документ с нашими небольшими корректировками.
          Мы использовали Sass, CSS, а ознакомление и согласование поправок заняло у команды не более 3 часов.


          Контроль за исполнением


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


          Выбор пал на SonarQube – платформу статического анализа кода, поддерживающую разные языки программирования и предлагающую несколько форматов использования, в том числе selfhosted, наряду с облачной версией (SonarCloud). К тому же, есть интеграция с нашей платформой CI (Teamcity) и возможность предварительной проверки в редакторе кода (SonarLint).


          Процесс установки системы вместе с пакетом плагинов занял не более получаса, интеграция с Teamcity – чуть более часа. Нам предстояло сформировать так называемые «профили качества» – набор правил для каждого языка, используемых во время проверки. Иначе результат анализа не отражал бы реальную картину.


          На настройку профилей под наши предпочтения потребовалось около трёх часов. Интересно, что для PHP по умолчанию предлагается 3 варианта: «PSR2», «Drupal» и фирменный «Sonar way» – многие, вероятно, смогут использовать систему «из коробки».


          После установки и настройки наступил «момент истины» – тест проверки качества кода на соответствие сформулированным правилам. Запускаем команду sonar-scanner и ждем. На индексацию файлов и проверку более 500 тыс. строк кода ушло около 4 минут. Результат анализа доступен в довольно симпатичном и удобном интерфейсе:



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


          Что дальше?


          Наша цель – контролировать качество нового кода и постепенно улучшать общую статистику, представленную в левой части экрана. В течение двух недель мы будем проверять систему в «полевых условиях» и оценим выгоду от ее внедрения. В следующем посте мы поделимся результатами тестирования системы, подведем итоги и расскажем о сложностях, с которыми столкнулись.
          Если у вас был подобный опыт внедрения code style – будет интересно обсудить это в комментариях!

          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338344/


          [Из песочницы] Бесконечные потоки с помощью Observable и их применение в Android проектах

          Среда, 20 Сентября 2017 г. 15:47 + в цитатник
          Implozia сегодня в 15:47 Разработка

          Бесконечные потоки с помощью Observable и их применение в Android проектах

          Доброго времени суток, друзья. Хотел бы поделиться своим не большим велосипедом открытием в области бесконечных потоков с помощью Observable, применении их в android проектах, а так же немного рассказать теорию (если не уснете к концу статьи).

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

          Позвольте привести примеры c помощью «андройдовской» Java, т.к мы будем применять все это дело, после не большой модернизации, в реальном проекте:

          1) Пример с рекурсией или как не нужно делать:

          public Observable getState(Context context) {
                  BigInteger i = ZERO;
                  return Observable.create(
                          subscriber -> {
                                  while (true) subscriber.onNext(i);
                                          i = i.add(ONE); 
                          }
                  );
              }
          

          2) Пример с отпиской или как нужно делать:

          public Observable getNetworkState(Context context) {
                  BigInteger i = ZERO;
                  return Observable.create(
                          subscriber -> {
                              Runnable r = () -> {
                                  while (!subscriber.isUnsubscribed())
                                      while (true) subscriber.onNext(i);
                                      i = i.add(ONE); 
                              };
                              new Thread(r).start();
                          }
                  );
              }
          

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

          И самое интересное то, что так как subscribe() всего лишь навсего создает новый поток, мы можем этот поток завершить всего лишь отписавшись от события. Очень удобно и без всяких interrup'ов.

          Так как мы будем работать в отдельном потоке, то мы без потери производительности можем в реальном времени отслеживать различные состояния. И потом — так же легко взаимодействовать с UI через Handler.

          Как же нам теперь все это применить в реальном проекте? Очень просто. Сейчас я покажу на актуальном, на мой взгляд примере — обнаружение сети.

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

          public class NetworkState {
              /**
               * @param context контекст в котором должен работать метод (в основном
               это будет {@link android.app.Activity})
               * @return {@link Observable} Мгновенно возвращает состояние сети:
               * 
          * true - сеть есть * * *
          * false - сети нету * */ public Observable getNetworkState(Context context) { return Observable.create( subscriber -> { Runnable r = () -> { while (!subscriber.isUnsubscribed()) subscriber.onNext(hasConnection(context)); }; new Thread(r).start(); } ); } /** * Проверка на наличие сети * @param context Контекст * @return true - сеть есть, false - сети нет */ private static boolean hasConnection(final Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); return wifiInfo != null && wifiInfo.isConnected() || mobileInfo != null && mobileInfo.isConnected(); } }

          Теперь, собственно, применение (Не забудьте где нибудь проинициализировать вьюшки):

          /**
          * Собственно тут все очевидно, дизейблим некую кнопку и показываем сообщение в TextView, о том, что нету сети 
          **/
          private void rxNetworkCheck(){
                  new NetworkManager().getNetworkState(this).subscribe(x ->
                          handlerNetwork.post(() -> {
                              if(x){
                                  buttonNext.setVisibility(View.VISIBLE);
                                  textViewNoConnection.setVisibility(View.INVISIBLE);
                              }
                              else{
                                  buttonNext.setVisibility(View.INVISIBLE);
                                  textViewNoConnection.setVisibility(View.VISIBLE);
                              }
                          })
                  );
              }
          

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

          Вот, собственно, и все, что я хотел сказать, надеюсь своим постом принес кому-то пользу либо проявил интерес к данной теме.

          Ну и конечно же книга которая помогла мне и продолжает помогать в изучении реактивного подхода к разработки, это — «Реактивное программирование с применением RxJava» от Томаш Нуркевича и Бена Кристенсена.
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338342/


          Метки:  

          [Перевод] Kali Linux: политика безопасности, защита компьютеров и сетевых служб

          Среда, 20 Сентября 2017 г. 15:20 + в цитатник

          Метки:  

          Руководство по выживанию в Steam для мобильных разработчиков

          Среда, 20 Сентября 2017 г. 14:46 + в цитатник
          TimTim сегодня в 14:46 Разработка

          Руководство по выживанию в Steam для мобильных разработчиков

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



            Зуд в голове


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

            Наш ответ: может быть, и стоит! Прежде всего подумайте: у вас точно есть проект, который можно будет успешно и без проблем портировать на десктоп? Речь идет не только об интерфейсе и управлении, но и о модели продаж, ведь большинство игр в Steam платные, а ваши самые популярные проекты, вероятнее всего, free-to-play. Если в голову ничего подобного не приходит, то советуем серьезно задуматься, надо ли оно вам. Разработка с нуля — это большие траты и риски.

            Если же проект нашелся или ваш зуд все равно никак не унять, то давайте разберем, что вас ждет на выбранном пути. Для начала рассмотрим Steam как незнакомую и весьма агрессивную среду, в которой вам будут не рады.

            Все по-новому. Немного о Steam


            Сразу заметим, что кроме Steam существует множество других систем дистрибуции, о которых рассказано вот в этом замечательном переводе от PatientZero. Если вы нацелены именно на эту платформу, то давайте будем честными, вы немного запоздали. По данным SteamSpy 38% всех игр Steam было выпущено в 2016 году. Это огромный рост количества продуктов. Сейчас Steam уже не так гостеприимен, как пять лет назад. Он куда менее активно привлекает аудиторию к вашей игре, и она может потеряться в потоке мусора, которого с каждым годом становится все больше и больше. Многие игроки рынка уходят на GOG и другие сервисы. Но, несмотря на это, Steam по-прежнему остается отличной площадкой с миллионной аудиторией, просто времена сейчас более сложные, чем, например, в 2010.



            По данным SteamSpy.com, 38% всех игр было выпущено в 2016 году

            Вот что мы имеем на данный момент (на 18 сентября, данные с SteamSpy):

            • Всего в базе 17 000 игр (для сравнения: в Google Play или Apple AppStore их больше чем полтора миллиона)
            • 47 миллионов активных пользователей за две недели




            Общая прибыль игр в Steam в 2015-2017 году. 2/3 всего дохода приносят платные игры, но free-to-play набирает обороты. Скорее всего, половина красного графика — это игры от Valve.

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

            Что нужно знать о Steam Direct?





            Есть вы совсем не знакомы со Steam Direct и его историей, то советуем прочитать статью-перевод "Steam Greenlight и Steam Direct: что нужно знать инди-разработчикам". При переходе на Direct у вас отпадает необходимость особо возиться с аудиторией на стадии пререлиза. Это и хорошо, и плохо. Из хорошего: это обеспечит вам более простой выход на рынок, без помощи Greenlight. Из плохого: аудиторию нужно будет набирать с нуля, возможно, через соцсети, так как в момент выхода вашей игры в Steam внутри системы про неё никто не будет знать.

            Все, что вам нужно для публикации — это $100, ряд документов и ваш проект.

            Как начать свой путь?





            Ваш выход в Steam можно разделить на три этапа, по четыре шага в каждом. Рассмотрим процесс подробнее.

            Регистрация



            В самом начале вам нужно создать собственный аккаунт в Steam, после чего перейти на страницу SteamWorks, где нужно будет заполнить информацию о вашей компании, ввести все необходимые сведения и оплатить Product Submission Fee в размере $100. Тут есть много нюансов (например, нужно правильно подать всю информацию, чтобы избежать двойного налогообложения), про которые мы, вероятно, напишем отдельную статью.

            Публикация. Работа в Steamworks



            Что такое Steamworks? SteamWorks — это интерфейс, который обеспечивает пользователям инструменты для разработки и публикации. Он предоставляет ряд возможностей, как например: интеграция с клиентом Steam, интеграция с комьюнити, добавление и редактирование достижений для игр и многое другое. Название Steamworks относится ко всей системе работы с проектом, включая панель управления и API Steam. О технических аспектах интеграции рекомендуем почитать в интересных статьях от товарища Dinisoid. В данном материале мы остановимся только на «админке».

            Когда получите доступ к панели управления (она называется Game Admin в Steamworks), будьте готовы к тому, что вам понадобится много картинок. Речь идет не только о стандартных скриншотах и шапках, которые просят мобильные маркеты, но и принципиально новом визуальном контенте: картинках достижений, игровых карточках и т.п.

            Это все нужно обязательно, так как именно в дополнительном функционале от Steam (достижения, карточки и т.п.) кроется огромный потенциал для привлечения и удержания ваших игроков в игре. Ниже мы расскажем об этом чуть подробнее. Между прочим, существует отличный официальный канал Steamworks Development, который содержит обучающие видео для любого из этапов публикации вашего проекта.

            Поддержка игры
            Конечно, поддержка игры и работа с аудиторией — тема, достойная отдельной статьи. Главное, на что здесь хочется обратить внимание — не забывайте про сообщество! Steam – это отличный аккумулятор единомышленников, который формирует сильные социальные цепочки. Сервис сам выбирает, какие игры рекомендовать, в зависимости от того, насколько активно взаимодействует с ней сообщество. Поэтому применяйте все методы. Кроме стандартных страниц в соцсетях, обязательно используйте Центр сообщества, который по факту представляет собой Facebook для пользователей Steam. В Центре проходят все обсуждения, туда выкладывают скриншоты, туда пишут обзоры. Подробнее возможности этого инструмента мы рассмотрим чуть позже. Ну и конечно, не забывайте чаще обновлять игру. Даже мелкие фиксы напоминают игрокам, что вы про них не забыли и поддерживаете свой проект.



            Что Steam делает для вас? Механизмы продвижения


            Как мы уже говорили, Steam предлагает очень мощный механизм для продвижения продуктов. Да, игр сейчас стало очень много и пробиться (особенно для начинающего разработчика) весьма непросто, но тем не менее, Steam во многом вам помогает.

            Лучшая особенность Steam — персональные рекомендации. Большая часть платящей аудитории Steam — это социально активные игроки. У них много друзей, хорошо прокачаны профили, они постоянно покупают новые игры и пишут обзоры. Для таких пользователей у Steam есть механизм персональных рекомендаций и настраиваемая стартовая страница. Давайте более внимательно посмотрим, что это нам дает.

            Особенности стартовой страницы
            Список «Популярное и рекомендуемое» из 12 игр, который состоит из рекомендаций для конкретного игрока.



            При его формировании учитывается следующее:

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


            Блок «Специальные предложения»



            В этот блок помещают:

            • Акции на выходных (распродажи, бесплатные выходные)
            • Предложение дня
            • Другие предложения с скидками


            Блок персональных рекомендаций, у социально активной аудитории



            Сюда входят:

            • Рекомендации от друзей
            • Ссылка на большой список рекомендаций, который строится на основе игрового опыта пользователя


            Рекомендации кураторов



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

            Блок «Недавние обновления»



            Тут все просто и аналогично Apple AppStore и Google Play. Нужно чаще обновлять игру, чтобы она регулярно появлялась в списках актуальных.

            Вывод игры «в свет»
            Когда кто-то играет в вашу игру, это видят все его друзья. Информация может доходить до них в разной форме, будь то скриншоты, сообщения о достижениях или обзор на игру. Если у пользователя много друзей, то ваша игра может выйти на виток популярности благодаря эффекту сарафанного радио. Например, так было с серией игр ZUP.

            Особенности работы и поддержки игры в Steam


            Как мы уже говорили, Steam – весьма уникальная платформа с интересными механизмами на уровне разработчик-игрок. Сейчас мы рассмотрим самые яркие элементы, которые обязательно нужно использовать.

            Первое — это ранний доступ для продуктов, которые все еще находятся в разработке. Очень многие критикуют данную возможность: у огромного числа проектов история кончается тем, что разработчики не выполняют обещанного и игра так и не выходит из стадии раннего доступа. Но для честного разработчика и аудитории, которая хочет его поддержать, это действительно стоящий механизм. Если вы правда хотите, чтобы сообщество принимало участие в процессе создания вашей игры, то его стоит использовать. Хороший пример работы с аудиторией в раннем доступе — это Amplitude Studio и их игры серии Endless Space. Компания позволила сообществу принимать участие в разработке игры при помощи сервиса Games2Gether — люди получили способность влиять на то, какие конкретно фичи будут введены в игру. Таким образом в период раннего доступа аккумулируется сообщество, которое впоследствии будет поддерживать игру.



            Идем дальше. Как игрок сможет найти вашу игру? Даже если у вас нет большого бюджета на рекламу, остается шанс, что аудитория увидит ваш тайтл благодаря системе персональных рекомендаций для игрока.

            Список рекомендаций всегда есть на главной странице, кроме того, во время распродаж Steam поощряет тех, кто просматривает эти списки до конца.



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



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

            Рекомендации по оформлению аккаунта разработчика


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

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



            Хороший пример подхода к порту мобильной игры

            Еще пара моментов:

            1. Если вы не крупный издатель, то желательно иметь не слишком много игр на аккаунте — 5-10 вполне достаточно. Большое количество продуктов при отсутствии громкого имени в Steam зародит в людях подозрение, что ваши тайтлы не отличаются высоким качеством.
            2. У любой игры, даже небольшой, должен быть свой сайт проекта. Это может быть обычный лэндинг с ссылками, но он должен быть.

            Рекомендации по оформлению страницы игры


            Теперь нужно сказать пару слов по поводу оформления страницы вашего проекта.

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



            Середина страницы содержит более подробное описание, ссылку на достижения игры, а также всю дополнительную информацию. Интересная особенность: в отличие от мобильных маркетов, в Steam можно вставлять в описания изображения и по-разному форматировать текст.





            Крайне агрессивная среда. Система рейтингов Steam


            Отличие системы отзывов от Apple AppStore и Google Play
            В мобильных сторах вы можете просто поставить 5 звездочек и уйти. В Steam действует более сложная система правил для желающих оставить отзыв, а вычисление общей оценки не сводится к расчету среднего арифметического.

            Итак, правила:

            • Отзыв обязательно должен содержать текст
            • Нужно наиграть минимум 5 минут в игре, чтобы получить возможность написать обзор
            • В системе не предусмотрено звезд и промежуточных оценок. Вы либо рекомендуете игру, либо нет
            • Итоговая оценка определяется путем весьма специфических расчетов (см. таблицу)




            Общая процентовка рейтинга игр в Steam (данные собственных подсчетов)

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

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

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



            Ценообразование в Steam или не жадничайте ( но и не продешевите!)


            Как правильно выбрать цену в Steam? Конечно, если у вас есть штат маркетологов, они дадут ответ на этот вопрос. Ну а если таких бравых ребят нет, то вот несколько советов.

            Самое главное — учитывайте регион, где продаете игру. В Steam не зря введена гибкая система региональных цен. Самый явный пример — российские игроки, которые привыкли к проиндексированным ценам в рублях. Другой пример — страны СНГ, где часто этот индекс не учитывают, хотя вроде как надо бы.

            Для отслеживания разницы цен даже создали специальный сервис Steamprices, однако Valve активно борется с покупкой продуктов «не в своих» регионах, за это можно даже схватить бан. Поэтому заранее подумайте о ценовой политике и индексировании.



            Пример индексации цен. Обратите внимание на процент роста относительно российского рубля.

            Естественно, нужно адекватно оценивать свой продукт. Не стоит занижать свои заслуги и потраченный ресурс, но и ставить инди-игре ценник, как у ААА продута, бессмысленно. Как только цена начинает казаться завышенной, сообщество выдает резкую реакцию в виде негативных обзоров, что может очень сильно сказаться на будущем игры в Steam.



            Если посмотреть на список самых дорогих игр, можно увидеть, что они собирают мало положительных оценок.



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

            Уже было несколько случаев, когда игроки «роняли» оценку игры после внезапного повышения цен. Недавно таким образом пострадала компания Paradox Interactive, которая повысила расценки на 10-30%. Игроки очень возмутились подобными изменениями и изменили рейтинг игр в худшую сторону. Досталось даже новым и хорошим проектам, таким как Tyranny.



            Последствия ценовых войн

            Конечно же, мы не поддерживаем подобное давление на издателя и считаем, что труд разработчиков должен быть достойно оценен. И все-таки учитывайте подобные факторы, определяясь с ценами в Steam.

            Для тех, кому этой информации мало, есть отличная статья-перевод от PatientZero "О ценообразовании для инди-игр", где более подробно описаны проблемы выстраивания ценовой политики в Steam, а также затрагиваются психологические аспекты ценообразования.

            Коротко о локализациях


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

            Если вы публикуете свою игру во всем мире, помните про переводы, чтобы не получить гарантированный минус от обделенной аудитории.

            Страшное грядет… распродажи





            Достаточно известная картинка, которая показывает всю опасность распродаж

            Итак, вы выложили игру, начали создавать сообщество и тут внезапно… распродажа! Все бегают, кричат, главная страница Steam кардинально меняется, и вы понимаете, что нужно что-то делать. Но что?

            Распродажа Steam – это целый культ с своими правилами, ритуалами, обрядами и толпами сектантов. Каждая распродажа внимательно отслеживается сообществом и привлекает миллионы игроков, которые тратят огромное количество денег.

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

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

            Заключение и ссылки на информацию


            Для тех, кто не пролистал в конец статью — спасибо, что дочитали до конца! Здесь мы попытались затронуть большую часть аспектов работы со Steam. Конечно же, в каждый пункт можно углубляться до бесконечности, но даже с такой базой вам будет проще ориентироваться в стихии данной системы.

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

            От себя мы хотели бы поблагодарить такие сервисы, как SteamSpy, SteamPrices за то, что они есть и отлично делают свою работу. Кроме того, большое спасибо авторам статей и переводов на тему Steam, на которых мы ссылались в статье.

            Если данный материал вам показался чересчур длинным, то вот все необходимые ссылки для детального самостоятельного изучения:

            Steamworks – главная страница SteamWorks с помощью которой можно начать публиковать свою игру
            Steamworks Doc — огромный портал с документацией по интеграции сервисов Steam в вашу игру
            Steamworks Development — официальный канал на YouTube, в котором выложено множество видео-туториалов и примеров работы в SteamWorks
            Steamworks.NET – фреймворк для интеграции Steamworks API в Unity
            Steamworks Unreal – материал по интеграции Steamworks API в Unreal Engine 4



            Спасибо за внимание! Продолжаем играть и разрабатывать игры!
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338314/


            Метки:  

            Визуализация звука в Unity

            Среда, 20 Сентября 2017 г. 14:42 + в цитатник
            zarytskiy сегодня в 14:42 Разработка

            Визуализация звука в Unity

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

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

            Типы данных:


            Анализируя аудиофайл, можно получить самые разые данные. Но для начала сконцетрироваться стоит на спектре звука и амплитуде (громкости). Это самые частоиспользуемые типы данных о звуке.



            Спектр звука по сути можно представить в виде массива, который содержит данные о громкости звука на разных частотах (наверняка все знакомы с эквалайзером. Он как раз таки наглядно показывает стоение звукового спектра).

            Амплитуда же является громкостью аудиофайла в текущий момент. То есть средним арифметическим среди значений спектра.

            Теперь, когда мы узнали основные понятия, можно приступить к написанию кода

            Получение звукового спектра. Функция GetSpectrumData()


            В Unity есть встроенная функция GetSpectrumData(), которая выдает нам звуковой спектр в данный момент времени. Она принимает три параметра:

            AudioSource.GetSpectrumData(float samples, int channel, FFTWindow window)
            

            samples — массив типа float, в который будут занесены значения звукового спектра. Длина массива обязательно должна быть степенью двойки (64 — минимум, 8192 — максимум)

            channel — номер канала, который мы хотим анализировать. Обычно выставляется просто 0

            FFTWindow — можно назвать типом спектрального анализа. Разные типы отличаются по сложности своего алгоритма. Более сложные (Blackman) точнее, но могут замедлить работу вашей программы. Более простые (Triangle) менее точны, но работают быстрее



            Для начала создадим массив длиной 512, и передадим его в кач-ве аргумента. Также выставим канал на 0, а FFTWindow — FFTWindow.Blackman

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

            source.GetSpectrumData(spectrum, 0, FFTWindow.Blackman);

            Обратите внимание на использование переменной maxScale, При умножении значение спектра на неё мы получаем высоту куба. Это связано с тем, что получаемые значения очень малы, и без данной операции эффект будет практически незаметен.



            Мы видем, что низкие частоты принимают гараздо большие значение, чем средние и высокие. Это нормально, но с этим не удобно работать. Из 512 значений большинство не пригодны к использованию, т.к. практически не изменяются. Те же, что изменяются принимают слишком большие значение. Удачным решением, на мой взгляд, будет перераспределение значений на более мелкий массив, с их усреднением. (Что я имею ввиду станет понятнее ниже)

            Мы напишем вот такую функцию:

            private void makeFreqBands()
                {
                    int count = 0;
            
                    for (int i = 1; i <= 8; i++)
                    {
                        float avg = 0;
                        int sampleCount = (int)Mathf.Pow(2, i);
            
                        if (i == 8)
                            sampleCount += 2;
            
                        for(int j = 0; j < sampleCount; j++)
                        {
                            avg += spectrum;
                            count++;
                        }
            
                        avg /= count;
                        bands = avg * 10;
                    }
                }

            Сначала она берет значение первых двух элементов спектра, усредняет их и присваивает элементу нового массива. Затем то же самое происходит с последующими четырьмя, восьмб, шестнадцатью и тд. элементами. В итоге мы получаем новый массив из 8 элементов (я выбрал 8, потому что это этим кол-вом элементов не трудно манипулировать, а так же по техническим причинам, которые объясню далее), которые не имеют такого сильного разброса по значениям.
            Мы получаем среднее значение из 2 ^ i+1 элементов массива. Т.К. у нас 512 элементов, в итоге мы используем их все (обратите внимание на поправку на 40-41 линиях. Без неё мы бы использовали лишь 510 элементов). А так как кол-во усредняемых элементов возрастает, значения низких частот становятся не такими отличными от более высоких.

            Теперь мы можем визуализировать скрипт 8-ю кубами




            Но мы увидим, что они очень резко дергаются. Это связано с быстрым изменением значений (ведь функция update вызывается каждый кадр!). Мы можем исправить это, создав сглаживающую функцию.

            void ProcBandBuffer()
                {
                    for(int i = 0; i < 8; i++)
                    {
                        if(bands > bufferBands)
                        {
                            bufferBands = bands;
                            bufferDecrease = 0.00005f;
                        }
            
                        if (bands < bufferBands)
                        {
                            bufferBands -= bufferDecrease;
                            bufferDecrease = 1.2f;
                        }
                    }
                }

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

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

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

            void mapBufferedBands()
                {
                    for (int i = 0; i < 8; i++)
                    {
                        if (bufferBands[i] > heighesBufferBand[i])
                            heighesBufferBand[i] = bufferBands[i];
            
                        rangedBufferBand[i] = bufferBands[i] / heighesBufferBand[i];
                    }
                }

            Теперь у нас есть очень удобные для работы значения, которые мы можем использовать как координату, размер, цветовое значение и вообще любое числовое значение типа float (можете дать волю воображению и сделать с этим что-то креативное!)

            А чтобы получить амплитуду, нам достаточно сложить все 8 значений и разделить их на 8. Т.е. найти среднее арифмитическое. Ничего сложного!

            Сегодня в 19:30 состоится прямая трансляция по моему обучающему проекту «Введение в визуализацию звука на Unity» где мы создадим более сложные и интересные визуализации используя объекты, проект в свободном доступе.
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338334/


            Метки:  

            Как работает Android, часть 2

            Среда, 20 Сентября 2017 г. 14:15 + в цитатник
            bugaevc сегодня в 14:15 Разработка

            Как работает Android, часть 2


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


              Статьи серии:





              Говоря про Unix- и Linux-корни Android, нужно вспомнить и о других проектах операционных систем, влияние которых можно проследить в Android, хотя они и не являются его прямыми предками.


              Я уже упомянул про BeOS, в наследство от которой Android достался Binder.


              Plan 9 from Bell Labs


              Plan 9 — потомок Unix, логическое продолжение, развитие его идей и доведение их до совершенства. Plan 9 был разработан в Bell Labs той же командой, которая создала Unix и C — над ним работали такие люди, как Ken Thompson, Rob Pike, Dennis Ritchie, Brian Kernighan, Tom Duff, Doug McIlroy, Bjarne Stroustrup, Bruce Ellis и другие.


              В Plan 9 взаимодействие процессов между собой и с ядром системы реализовано не через многочисленные системные вызовы и механизмы IPC, а через виртуальные текстовые файлы и файловые системы (развитие принципа Unix «всё — это файл»). При этом каждая группа процессов «видит» файловую систему по-своему (пространства имён, namespaces), что позволяет запускать разные части системы в разном окружении.


              Например, чтобы получить позицию курсора мыши, приложения читают текстовый файл /dev/mouse. Оконная система rio предоставляет каждому приложению свою версию этого файла, в которой видны только события, относящиеся к окну этого приложения, и используются локальные по отношению к окну координаты. Сама rio читает события «настоящей» мыши через такой же файл /dev/mouse — в том виде, в котором его видит она. Если она запущена напрямую, этот файл предоставляется ядром и действительно описывает движения настоящей мыши, но она может быть совершенно прозрачно запущена в качестве приложения под другой копией rio, без какой-то специальной поддержки с её стороны.


              Скриншот Plan 9


              Plan 9 полностью поддерживает доступ к удалённым файловым системам (используется собственный протокол 9P, кроме того, поддерживаются FTP и SFTP), что позволяет программам совершенно прозрачно получать доступ к удалённым файлам, интерфейсам и ресурсам. Такая «родная» сетевая прозрачность превращает Plan 9 в распределённую операционную систему — пользователь может физически находиться за одним компьютером, на котором запущена rio, запускать приложения на нескольких других, использовать в них файлы, хранящиеся на файловом сервере и выполнять вычисления на CPU-сервере — всё это полностью прозрачно и без специальной поддержки со стороны каждой из частей системы.


              За счёт красиво спроектированной архитектуры Plan 9 значительно проще и меньше, чем Unix — на самом деле ядро Plan 9 даже в несколько раз меньше известного микроядра Mach.


              Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away.

              Несмотря на техническое превосходство и наличие слоя совместимости с Unix, Plan 9 не получил широкого распространения. Тем не менее, многие идеи и технологии из Plan 9 получили распространение и были реализованы в других системах. Самая известная из них — кодировка UTF-8, которая была разработана в Plan 9 для обеспечения полной поддержки Unicode при сохранении обратной совместимости с ASCII — стала общепринятым стандартом.


              Больше всего идей и технологий из Plan 9 реализовано в Linux:


              • файловая система /proc (procfs)
              • системный вызов clone (аналог rfork из Plan 9)
              • поддержка пространств имён монтирования (mount namespaces)
              • поддержка файловых систем, реализованных в пользовательском пространстве (filesystem in userspace, FUSE)
              • поддержка протокола 9P

              Многое из этого используется, в том числе, и в Android. Кроме того, в Android реализован механизм intent’ов, похожий на plumber из Plan 9; о нём я расскажу в следующей статье.


              Про Plan 9 можно узнать подробнее на сайте plan9.bell-labs.com (сохранённая копия в Wayback Machine), или его зеркале 9p.io


              Inferno


              Plan 9 получил продолжение в виде проекта Inferno, тоже разработанного в Bell Labs. К таким свойствам Plan 9, как простота и распределённость, Inferno добавляет переносимость. Программы для Inferno пишутся на высокоуровневом языке Limbo и выполняются — с использованием just-in-time компиляции — встроенной в ядро Inferno виртуальной машиной.


              Inferno настолько переносим, что может запускаться


              • на процессорах разных архитектур: ARM, x86, IBM PowerPC, Sun SPARC, 6SGI MIPS и HP PA-RISC,
              • как самостоятельная операционная система или как программа под Plan 9, Unix, Windows 95 и Windows NT.

              При этом приложениям, запущенным внутри Inferno, предоставляется совершенно одинаковое окружение.


              Inferno получил ещё меньше распространения и известности, чем Plan 9. С другой стороны, Inferno во многом предвосхитил Android, самую популярную операционную систему на свете.


              Danger


              Компания Danger Research Inc. была сооснована Энди Рубином (Andy Rubin) в 1999 году, за 4 года до сооснования им же Android Inc. в 2004 году.


              В 2002 году Danger выпустили свой смартфон Danger Hiptop. Многие из разработчиков Danger впоследствии работали над Android, поэтому неудивительно, что его операционная система была во многом похожа на Android. Например, в ней были реализованы:


              • «всегда запущенные» приложения, написанные на Java,
              • полноценный веб-браузер,
              • веб-приложения,
              • мессенджер,
              • email client,
              • облачная синхронизация,
              • магазин сторонних приложений.

              Danger Hiptop


              Подробнее о Danger можно прочитать в статье Chris DeSalvo, одного из разработчиков, под названием The future that everyone forgot.


              Java


              Хотя использование высокоуровневых языков для серьёзной разработки сейчас уже никого не удивляет, из популярных операционных систем только у Android «родной» язык — высокоуровневая Java (с другой стороны, здесь можно вспомнить веб с его JavaScript, .NET для Windows и относительно высокоуровневый — но полностью компилируемый в нативный код и не использующий сборку мусора — Swift).


              Несмотря на кажущиеся недостатки («Java сочетает в себе красоту синтаксиса C++ со скоростью выполнения питона»), Java обладает множеством преимуществ.


              Во-первых, Java — самый популярный (с большим отрывом) язык программирования. У Java огромная экосистема библиотек и инструментов разработки (в том числе систем сборки и IDE). Про Java написано множество статей, книг и документации. Наконец, существует множество квалифицированных Java-разработчиков.


              Программы на Java, как и на многих других высокоуровневых языках, переносимы между операционными системами и архитектурами процессора («Write once, run anywhere»). Практически это проявляется, например, в том, что приложения для Android работают без перекомпиляции на устройствах любой архитектуры (Android поддерживает ARM, ARM64, x86, x86–64 и MIPS).


              В отличие от низкоуровневых языков вроде C и C++, использующих ручное управление памятью, в Java память автоматически управляется средой времени выполнения (runtime environment). Программа на Java даже не имеет прямого доступа к памяти, что автоматически предотвращает несколько классов ошибок, часто приводящих к падениям и уязвимостям в программах, написанных на низкоуровневых языках — невозможны «висячие ссылки» (из-за которых происходит use-after-free), разыменование нулевого указателя (при попытке это сделать выбрасывается NullPointerException), чтение неинициализированной памяти и выход за границы массива.


              Использование полноценной сборки мусора (по сравнению с automatic reference counting) избавляет программиста от всех проблем и сложностей с циклическими ссылками и позволяет реализовывать ещё более продвинутые (advanced) зависимости между объектами.


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


              Running Java is ART


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


              Хотя делаются попытки создать физический процессор, который исполнял бы Java-байткод напрямую, в подавляющем большинстве случаев в качестве такого процессора используется эмулятор — Java virtual machine (JVM). Обычно используется реализация от Oracle/OpenJDK под названием HotSpot.


              В Android используется собственная реализация под названием Android Runtime (ART), специально оптимизированная для работы на мобильных устройствах. В старых версиях Android (до 5.0 Lollipop) вместо ART использовалась другая реализация под названием Dalvik.


              И в Dalvik, и в ART используется собственный формат байткода и собственный формат файлов, в которых хранится байткод — DEX (Dalvik executable). В отличие от class-файлов в «обычной джаве», весь Java-код приложения обычно компилируется в один DEX-файл classes.dex. При сборке Android-приложения Java-код сначала компилируется обычным компилятором Java в class-файлы, а потом конвертируется в DEX-файл специальной утилитой (возможно и обратное преобразование).


              И HotSpot, и Dalvik, и ART дополнительно оптимизируют выполняемый код. Все три используют just-in-time compilation (JIT), то есть во время выполнения компилируют байткод в куски полностью нативного кода, который выполняется напрямую. Кроме очевидного выигрыша в скорости, это позволяет оптимизировать код для выполнения на конкретном процессоре, не отказываясь от полной переносимости байткода.


              Кроме того, ART может компилировать байткод в нативный код заранее, а не во время выполнения (ahead-of-time compilation) — причём система автоматически планирует эту компиляцию на то время, когда устройство не используется и подключено к зарядке (например, ночью). При этом ART учитывает данные, собранные профилировщиком во время предыдущих запусков этого кода (profile-guided optimization). Такой подход позволяет дополнительно оптимизировать код под специфику работы конкретного приложения и даже под особенности использования этого приложения именно этим пользователем.


              В результате всех этих оптимизаций производительность Java-кода на Android не сильно уступает производительности низкоуровневого кода (на C/C++), а в некоторых случаях и превосходит её.


              Java-байткод, в отличие от обычного исполняемого кода, использует объектную модель Java — то есть в байткоде явно записываются такие вещи, как классы, методы и сигнатуры. Это делает возможным компиляцию других языков в Java-байткод, что позволяет написанным на них программам исполняться на виртуальной машине Java и быть в той или иной степени совместимыми (interoperable) с Java.


              Существуют как JVM-реализации независимых языков — например, Jython для Python, JRuby для Ruby, Rhino для JavaScript и диалект Lisp Clojure — так и языки, исходно разработанные для компиляции в Java-байткод и выполнения на JVM, самые известные из которых — Groovy, Scala и Kotlin.


              Самый новый из них, Kotlin, специально разработанный для идеальной совместимости с Java и обладающий гораздо более приятным синтаксисом (похожим на Swift), поддерживается Google как официальный язык разработки под Android наравне с Java.


              Kotlin on Android logo


              Несмотря на все преимущества Java, в некоторых случаях всё-таки желательно использовать низкоуровневый язык — например, для реализации критичного по производительности компонента, такого как браузерный движок, или чтобы использовать существующую нативную библиотеку. Java позволяет вызывать нативный код через Java Native Interface (JNI), и Android предоставляет специальные средства для нативной разработки — Native Development Kit (NDK), в который входят в том числе заголовочные файлы, компилятор (Clang), отладчик (LLDB) и система сборки.


              Хотя NDK в основном ориентирован на использование C/C++, с его помощью можно писать под Android и на других языках — в том числе Rust, Swift, Python, JavaScript и даже Haskell. Больше того, есть даже возможность портировать iOS-приложения (написанные на Objective-C или Swift) на Android практически без изменений.


              О безопасности


              Классический Unix


              Модель безопасности в классическом Unix основана на системе UID/GID — специальных номеров, которые ядро хранит для каждого процесса. Процессам с одинаковым UID разрешён доступ друг к другу, процессы с разным UID защищены друг от друга. Аналогично ограничивается доступ к файлам.


              По смыслу каждый UID (user ID) соответствует своему пользователю — во времена создания Unix была нормальной ситуация, когда один компьютер одновременно использовался множеством людей. Таким образом, в Unix процессы и файлы разных людей были защищены друг от друга. Чтобы разрешить общий доступ к некоторым файлам, пользователи объединялись в группы, которым и соответствовал GID (group ID).


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


              Такая модель подразумевает, что пользователь полностью доверяет всем программам, которые использует. В то время это было логично, потому что программы чаще всего либо были частью системы, либо создавались (писались и компилировались) самим пользователем.


              В Unix есть и исключение из ограничений доступа — UID 0, который принято называть root. У него есть доступ ко всему в системе, и никакие ограничения на него не распространяются. Этот аккаунт использовался системным администратором; кроме того, под UID 0 запускаются многие системные сервисы.


              В современном Linux эта модель была значительно расширена и обобщена, в том числе появились capabilities, позволяющие «получить часть root-прав», и реализующая мандатное управление доступом (mandatory access control, MAC) подсистема SELinux, которая позволяет дополнительно ограничить права (в том числе права root-процессов).


              Всё изменилось


              За несколько десятков лет, прошедших с создания Unix до создания Android, практика использования компьютеров («вычислителей») значительно изменилась.


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


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


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


              Android


              Хотя часть Android-приложений поставляется с системой — например, такие стандартные приложения, как Калькулятор, Часы и Камера — большинство приложений пользователи устанавливают из сторонних источников. Самый известный из них — Google Play Store, но есть и другие, например, F-Droid, Amazon Appstore, Яндекс.Store, китайские Baidu App Store, Xiaomi App Store, Huawei App Store и т.д. Кроме того, Android позволяет вручную устанавливать произвольные приложения из APK-файлов (это называют sideloading).


              Как и другие Unix-подобные системы, Android использует для ограничения доступа существующий механизм UID/GID. При этом — в отличие от традиционного использования, когда UID соответствуют пользователям — в Android разные UID соответствуют разным приложениям. Поскольку процессы разных приложений запускаются с разными UID, уже на уровне ядра приложения защищены и изолированы друг от друга и не имеют доступа к системе и данным пользователя. Это образует песочницу (Application Sandbox) и позволяет пользователю устанавливать любые приложения без необходимости доверять им.


              Чтобы всё-таки получить доступ к пользовательским данным, камере, совершению звонков и т.п., приложение должно получить от пользователя разрешение (permission). Некоторые из разрешений существуют в виде GID, в которые приложение добавляется, когда получает это разрешение — например, получение разрешения ACCESS_FM_RADIO помещает приложение в группу media, что позволяет ему получить доступ к файлу /dev/fm. Остальные существуют только на более высоком уровне (в виде записей в файле packages.xml) и проверяются другими компонентами системы при обращении к высокоуровневому API через Binder.



              Небольшая часть системных сервисов в Android запускается под UID 0, то есть root, но большинство используют специально выделенные номера UID, повышая при необходимости свои права с помощью Linux capabilities. Кроме того, Android использует SELinux — использование SELinux в Android называют SEAndroid — для ещё большего ограничения того, какие действия разрешено выполнять приложениям и системным сервисам.


              Обычно Android не предоставляет пользователю прямой доступ к root-аккаунту, но в некоторых случаях у него есть возможность этот доступ получить. Как это происходит, зачем это нужно и какими опасностями это грозит я расскажу позднее.




              В следующей статье (которая выходит уже через неделю) я расскажу о компонентах, из которых состоят приложения под Android, и об идеях, которые стоят за этой архитектурой.

              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338292/


              Вы купили CRM. Как с этим жить?

              Среда, 20 Сентября 2017 г. 13:53 + в цитатник
              Axelus сегодня в 13:53 Управление

              Вы купили CRM. Как с этим жить?

                Почти у каждого из нас на рабочем компьютере есть ярлыки программ, которыми мы почти не пользуемся. Причём это могут быть не просто какие-то бесплатные скриншотилки и плееры, но и дорогие лицензионные продукты — например, в том случае, когда генеральный директор широким жестом распорядился всем установить Фотошоп или Корел. А вы, например, сисадмин или бэкенд-разработчик. Или даже продажник. И вам совершенно не хочется разбираться в этих программах. К чему мы клоним? Такое же отношение бывает и к CRM-системе. Проблема есть, и причина у неё одна: если вы не любите CRM, вы просто не умеете её готовить. Давайте с этим что-то делать.



                Откуда у беды ноги растут?


                Существует несколько причин простоя CRM-системы, и все они связаны с позицией отдельных людей и подразделений.

                • Работа CRM-системы не интересна руководству компании. Именно не интересна — поскольку сама по себе заинтересованность руководства всегда есть, никто не будет отрицать важность отлаженности бизнес-процессов, сохранности клиентской базы (да это вообще актив нового типа!). А вот интереса и веры в продукт нет. Это неприятная ситуация, поскольку подчинённые очень тонко чувствуют поведенческие посылы начальника, и стремятся вести себя аналогично.
                • CRM-система игнорируется «звёздами продаж» и ведущими сотрудниками. Обычно их позиция звучит примерно так: «Я крутой и занятой, мне некогда вносить данные в эти формы, у настоящего продажника должны быть язык и ухо, остальное — фигня. Наймите мне падавана, чтобы данные вносил». Да, действительно, в редких случаях бывает так, что такой менеджер может продать снег эскимосам и резиновую женщину в гарем султана, но чаще всего дела обстоят прозаичнее: такие ребята хотят сохранить клиентскую базу при себе и скрыть некоторые детали отношений с клиентом (читай — забрать себе деньги). CRM для них — большая помеха.


                Вот пример рассуждения реально опытного, но не совсем объективного продажника

                • CRM-система не нравится техническому отделу, сисадмину либо просто имеет технические проблемы — например, медленно загружается и обрабатывает данные, подвешивает машину (десктоп) или крашит браузер (web). Увы, такое встречается — не каждая компания решается проводить постоянный рефакторинг кода для оптимизации своего ПО. Мы в RegionSoft очень заморочены скоростью — от релиза к релизу мы оптимизируем код, заботимся о размере программы, скорости отклика и обработки данных. К сожалению, не все на рынке так делают — грустно, но некоторые системы запускаются дольше, чем остывает/пьётся утренний кофе.
                • Сами сотрудники блокируют использование CRM-системы — потихоньку ей не пользуются, рассчитывая, что «само рассосётся» и все забудут, что в неё нужно что-то вносить. Периодически после очередного разноса данные тщательно заносятся, а потом снова тишина. Причины две. Первая — страх контроля над действиями сотрудников. Вторая, более глубокая, страх нового — ничем не отличающийся от неприязни к новому смартфону или непривычного управления новым автомобилем.

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

                На самом деле, для очень большей части компаний сектора СМБ CRM-система — это не очень сложно и даже не очень дорого. Фактически это инструмент, такой же как ПК, IP-телефония, офисный пакет. Представьте себе, в 2001 году агентство Forrester оценивало среднюю стоимость внедрения CRM в $40-60 тыс., а срок внедрения — в 24 месяца. Срок 90 дней назывался как сенсационное исключение, граничащее с пустыми обещаниями вендора. Сейчас эти параметры касаются крупных сложных внедрений, даже скорее интеграционных проектов с доработкой и т.д. А небольшому бизнесу, купившему CRM-систему, нужно предпринять лишь несколько базовых шагов, чтобы начать эффективно работать и наращивать мощность и продуктивность своей CRM-системы. Поговорим о них.

                Чек-лист успешного старта CRM-системы




                Принципиальная схема стартовых действий в CRM для малого и среднего бизнеса. Вы можете скачать эту схему себе на компьютер по ссылке. Схема кликабельна
                А это — ссылка на схему «Внедрение CRM» целиком.


                Учиться, учиться, ещё раз учиться


                Собирайте документацию. Хороший вендор клиента не бросит и всегда вместе с лицензиями (ну или арендой SaaS) предоставит полную документацию на свой продукт в виде PDF-файла или интерактивной справки внутри программы. Не лишним будет спросить у вендора и о других документах: регламентах работы телефонии, интеграций, документации на дополнительные сервисы, если они есть в поставке. Распечатайте документацию каждому пользователю CRM-системы — такая настольная книга поможет сориентироваться в новом интерфейсе. Естественно, что у администратора системы должно быть своё руководство, закрывающее все рабочие вопросы, плюс контакт с поддержкой вендора.

                Создавайте базу знаний. Вы можете завести wiki-раздел на корпоративном портале, собирать инструкции в папке на сервере или на онлайн-диске или вести базу знаний прямо в CRM-системе (у нас в RegionSoft CRM есть такой раздел). Прописывать советы по использованию системы, находки и рекомендации — отличный способ усвоить информацию самому и передать другим. Руководство должно напрямую контролировать создание подобной базы знаний — хотя бы потому, что именно такая информация помогает адаптироваться новичку. Особенно важно это в первые дни работы в компании, самые тяжёлые с точки зрения и сотрудника, и коллектива. Лучше, если он сможет сразу погрузиться в рабочее окружение.

                Рассказывает наш сотрудник: «Когда я пришёл работать в крупного интегратора решений VoIP, думал, что будет некомфортно — рабочее место должны были оборудовать в течение трёх дней. Мне не хотелось сидеть и видеть, как куча народу работает, а я разглядываю цветы на подоконнике или тыкаю в телефон. Однако я был избавлен от этого — мне сразу дали распечатки базовой информации о продукте, а потом подцепили планшет к внутренней сети и открыли крутой портал с информацией по всем вопросам — его создали сами сотрудники. Я потом тоже вписал туда не одну статью. Кстати, это была CRM, а не Jira. В ней же велись продажи, маркетинг и управление персоналом».  

                Постоянно обучайтесь. Не стоит ограничиваться несколькими действиями в CRM-системе. Лучше всего, если сотрудники сделают её своим основным рабочим столом (по сути, в клиентском отделе и продажах так и должно быть). Не бойтесь пробовать новые функции, создавать процессы, строить отчёты, разбираться в шаблонах документов и т.д. — программу сломать невозможно, изменения можно откатить или удалить, а навык останется (пользуясь случаем, напоминаем в сотый раз — делайте бэкапы!).

                Формируйте внутреннюю экспертизу. Мы уже неоднократно упоминали о том, что нужен один внутренний эксперт, гуру CRM-системы, который владеет и бизнес-процессами, и полностью разбирается в системе. Однако одного эксперта мало — во-первых, он может найти более привлекательную работу и уволиться, а во-вторых, он всё равно не готов охватить специфику всех процессов. Поэтому стоит провести несколько циклов внутреннего обучения и сформировать экспертов во всех подразделениях.

                Вообще, не относитесь к вендорскому и внутреннему обучению формально, оно приносит положительные результаты и здорово облегчает жизнь.

                Практика — first


                Вспомните свои ощущения от нового планшета или смартфона. Первые — радость владения, новенький корпус, яркий экран, другие тактильные ощущения. Потом внезапно всё резко становится неудобно, но делать нечего — и перед сном вы ставите приложения, сёрфите в интернете, листаете ленту в Фейсбуке… И всё, максимум через неделю вы срослись — во многом потому, что часто взаимодействуете с гаджетом. Привыкание к CRM-системе и любому другому программному интерфейсу ничем не отличается от этого процесса.

                Настройте интерфейс CRM-системы. У каждого сотрудника есть свой набор рабочих элементов, свои потребности и даже цветовые предпочтения. Дайте время и ресурсы на настройку системы каждым работником, пусть он приспособит её под себя.

                Заполните справочники и прочие списки категорий. Очень важный этап, без которого лучше даже не начинать пользоваться софтом. У кого-то из вендоров (у нас в том числе) часть справочников изначально настроены, у кого-то нет. В любом случае у вас точно есть своя номенклатура, свои состояния лидов и клиентов, свои этапы воронки продаж, флаги, метки и проч. В процессе наполнения системы этой информацией пользователи привыкают к органам управления CRM-системой, всяким там кнопкам «Ок», «Сохранить», «Применить», горячим клавишам (кстати, их использование облегчает и ускоряет работу с системой — для айтишников это не новость, а вот до пользователей стоит донести) и т.д.

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

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

                Оперативная работа в CRM — привычка свыше нам дана


                Звоните и пишите в CRM и из CRM. Вся оперативная работа, звонки, переписка должны вестись в CRM-системе. Во-первых, это удобно. Во-вторых, это страховка от конфликтов, коллизий и неприятных ситуаций с клиентами, поскольку всё логируется. Наконец, это сквозная автоматизация, которая как раз экономит деньги, делит рутину между человеком и машиной, высвобождает человеческий ресурс для новых задач.

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

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

                Да я жить без CRM не могу


                Помните вот эту байку с Баша?



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

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

                Конечно, то, что мы описали — это фактически самое начало взаимодействия с CRM-системой, и в процессе дальнейшей работы вы получаете огромный пласт полезного инструментария (если что, мы о своей CRM-ке, не во всех есть тот же набор):

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

                И чем дальше пользователь погружается в CRM, тем привычнее и удобнее она ему кажется. Хотя первое знакомство может оказаться не всегда плодотворным. Например, у нас есть сотрудница, которая при каждом новом деле/нововведении/этапе в жизни рисует 21 палочку и зачёркивает по одной каждый день — вычитала когда-то, что человек осваивает новую привычку (новый коллектив, новый образ жизни и т.д.) за три недели. Кстати, неплохой срок для базового освоения возможностей и интерфейса нового для вас программного обеспечения (не путать со сроками внедрения!).

                Ошибки, мешающие восприятию CRM-системы


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

                1. Купили CRM по принципу «чем дороже, тем лучше». Как правило, в очень дорогих системах много лишних для СМБ функций, дорогое обучение, дорогая поддержка, сложная настройка. Дело не в цене, дело в том, насколько система отвечает потребностям вашего бизнеса.
                2. Повелись на внедрение CRM за один день или две недели. Мы реально знаем вендоров, которые обещают любое внедрение за пару недель. Настройтесь на то, что это маркетинговая фишка — если вы морально приготовитесь к месяцу, а внедрение займёт три, вам покажется, что силы уже исчерпаны и пользование CRM-кой начнётся с недовольства.
                3. Воспринимаете CRM как статичное хранилище данных и просто забиваете туда клиентов. Это неправильно — мы все уже давно ушли от контакт-менеджеров и предлагаем решения, которые делают работу быстрой и простой. Раз вы за это заплатили, зачем ходить пешком не стоит игнорировать такие возможности.
                4. Вы избегаете CRM — вам кажется, что дела и так идут хорошо. Поверьте нашему опыту — это до первого увольнения ключевого сотрудника и до первого увода клиенсткой базы.

                Хотя, конечно, если почитать форумы и сообщества менеджеров, то предрассудков наберётся в разы больше. Как вам, например, такое вот суждение?


                Собственно, вот вам и пример как раз шаблонного мышления менеджера

                Мне ничего не помогло, CRM всё равно простаивает


                Да, бывает и такое, что ни одна инструкция по внедрению и ни одна инструкция по началу работы, подробная документация, обучение и т.д. не справляются с задачей — CRM стопорится и никак не хочет становиться союзником компании в борьбе за клиента, отнимает время и нервы. Вероятно, подобрано не самое подходящее решение. Если вы чувствуете, что ничего не помогло, не стоит отказываться от идеи CRM-системы, попробуйте обратиться к другому вендору. Мы неоднократно проводили такие миграции, делали внедрение CRM на неудачной почве предшественника, и ситуация менялась к лучшему. Хотя, конечно, это — пройти весь путь заново.

                CRM-систем сейчас много: новых и развитых, облачных, web, десктопных, дорогих и доступных, мощных и урезанных. В 1989 году в зарубежной прессе было всего одно упоминание CRM, сегодня это сотни тысяч запросов по всем миру. Жить без CRM-системы в 2017 году — откровенно, не самая лучшая идея, поскольку автоматизация давно стала конкурентным преимуществом. Стоит начать процесс внедрения, и вскоре вы поймёте, как менять процессы бизнеса, оптимизировать их, чтобы зарабатывать больше и работать продуктивнее. Дело-то за малым — начать.

                P.S.: у нас идёт акция «Осеннее ускорение», так что если кому-то нужна скидка 15% на разный бизнес-софт (а мы делаем не только CRM-системы), то рады вам помочь, рассказать, провести бесплатную онлайн-презентацию — вы можете всё посмотреть и расспросить, не вставая с любимого кресла. Отвечаем даже на неудобные вопросы (по делу, конечно).
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/338326/


                Метки:  

                Хороший дизайнер копирует чужие логотипы, великий — крадёт

                Среда, 20 Сентября 2017 г. 13:43 + в цитатник
                MagisterLudi сегодня в 13:43 Дизайн

                Хороший дизайнер копирует чужие логотипы, великий — крадёт

                  Я «копировал сочинения», чуток подправлял и сдавал учительнице по русскому.
                  Я копировал чужие программы, подправлял код, экспериментировал, развивал и делал свои программы.
                  Я копировал чужую подпись.
                  Я даже копировал чужие тексты и картинки. Дорабатывал и иногда получались отличные результаты.
                  Или я все украл?



                  В своей статье Ferdinand Vogler поднимает вопрос, чем копирование отличается от кражи и так ли все ужасно с копированием.

                  Не факт, что «плагиатчики» сознательно повторяют то, что видели до этого. Но иногда попадаются уж больно похожие вещи.

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

                  Фердинанд предлагает свое видение того, как различать копирование и кражу:
                  «Украсть» — это значит повторить точь в точь. Компании хотят получить профит от того, что привносит дизайн. Кража — это вышить лого Nike на свитере, чтобы продать их в два раза дороже.

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

                  Когда копирование превращается в кражу? Можно ли скопировать на 100%, указать авторство и публиковать? Можно ли самому создать, но указать чужое авторство?

                  Вот примеры найденные/скопированные с разных мест сети. Осторожно, там очень много картинок.

                  Раз
                  (Скопировано отсюда)

                  Лигатура CS
                  image

                  Человек-дерево
                  image

                  Буква, контрформа
                  image

                  Мёбиус
                  image

                  Животные, контрформа
                  image

                  Символы в воде
                  image

                  Вокруг света
                  image

                  Два
                  (Скопировано отсюда)

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  Три
                  (Скопировано отсюда)
                  image

                  image

                  image
                  Логотип воронежской области и логотип DS Smith

                  image





                  image

                  image

                  image
                  Париж 2024 и 4Global

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image

                  image
                  Логотип ТВшоу The Grand Tour и логотип Белорусского телевидения

                  image
                  12 похожих логотипов на тему М и контрформа.

                  image

                  Четыре
                  (Скопировано отсюда)







                  Фирменный стиль компании Edison Software


                  Мы покопались в интернете и нашли своего «близнеца».



                  А может это мы их скопировали? Путешествие в прошлое покажет, что канадцы — великие художники, отлично крадут :)


                  Смиритесь. Все уже скопировано сделано до нас




                  А у вашего логотипа есть «двойники»?
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338036/


                  Метки:  

                  Создаем уязвимые виртуальные машины в два счета с SecGen

                  Среда, 20 Сентября 2017 г. 13:37 + в цитатник
                  antgorka сегодня в 13:37 Разработка

                  Создаем уязвимые виртуальные машины в два счета с SecGen

                  • Tutorial


                  Сегодня я хочу обратить ваше внимание на интересный проект SecGen при помощи которого становится возможным иметь каждый день новый Metasploitable или другую виртуальную машину для изучения основ этичного хакинга.
                  Все происходит в автоматическом режиме, нужно лишь установить фреймворк. Начинаем!

                  Как это работает?


                  SecGen представляет из себя скрипт, написанный на ruby. В основе его работы лежат Vagrant и Puppet.

                  Напомню, что Vagrant — это инструмент, позволяющий быстро и удобно разворачивать целые инфраструктуры из виртуальных машин, используя гипервизоры VirtualBox, VM Ware локально или облачный сервис Amazon AWS. Вы можете описать все настройки будущей виртуальной машины в специальном файле Vagrantfile. И вам не придется скачивать ISO-образы ОС, т.к. Vagrant уже предлагает множество готовых образов виртуальных машин (box), которые можно скачать из специального каталога.

                  А Puppet — средство автоматизации настройки машин, пришедшее на замену bash скриптам. Puppet имеет понятный язык описания конфигураций. Скрипты хранятся в файлах с расширением .pp. Puppet может установить определенный софт на машину, прежде проверив, что система удовлетворяет требуемым условиям, выполнить его настройку, задать переменные окружения и многое другое.

                  Таким образом SecGen нужно лишь выбрать какой box скачать и развернуть при помощи Vagrant, какой софт установить и настроить при помощи Puppet и сгенерировать флаги, которые нужно найти пентестеру в процессе эксплуатации.

                  SecGen имеет модульную структуру и каждый модуль представляет из себя дистрибутив с уязвимым приложением, его настройки, puppet-скрипты и некоторые дополнительные файлы для его корректной обработки SecGen.

                  Установка


                  Официально тестирование проводится на дистрибутиве Ubuntu и процесс установки описан на официальном github. Я буду использовать 64-битную Ubuntu 16.04.3, которая сама является виртуальной машиной с 2.5 ГБ RAM.

                  Устанавливаем требуемые пакеты

                  sudo apt-get install ruby-dev zlib1g-dev liblzma-dev build-essential patch virtualbox ruby-bundler vagrant imagemagick libmagickwand-dev exiftool

                  Также вам (возможно) потребуется установить еще один пакет, не указанный на официальном сайте

                  sudo apt-get install libpq-dev

                  Теперь клонируем репозиторий github

                  git clone https://github.com/cliffe/SecGen.git

                  Переходим в созданный каталог и выполняем установку всего необходимого

                  cd SecGen
                  bundle install

                  Начнут устанавливаться необходимые библиотеки Ruby



                  Проверяем, что скрипт работает

                  ruby secgen.rb --help

                  И видим доступные опции



                  Создаем свою первую машину со случайным набором уязвимостей


                  Это базовый режим работы SecGen, если никакие ключи не задавать. Выполняем команду

                  ruby secgen.rb run

                  Начнется скачивание Vagrant box-а, который для нас автоматически выбрал SecGen



                  Когда Vagrant образ виртуальной машины скачался и был импортирован, происходит запуск виртуальной машины



                  Автоматически настраивается форвард SSH для доступа к машине на порт 2222. Генерируется ключ, SecGen подключается к машине, устанавливает rsync и производит установку и настройку всего необходимого.



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

                  Будут выполнены все необходимые Puppet скрипты



                  И в конце концов вы увидите сообщение в консоли



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



                  Анатомия



                  В каталоге SecGen, помимо прочих, есть директории projects, scenarios и modules.

                  Проекты

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

                  ruby secgen.rb --project home/user/SecGen/projects/SecGen20170920_1154 build-vms

                  Чтобы получить список проектов, нужно выполнить команду

                  ruby secgen.rb list-projects

                  И получим результат



                  Аналогично есть ключ build-project, задав который будут созданы конфигурационные файлы для Vagrant и Puppet, но виртуальные машины созданы не будут.

                  Сценарии

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

                  
                  
                  
                  
                  	
                  	
                  		storage_server
                  		
                  
                  		
                  		
                  
                  		
                  
                  		
                  	
                  
                  

                  Здесь сказано, что будет создана виртуальная машина с ОС Linux, содержащая две уязвимости типов remote и local. Т.е. сначала нужно будет попасть на сервер через одну уязвимость и потом проэксплуатировать вторую локально.

                  Обычно из названия сценария становится ясно, какую машину создаст SecGen, например сценарий any_random_vulnerability.xml. Рекомендую ознакомиться с примерами в каталоге scenarios/examples.
                  Есть довольно сложные сценарии в каталогах scenarios/security_audit и scenarios/ctf.
                  Для CTF предлагается воспользоваться фронтендом от разработчиков SecGen.

                  Модули

                  Из описания сценариев становится ясно, что модули делятся на категории. Все модули собраны в каталоге modules и разбиты на

                  • bases
                  • build
                  • encoders
                  • generators
                  • networks
                  • services
                  • utilities
                  • vulnerabilities


                  В свою очередь в каждой из групп есть подгруппы, вроде smb, webapp, bash, ftp и т.п.

                  Каждый модуль имеет примерно следующую структуру



                  Файл secgen_metadata.xml подробно описывает модуль. Это необходимо для корректной работы сценариев и выбора этого модуля для подходящего случая

                  Часть файла

                  
                  
                    chkrootkit 0.49 privilege escalation
                    Thomas Shaw
                    MIT
                    
                      chkrootkit 0.49 and earlier contain a local privilege escalation vulnerability allowing a non-root user to place a
                      script in /tmp that will be executed as root when chkrootkit is run. This module adds a cronjob to run chkrootkit
                      periodically for exploitability.
                    
                  
                    privilege_escalation
                    root_rwx
                    local
                    linux
                  ...

                  Каталог manifes содержит puppet скрипты configure.pp, init.pp и install.pp
                  Каталог files содержит необходимые дистрибутивы. В данном случае один файл chkrootkit-0.49.tar.gz

                  Детали проекта

                  Когда проект создан, вы можете найти в нем файл scenario.xml, описывающий, какие уязвимости были использованы и как вообще получить флаги.

                  Например в нашем проекте мы можем найти два XML тега vulnerability, указывающие на модули
                  modules/vulnerabilities/unix/misc/distcc_exec с описанием «Distcc has a documented security weakness that enables remote code execution» и modules/vulnerabilities/unix/desktop/xfce_lightdm_root_login с описанием «Configures XFCE w/ LightDM to automatically login as root without a password\.»

                  Если из описания модуля непонятно, в чем суть, можно перейти в соответствующий каталог и изучить файлы модуля.

                  Так же в каталоге проекта есть скрытая директория .vagrant, в которой, в частности, содержится приватный ключ для доступа к серверу по протоколу SSH под пользователем vagrant. Файл private_key.

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

                  ssh vagrant@127.0.0.1 -p 2222 -i private_key



                  команда ifconfig выдаст нам следующий результат

                  eth0      Link encap:Ethernet  HWaddr 08:00:27:86:1c:fb  
                            inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
                            inet6 addr: fe80::a00:27ff:fe86:1cfb/64 Scope:Link
                            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                            RX packets:125254 errors:0 dropped:0 overruns:0 frame:0
                            TX packets:13570 errors:0 dropped:0 overruns:0 carrier:0
                            collisions:0 txqueuelen:1000 
                            RX bytes:177651061 (169.4 MiB)  TX bytes:1034124 (1009.8 KiB)
                  
                  eth1      Link encap:Ethernet  HWaddr 08:00:27:83:ea:5e  
                            inet addr:172.28.128.3  Bcast:172.28.128.255  Mask:255.255.255.0
                            inet6 addr: fe80::a00:27ff:fe83:ea5e/64 Scope:Link
                            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                            RX packets:8 errors:0 dropped:0 overruns:0 frame:0
                            TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
                            collisions:0 txqueuelen:1000 
                            RX bytes:3130 (3.0 KiB)  TX bytes:2304 (2.2 KiB)
                  
                  lo        Link encap:Local Loopback  
                            inet addr:127.0.0.1  Mask:255.0.0.0
                            inet6 addr: ::1/128 Scope:Host
                            UP LOOPBACK RUNNING  MTU:16436  Metric:1
                            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                            collisions:0 txqueuelen:0 
                            RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
                  


                  Тестируем


                  IP адрес мы выяснили и теперь можешь провести тестирование на проникновение. Проверим доступность виртуальной машины с хоста



                  Сканируем и обнаруживаем следующие открытые порты

                  sudo nmap -n -Pn -p- 172.28.128.3



                  Далее при помощи вашего любимого дистрибутива для тестирования на проникновение можно начинать эксплуатацию distcc.

                  В заключении


                  Конечно, модули пишут люди и возможны ошибки. Но в большинстве случаев SecGen создает корректно настроенные и рабочие виртуальные машины для практики. На официальном сайте на английском языке можно изучить подробную инструкцию по созданию собственных сценариев и модулей, что многократно расширяет возможности SecGen и, я надеюсь, позволит проекту развиваться дальше.
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338274/


                  Метки:  

                  [Из песочницы] Как написать отличную научную статью по CS

                  Среда, 20 Сентября 2017 г. 13:31 + в цитатник
                  bioniwulf вчера в 13:31 Разное

                  Как написать отличную научную статью по CS

                  Здравствуйте!

                  Недавно я наткнулся на запись очень интересного выступления Саймона Пейтона-Джонса(ведущий разработчик языка Haskell) в Microsoft Research Cambridge. В нём он рассказывает студентам, как проводить научные исследования и писать статьи по Computer Science. Его мысли мне показались очень интересными, причем применимыми не только для области CS.



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

                  1. Не оставляйте на потом — пишите
                  2. Выразите вашу идею
                  3. Расскажите историю
                  4. На первом месте ваши результаты
                  5. Разместите похожие статьи в конце
                  6. Поставьте ваших читателей на первое место
                  7. Прислушайтесь к критике

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

                  Не оставляйте на потом — пишите


                  Большая проблема заключается в том статья является заключительным этапом вашего исследования. Звучит логично, не правда ли? Но такой подход неверен. Намного лучший подход заключается в письменном оформлении вашей идеи сразу после её возникновения. Это позволит Вам максимально чётко представить её на формальном языке. И на этом этапе уже может оказаться так, что Вы не до конца сформировали вашу идею или, она изначально была неверна. Таким образом, подобный метод позволяет сформировать и отшлифовать вашу идею задолго до проведения исследования или может сэкономить многие месяцы или годы, которое вы могли потратить на неудачную мысль.

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

                  Подготовка статьи – это основной метод проведения исследования, а не способ его опубликовать.



                  Выразите вашу идею


                  Статья — это не просто результат вашей работы по теме опубликованный в журнале или на конференции. Это способ рассказать другим о вашей идее, о вашем способе решения какой-либо проблемы. Идея… она как вирус, и чем проще и отчётливей вы сможете её сформулировать, тем больше людей она заразит и тем дальше она распространится. Крайне важно сформулировать и передать читателю вашу идею, ибо даже величайшие идеи бесполезны, пока вы их храните при себе.

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

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

                  Не ждите великих идей — просто расскажите миру о ваших идеях. И может оказаться так, что одна из их окажется великой.



                  Расскажите историю


                  В независимости от того, что вы пишите, будь то статья в престижный журнал или в свой блог, заметки для потоковой лекции или семинаров, имеет смысл придерживаться определенной последовательности в своём изложении. Представьте, что вы стоите у доски и вам хочется рассказать о вашей идее. И задача в том, чтобы, пользуясь лишь подручными материалами, постараться донести её вашим слушателям. Вы начнете с того, в чем собственно заключается проблема. Потом перейдете к тому, почему она важна для вас или других людей. Затем расскажите о вашей идее её решения, переходя к подробностям: теоремам, доказательствам, результатам экспериментов и т.д. Затем нужно объяснить, почему ваша идея лучше других. А может в чём-то она хуже?

                  Подобным образом выглядит и структура научной статьи в журнал или на конференцию:

                  • Заголовок (1000 читателей)
                  • Введение (1 страница, 100 читателей)
                  • Задача (1 страница, 10 читателей)
                  • Моя идея (2 страницы, 10 читателей)
                  • Детали (5 страниц, 3 читателя)
                  • Похожие работы (1-2 страницы, 10 читателей)
                  • Заключение и дальнейшая работа (0.5 страницы)

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

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



                  На первом месте ваши результаты


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

                  Часто допускаемая ошибка в представлении задачи заключается в её слишком большой общности и как следует из этого — очевидности:

                  В компьютерных программах есть ошибки. Очень важно их устранять [1,2]. Много исследователей пытались это сделать [3,4,5,6]. Эта задача очень важна.

                  Но ведь разве не понятно, что в программах есть и будут ошибки? Эта актуальность проблемы очевидна. Вместо этого напишите какая конкретно проблема побудила вас к работе над статьёй, пусть даже она всего лишь незначительный отблеск той великой Проблемы, в рамках которой вы действуете:

                  Рассмотрим интересную ошибку в этой программе. <краткое описание>. Сейчас мы покажем метод как можно автоматически находить и устранять такие ошибки.

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

                  Не плодите лишней сложности в статье. Опишите ровно ту проблему которую будете решать.

                  Далее по тексту следует представить основные положения статьи, которые далее вы будете защищать. Лучше это сделать в виде выделенного списка. Каждое из ваших положений должно сопровождаться ссылкой на конкретный раздел статьи, в котором вы ваше положение будете защищать. Каждое защищаемое вами положение должно быть фальсифицируемо. Представив введение в таком виде, вы существенно облегчите работу рецензенту и добавите стройности в ваше повествование. Например:
                  • Мы представили синтаксические и семантические особенности языка, поддерживающего параллельные процессы (Раздел 3). Её уникальные особенности состоят в том…
                  • Мы доказали что данная система типов надёжна, и проверка типов разрешима (Раздел 4).
                  • Мы разработали GUI инструментарий на базе WizWoz и использовали его для реализации текстового редактора (Раздел 5). Объем кода сократился в два раза по сравнению с Java версией


                  Представьте что введение вашей статьи — это прототип, а её тело — реализуемый функционал. Сделайте так что бы ваша статья компилировалась.



                  Разместите похожие статьи в конце


                  Казалось бы, неплохой подход рассказывать различные подходы к решению вашей проблемы, которые были уже реализованы и опубликованы до вас перед описанием вашей идеи. Это хороший академический подход — перед тем, как что-то сделать вы в первую очередь узнаёте, что было сделано до вас. Никому не хочется заново переоткрывать велосипед, не правда ли?

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

                  Две основные причины, почему не стоит писать литературный обзор перед вашим подходом:

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


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



                  Поставьте ваших читателей на первое место


                  До этого мы рассматривали введение статьи. Сейчас мы коснемся непосредственно основного тела — представления вашей идеи, методологии и технических подробностей. И самое важное, о чем бы хотелось сказать в первую очередь — не повторяйте в статье ваш путь решения задачи. Статья — это не пересказ вашего исследования, это способ донести вашу идею читателю. Ваш путь может быть тернист и извилист, он может быть окроплен вашей кровью и страданием, вы могли искать решение несколько лет перепробовав совершенно различные методики. Читателю всё это знать не обязательно, попытайтесь найти кратчайший способ представления вашей основной идеи читателю. Исключением представляется момент, когда читатель может подумать — «Почему не избран этот путь, он же кажется очевидным и более простым?». Возможно вам известно, что это очевидный и простой путь ведёт в тупик. В данном случае это следует указать в статье.

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

                  Добейтесь того, что бы читатель на интуитивном уровне понимал вашу основную идею.



                  Прислушайтесь к критике


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

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

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

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

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



                  P.S. Некоторые замечания по языку и стилю


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

                  • Придерживайтесь сроков. Дедлайны нужны не просто так, старайтесь готовить материал сильно заранее намеченных редакцией или оргкомитетом сроков.
                  • Не нарушайте требования по оформлению статьи. Это может послужить формальным поводом для её отклонения, и вы потеряете время.
                  • Всегда используйте проверку орфографии для вашей статьи.
                  • Используйте визуальные приемы для улучшения восприятия вашей статьи.
                  • Подумайте, как можно выразить ваши слова с помощью рисунка, схемы или диаграммы и сделайте это.
                  • Старайтесь выражать мысли более просто. Лучше написать несколько простых предложений чем одно сложносоставное.
                  • Пассивный залог в вашем тексте хоть и делает его более академическим, но звучит очень сухо. Если можно использовать активный залог — воспользуйтесь этой возможностью.

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

                  Материалы по теме:
                  Презентация в формате pptx
                  Перевод презентации в формате pptx
                  Перевод презентации в формате pdf
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338324/


                  Метки:  

                  Как поделить одного инструктора на всех, чтобы каждому досталось по два. Best practice в обучении ИТ

                  Среда, 20 Сентября 2017 г. 12:58 + в цитатник
                  juliashikova сегодня в 12:58 Управление

                  Как поделить одного инструктора на всех, чтобы каждому досталось по два. Best practice в обучении ИТ

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

                    В «Сетевой Академии ЛАНИТ» новый формат обучения разрабатывали, опираясь на научные исследования – как человек усваивает и как скоро забывает новую информацию, какие факторы отвлекают внимание и в каких условиях обучение более эффективно. Сразу скажу, благодаря новым методикам результаты экзаменов улучшились на 30%. В этой статье я расскажу о научных фактах, которые так повлияли на эффективность нашего обучения. Вы же сможете их использовать где угодно – и в самостоятельном обучении, и в выступлениях на публике, и при подготовке презентаций.




                    Появление Википедии и различных интернет-ресурсов с учебными материалами породило вопросы из серии «Зачем теперь вообще учиться, если вся нужная информация под рукой?»

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

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

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

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

                    Какие же исследования легли в основу нового учебного формата, названного нами «Персональное обучение»?

                    Научим всех и каждого


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


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

                    Оказывается, целенаправленная отработка знаний и навыков гарантированно дает лучший результат.


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

                    Согласно исследованию Блума, лучший результат приносят индивидуальные занятия.


                    Если вспомнить, что эти графики касаются людей, получится, что после лекций на экзамене условно 50 студентов наберут проходной балл, а половина отсеется. А если с каждым из провалившихся студентов позанимается отдельный преподаватель, экзамен успешно сдадут 98% всей аудитории.

                    Источник

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



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

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

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

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


                    А вот что еще дает персональное обучение
                    • Каждый может учиться в своем темпе.
                    • Составление персонального плана обучения: учишься только тому, что не знаешь.
                    • Можно составить персональное расписание.
                    • Можно прерваться в любой момент.
                    • Можно пропустить занятие и наверстать упущенное.


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

                    Впрочем, идея только выглядит простой, но ее реализация «в лоб» приведет к катастрофе. Даже самое интересное видео невозможно смотреть долго, совсем не прерываясь. Поэтому нельзя показывать студентам полную запись выступления преподавателя в течение 45 минут. А у нас курс длится 5 дней по 8 часов!

                    Основные правила хорошего учебного видеоролика

                    Источник

                    Ролики в стиле YouTube


                    Люди лучше воспринимают короткие видеоролики и с большим усилием смогут сосредоточить внимание на обучающем видео дольше 5 минут. Поэтому разбивайте видеоматериал на фрагменты по несколько минут.

                    Постоянная смена кадра


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

                    Эту общечеловеческую реакцию активно эксплуатирует ТВ-реклама, обычно меняя кадр с максимальной частотой – раз в четыре секунды. Этот срок не случаен, он тоже установлен в ходе эксперимента: это максимальное время которое может длиться физический контакт с малознакомыми людьми, чтобы они не испытали неловкие ощущения. То есть за 4 секунды мы успеваем осознать ситуацию, но не успеваем «включить» эмоции.

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

                    Дополнительные приемы


                    Снимая учебное видео для «Сетевой Академии», мы не только постоянно чередуем планы, но и заставляем преподавателей работать с кадром –  что-то нарисовать, подчеркнуть, сделать какое-либо другое дополнительное действие. Эти простые приемы также помогают удерживать внимание зрителя.

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


                    Как усвоить и не забыть – боремся с человеческой природой


                    Источник

                    На эффективность усвоения материала сильно влияет, через какие органы чувств человек воспринимает информацию. Если учащийся читает книгу, он в состоянии воспринять не более 8% материала. Видеофильм увеличивает долю усвоенного материала до 40%. Проговаривание новой темы позволяет овладеть 60% информации. Если человек обсудит новый материал и применит его на практике, он усвоит до 80% информации.


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

                    Как это применить? Самый простой способ, который дает технология, – постоянно варьировать деятельность слушателей: после просмотра видео устройте учащимся тест, дайте практическую работу. После практических занятий человек захочет опять вернуться к видео, потому что компьютер «засасывает» ваше внимание. Выдерните ученика в реальный мир, пусть он пообщается с преподавателем, с коллегами. Пусть возникнет эффект «говорения», после чего можно опять вернуться к видео. Именно такая постоянная (и частая!) смена деятельности заложена в персональное обучение.



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

                    Давайте посмотрим на график посещаемости одного из курсов Coursera на протяжении всего времени, когда он был доступен. Как думаете, с чем связаны периодические пики посещаемости?



                    Угадали? Это время перед промежуточными проверочными работами, когда люди начинают активно учиться. Не только у российских студентов время, когда они учатся эффективнее всего, можно назвать одним единственным словом: сессия.

                    Дафна Коллер, одна из основателей Coursera, комментируя график, сделала замечательный вывод: «Мы доказали, что во всем мире откладывание дел на последний момент – самая популярная стратегия поведения».

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

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

                    Источник

                    Как можно хотя бы попытаться побороть забывчивость?

                    Исследование, опубликованное в журнале Science в 2011 году, выявило, насколько хорошо люди сдают экзамены после разных форм обучения.



                    Однократное обучение подразумевает привычные нам лекции: учащимся один раз рассказывали новый материал, и они сдавали экзамен. Как видно на графике, результаты такого обучения весьма посредственные.

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

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

                    Лучшие результаты на экзамене показала группа учеников, на которых применили практику активного вспоминания материала. Это простой прием, известный всем со школы: на каждом уроке учитель задает классу вопросы по ранее пройденной теме.

                    Со временем любые знания все равно выветриваются из головы. Насколько часто и сколько времени нужно тратить на активное вспоминание информации? Исследование скорости, с которой люди забывают информацию, провел немецкий психолог Герман Эббингауз. В конце XIX века он выстроил свою знаменитую кривую забывания.



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

                    Как же бороться с быстрым забыванием?

                    Чтобы информация, например, от 45-минутного занятия осталась у вас в голове если не навсегда, то надолго, нужно через день повторить ее в течение 10 минут, через неделю потратить на это 5 минут, через месяц – 2-4 минуты. Еще раз повторим (простите за каламбур), что повторить – это значит попытаться активно вспомнить материал. Не прочитать еще раз, а именно вспомнить.



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

                    Бытует мнение, что лектору стыдно повторяться. Наверное, этот предрассудок возник из научной среды, где повторяться, например, в тексте статьи – это почти преступление. На самом деле, если совсем ничего не повторять, всего через месяц едва ли кто из студентов вспомнит хоть что-то из услышанного.

                    Большой выбор интерактивных образовательных материалов – это прекрасно. Или нет?


                    Сегодня чрезвычайно популярно представление информации в самых различных формах. Слушателям недостаточно учебника. Они хотят, чтобы там были упражнения, игры, гиперссылки, учебные активности и т.п. Насколько разнообразным должен быть учебный материал?

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



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

                    А как вы думаете, у какого столика дегустация приводила к большему количеству покупок варенья? Как ни странно, покупок у столика с бОльшим выбором было в десять раз (!) меньше. Все потому, что выбор вгонял людей в ступор и они не могли определиться со своими желаниями. Какой из 24 вкусов предпочесть?

                    Этот психологический момент работает повсеместно. Например, дизайнеры здорово поработали и сделали не 6 вариантов дизайна, а 24? Молодцы? Нет, их надо всех уволить! Теперь заказчик будет долго мучиться, выбирая финальный вариант и скорее всего просто пойдет к конкурентам, у которых он легко выберет свой вариант из трех предложенных.

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

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

                    Использование интерактива в обучении не является безусловным благом. В подтверждение привожу еще одно любопытное исследование.

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



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

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

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

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

                    Как в «Сетевой Академии» внедряли персональное обучение и что из этого вышло
                    Все результаты описанных мной исследований используются в нашем учебном центре в формате «Персональное обучение».

                    Когда я пришла сюда на работу, первым делом решила опробовать на себе новый формат. Обучение шло так гладко, что даже немного меня убаюкало.

                    Я проходила «Продвинутый Excel» и думала, что и так все знаю в таблицах. И тут раз – контрольный вопрос после очередной темы. Здесь-то я и поняла, что последнюю тему проспала с открытыми глазами: вроде все слышала, а оказалось, что нет, потому что не смогла ответить. От удивления я «проснулась», снова пересмотрела этот эпизод и дальше уже более осознанно участвовала в обучении. В традиционном очном обучении такого «пробуждения» могло не случится, а при самообучении, где совсем нет никакого контроля, такое и вовсе невозможно.

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

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

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

                    Идея подобного формата в школьном образовании известна очень давно под названием «Перевернутый класс».

                    Источник

                    На Западе так обучают уже более 15 лет. А «Сетевой Академии», как и другим участникам российского рынка образования, вариацию этой идеи по франшизе в 2010 году предложила одна иностранная компания. Тогда учебный центр оказался первым, кто был готов к экспериментам на этом поле. Во многом потому, что новая форма обучения, казалось, использовала на практике уже известные научные результаты.

                    До подписания договора появилась идея попробовать сделать учебный контент самостоятельно. Результат этого эксперимента оказался интереснее западного аналога.

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

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

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


                    Персональное обучение в цифрах


                    Наши слушатели до и после обучения заполняют опросник, в котором оценивают свои собственные знания, делятся впечатлениями от преподавателей и мнением о том, как работало оборудование учебного центра.

                    На основе их ответов мы сделали график, показывающий:

                    • субъективный прогресс в знаниях – если до курсов человек оценил свои знания на один балл, а после – на десять, значит, его прогресс составит девять баллов;
                    • объективный результат оценки знаний в ходе тестирования (max – 100%);
                    • впечатления от преподавателей (max — 5 баллов);
                    • впечатления о работе оборудования учебного центра (max — 5 баллов).



                    На графике интересно проследить, как отличаются ответы и результаты учащихся персонального и традиционного очного обучения.

                    Выпускники курсов в формате персонального обучения в два раза выше оценивают собственный прогресс по сравнению с учащимися самой эффективной очной формы. Конечно, оценки субъективны – люди могут многое насочинять. Однако эти выпускники действительно лучше сдают экзамены-тесты – разница составляет 30%!

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

                    Когда все слишком хорошо, это тоже немножко плохо


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

                    В книге Гладуэлла Малкольма «Давид и Голиаф. Как аутсайдеры побеждают фаворитов» приведен целый список исследований, которые пытались выявить оптимальный размер класса.


                    Общий вывод этих работ сводится к приведенному графику. Как видим, зависимость успеваемости от размера класса представляет собой перевернутую букву U. Совсем маленькие и совсем большие классы оказались одинаково плохи. Оптимальный вариант – класс среднего размера, позволяющий обсуждать учебный материал, делиться на подгруппы для его проработки.

                    Один из учителей поясняет: «Источник жизненной силы любого класса – дискуссия, а для ее ведения необходима определенная критическая масса. В настоящее время я работаю с классами, где есть ученики, которые вообще никогда не участвуют в обсуждениях, это кошмар какой-то. Если учеников слишком мало, обсуждение тоже страдает. Кажется нелогичным, ведь я всегда считал, что робкие дети, которым неловко выступать в классе из 32 учеников, охотнее разговорятся в классе из 16 человек. Но я ошибался. Робкие дети робели вне зависимости от размера класса. А если класс слишком маленький, то среди участников не наблюдается широкого разброса мнений, необходимых, чтобы дискуссия развивалась. К тому же очень маленькая группа лишена той энергии, что возникает в результате трений между людьми».
                    (Гладуэлл Малкольм «Давид и Голиаф. Как аутсайдеры побеждают фаворитов» )


                    Вся групповая динамика, которую использует преподаватель в очном обучении, – соревновательность, взаимопомощь учеников, коллективное обсуждение – в персональном обучении пропадает.

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

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

                    Разумеется, в обучении всё общение прежде всего направлено на достижение лучшего результата, а эффективность нашего нового формата и так высока. Тем не менее, мы работаем над тем, чтобы попытаться добавить элемент социального взаимодействия в персональное обучение. Если у вас есть идеи, как это сделать, расскажите о них комментариях, будем очень признательны.
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338308/


                    Метки:  

                    Автопилот своими рукам. Добавляем электронное управление steer-by-wire на обычный автомобиль

                    Среда, 20 Сентября 2017 г. 12:41 + в цитатник
                    waiwnf сегодня в 12:41 Разработка

                    Автопилот своими рукам. Добавляем электронное управление steer-by-wire на обычный автомобиль

                      Всем привет. Любому автопилоту, очевидно, нужно не только принимать решения по управлению, но и заставлять автомобиль этим решениям подчиняться. Сегодня увидим, как весьма доступными средствами доработать обычный автомобиль полностью электронным рулевым управлением (steer-by-wire). Оказывается, сам авто для разработки не очень и нужен, а большинство функционала можно с комфортом отлаживать дома или в офисе. В главных ролях всем известные компоненты из хобби-магазинов электроники.


                      Электроника в сборе


                      Задумаемся на секунду, что нужно для системы электронного управления? Сервопривод, который может поворачивать колёса, и контроллер, чтобы сервоприводом управлять. Внезапно, всё это в большинстве современных автомобилей уже есть, и называется "усилитель рулевого управления". Традиционные чисто механические (как правило, гидравлические) усилители стремительно исчезают с рынка, уступая место узлам с электронным блоком управления (ЭБУ). А значит, задача сразу упрощается: нам остается только "уговорить" имеющийся ЭБУ усилителя выдать нужные команды на сервопривод.


                      Очень удобным для доработки оказался KIA Cee'd начиная с 2015 модельного года (скорее всего аналогично и его соплатформенники от KIA/Hyundai). Сошлись одновременно несколько факторов:


                      • Усилитель руля полностью электрический, нет возни с гидравликой, стоит копейки (относительно) на разборках. Вся нужная проводка выведена наружу и легко доступна.
                      • Усилитель интегрирован с рулевой колонкой, поэтому к нему есть легкий доступ на автомобиле и любая дополнительная электроника останется в салоне в тепличных условиях (в отличие от усилителей, интегрированных в рулевую рейку).
                      • Очень важно — есть пример успешной доработки аналогичного KIA Soul. Американская PolySync разрабатывает апгрейд Soul до полностью drive-by-wire платформы для беспилотников, и на их гитхабе можно подсмотреть много полезного.

                      Итак, получена в распоряжение рулевая колонка в сборе:


                      Рулевая колонка KIA Cee'd JD


                      Будем заставлять её крутиться. Для этого нужно создать у блока управления впечатление, что


                      1. Он находится в автомобиле с работающим двигателем.
                      2. Водитель прикладывает вращающее усилие к рулевому колесу.

                      Пойдем по порядку.


                      Симуляция автомобиля


                      Нужно понять интерфейс между электронным блоком управления (ЭБУ) усилителя и остальным автомобилем. Нагуглив электрическую схему видим картинку:


                      Интерфейс ЭУР KIA Cee'd


                      Из схемы видно, что физически интерфейс очень прост:


                      • Питание (12V постоянное) через разъем E29.
                      • Сигнал включенного зажигания (12V) через разъем M46.
                      • CAN-шина данных также через разъем M46.

                      Внешний вид и распиновки разъемов находим на том же сайте.


                      С питанием и зажиганием всё просто, берем 12V с обычного компьютерного блока питания. Но если просто подать питание и зажигание, усилитель полноценно не включится, и усиливать не будет. Дополнительно нужна информация от других блоков автомобиля: работает ли двигатель (чтобы не тратить энергию аккумулятора при выключенном), текущая скорость (чтобы делать руль "тяжелее" на скорости), наверняка что-то ещё.


                      Обмен данными между электронными блоками в современных автомобилях организован по шинам CAN (Controller Area Network). Это широковещательная (у пакетов нет адресов назначения) локальная сеть на витой паре, где каждый блок может публиковать свои данные. У каждого типа данных свой идентификатор. Например, в нашем случае усилитель руля рассылает значения угла поворота руля с ID 0x2B0. Часто бывает несколько физически разделенных шин, чтобы второстепенные блоки типа контроллеров стеклоподъемников не мешались обмену между критически важными компонентами. В Cee'd используется две шины: C-CAN и B-CAN (схема здесь, в части "Информация о канале передачи данных"). На C-CAN "висят" почти все блоки с ней и будем работать.


                      Выбор адаптера CAN-шины


                      Первым делом понадобится CAN интерфейс для компьютера. Детальный обзор возможных решений есть например здесь, цены варьируются от десятков до сотен долларов. По устройствам у нас относительно доступны:


                      1. Адаптеры в сборе с алиэкспресса. Их не пробовал, по слухам довольно много брака и софт видимо только под Windows.
                      2. Arduino шилды на MCP2515/MCP2551, в основном клоны дизайна от seeed в любом магазине ардуинной тематики. Но совмещать такой шилд надо не с Arduino (я так и не смог заставить связку работать на воспроизведение с нужной скоростью), а с Raspberry Pi. В приложении ниже подробная инструкция.
                      3. USB адаптер CANHacker Baby, разработка Artemka86. Выгодно отличается от вариантов с алиэкспресса отличной поддержкой "из первых рук" от разработчика (проверено лично, Артём подходит к делу с душой). Также плюсом является поддержка стандартного протокола LAWICEL совместимого с широким набором софта.

                      Софта разного тоже много (за обзором опять сюда). Самый простой вариант — Linux c can-utils из SocketCAN, за который спасибо инженерам Volkswagen. Большой плюс SocketCAN в стандартизации — любое USB устройство с поддержкой протокола LAWICEL (pdf) видится системой как обычный сетевой интерфейс. Таким образом избегаем привязки к вендор-специфическому софту конкретного устройства. У текущей версии CANHacker есть небольшая несовместимость со стоковыми can-utils по работе с USB, поэтому берём патченную версию отсюда. Raspberry Pi с CAN шилдом работает со стоковым пакетом can-utils из Raspbian OS без проблем.


                      Подключение к шине, запись пакетов


                      С подключением к индивидуальному узлу на стенде всё просто: соединяем контакт CAN-High адаптера с CAN-High автомобильного узла, CAN-Low — c CAN-Low. По стандарту между CAN-High и CAN-Low должно быть 2 замыкающих резистора по 120 Ом, на практике обычно всё работает на довольно широком интервале сопротивлений, у меня например одно на 110 Ом.


                      На автомобиле замыкающий резистор не нужен (они там уже стоят, чтобы шина сама по себе работала). В зависимости от модели авто, возможно придется повозиться с физическим доступом к проводке шины. Самый удобный вариант — разъём OBD-II (on-board diagnostic), он обязателен на всех легковых автомобилях, выпущенных в Европе с начиная 2001-2004 года и находится не дальше 60 см от рулевого колеса. На Cee'd разъём слева под рулём, за пластмасовой крышкой блока предохранителей.


                      Диагностический разъём OBD-II KIA Cee'd


                      Распиновка OBD-II стандартизована и включает шину CAN (CANH на 6 контакте, CANL на 14). Нам повезло, корейцы пошли по пути наименьшего сопротивления и вывели C-CAN, на которой висят все важные узлы, прямо на диагностический разъём:


                      Шлюзы? Не, не слышали.


                      В результате на Cee'd можно прослушать весь внутренний трафик, ничего в авто не разбирая. Когда машина не твоя, а знакомые пустили повозиться — большой плюс. Но такая халява не везде. У Volkswagen например служебная CAN изолирована от OBD шлюзом, поэтому подключаться пришлось бы примерно так:


                      Подключение к служебной CAN шине на Skoda Oсtavia через разъем блока управления КПП.


                      Подключив все контакты, поднимаем сетевой интерфейс:


                      $ sudo slcand -o -c -s6 -S 115200 ttyACM0 slcan0 && sleep 1 && sudo ifconfig slcan0 up

                      Проверяем, что сеть работает и данные принимаются (включив зажигание):


                      $ cansniffer slcan0

                      И наконец, если всё нормально, можно записывать лог:


                      $ candump -L slcan0 > real-car-can-log.txt

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


                      Воспроизведение записи шины на стенде


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


                      $ $ candump slcan0
                        slcan0  2B0   [5]  00 00 00 00 00
                        slcan0  2B0   [5]  FF 7F FF 06 F1
                        slcan0  2B0   [5]  FF 7F FF 06 C2
                        slcan0  2B0   [5]  FF 7F FF 06 D3
                        slcan0  2B0   [5]  FF 7F FF 06 A4
                        slcan0  2B0   [5]  FF 7F FF 06 B5
                        slcan0  2B0   [5]  FF 7F FF 06 86
                        slcan0  2B0   [5]  FF 7F FF 06 97
                        slcan0  2B0   [5]  FF 7F FF 06 68
                        slcan0  5E4   [3]  00 00 00
                        slcan0  2B0   [5]  FF 7F FF 06 79
                        slcan0  2B0   [5]  FF 7F FF 06 4A
                      ....

                      Видим, что рассылаются пакеты 2B0 (текущий угол поворота руля) и, реже, 5E4 (какой-то общий статус усилителя). Отфильтровываем их из общего лога:


                      $ cat real-car-can-log.txt | grep -v ' 2B0' | grep -v ' 5E4 ' > can-log-no-steering.txt

                      Фильтрованный лог можно подавать на воспроизведение:


                      % sudo ifconfig slcan0 txqueuelen 1000
                      $ canplayer -I can-log-no-steering.txt

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


                      Эмуляция усилия на руле


                      Крутящий момент на рулевом валу и угол поворота измеряются встроенным блоком датчиков, от которого идет жгут проводов к блоку управления усилителем:


                      Провода к датчикам угла поворота руля и момента вращения на рулевом вале.


                      Блок управления обрабатывает сигналы датчиков и выдаёт команды сервоприводу на создание дополнительного усилия на поворот рулевого вала.


                      Проверка формата сигнала датчиков


                      По информации PolySync, на Soul, у которого с Cee'd общая платформа, два аналоговых датчика крутящего момента. Cигнал каждого — отклонение уровня постоянного напряжения от базовых 2.5V, провода в жгуте — зеленый и синий. Проверим, что у нас то же самое:


                      • Размыкаем разъем на ЭБУ, пробрасываем нужные контакты через макетку и заводим на аналоговые входы arduino.
                        Кто сказал колхоз?!
                      • Загружаем скетч, в цикле замеряющий напряжения и печатающий их в терминал.
                      • Запускаем Serial Plotter в Arduino IDE, поворачиваем рулевой вал. Видим результат на графике, схема совпадает с Soul:
                        График напряжения с датчиков момента силы на рулевом вале.
                      • Радуемся сэкономленному времени.

                      Эмуляция сигнала датчиков


                      Переходим к эмуляции сигнала датчиков. Для этого поставим свой модуль в разрыв цепи между датиком и ЭБУ, будем транслировать настоящий сигнал с датчика и по команде сдвигать его на фиксированный уровень (изображая приложенное к рулевой колонке усилие). Силами одной arduino это не получится: там нет полноценного цифро-аналогового преобразователя, который мог бы выдавать постоянное напряжение. Аналоговые входы arduino нам тоже не очень подходят — хотя пинов для них целых 6, канал АЦП в контроллере только один, и его переключение между пинами занимает заметное время.


                      Нужно добавить к arduino внешние ЦАП/АЦП. Мне попались модули YL-40 (описание в pdf) на основе чипа PCF8591 — на каждой по 4 канала 8-бит АЦП и 1 8-бит ЦАП. Модуль может общаться с arduino по протоколу I2C. Потребуется небольшое допиливание (в буквальном смысле): китайские товарищи поставили на плату светодиод индикации напряжения на выходе ЦАП — его обязательно надо отсоединить. Иначе утекающий через диод ток не даст ЦАП поднять напряжение на выходе больше 4.2V (вместо штатных 5V). Диод отсоединяем, отковыривая резистор R4 с обратной стороны платы.


                      YL-40 отсоединяем диод от выхода ЦАП


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


                      YL-40 убираем перемычки


                      С интерфейсом к arduino есть нюанс — нам нужно 2 канала ЦАП, соотвественно 2 модуля, но у них одинаковые адреса I2C (зашиты в чип). Хотя чип позволяет менять свой I2C адрес, замыкая определенные ноги на +5V вместо земли, на плате эти перемычки не разведены. Вместо перепайки возьмем костыль — две разные библиотеки I2C на arduino (стандартная Wire и SoftI2CMaster), каждая на свою пару пинов. Получаем модули на разных шинах, конфликт пропадает.


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


                      1. Включаем arduino, открываем Serial Monitor. Важно запустить arduino первой, не останавливать и не прерывать. Иначе напряжение на выходах ЦАПов сбросится, ЭБУ усилителя определит ошибку сигнала с датчиков, уйдет в безопасный редим и придется все перезапускать по новой.
                      2. Запитываем усилитель, подключаем зажигание.
                      3. Запускаем воспроизведение лога CAN-шины.
                      4. Теперь по командам l и r через Serial Monitor усилитель будет поворачивать рулевой вал. Объявляется победа.




                      На сегодня всё, на очереди доработка софта (интеграция с CAN шиной, чтение оттуда текущего угла поворота и динамическое управление крутящим усилием, чтобы внешний контроллер мог задать фиксированный угол поворота руля и система его выдерживала), отработка на автомобиле (на стенде не смоделируешь сопротивление от колёс). Возможно замена 8-битных ЦАП/АЦП на 10 или 12 бит (взял первое, что под руку попалось). Рулящая нейросеть тоже в процессе, надеюсь скоро сделать пост.


                      Спасибо Artemka86 за ценные консультации по работе с CAN и помощь с оборудованием.


                      Ресурсы для дальнейшего погружения


                      1. Car Hacking: The definitive source. Начинать можно с Car Hacking for Poories, там отлично покрыты основы. Остальное тоже интересно, но с упором на несанкционированный доступ.
                      2. The Car Hacker's Handbook: A Guide for the Penetration Tester. Больше деталей, чем в Car Hacking: The definitive source, тоже акцент на несанкционированный доступ. Если читать как первое введение в тему, надо приспособиться пропускать большие куски.
                      3. Car Hacking 101: Tools of the Trade, MCD Software — обзоры инструментов. В основном малоинтересная экзотика на мой взгляд.
                      4. Open Source Car Control — открытая платформа для KIA Soul, в процессе разработки. Они делают полное решение (руль, акселератор, тормоза), включвя доработки по "железу" на машине (в основном для тормозов — ставятся дополнительные тормозные приводы, что-то меняется в тормозной гидравлике итд). Релиза ещё не было, но многие вещи уже можно подсмотреть.


                      Бонус. Совмещаем Raspberry Pi и Arduino CAN shield


                      Прежде всего, внимание, CAN шилд и raspberry pi нельзя соединять напрямую, они не совместимы по напряжению. На Arduino UNO-совместимых платах напряжение логики 5V, а на raspberry pi только 3.3V, поэтому прямое соединение только сожжет задействованные пины.


                      Нам понадобятся:


                      • Raspberry Pi (проверялось на версии 3B).
                      • Arduino CAN шилд на MCP2515/MCP2551.
                      • Преобразователь уровня логики на 5 каналов или больше (можно 2 по 4 канала, но понадобится больше соединений). Мне попался этот

                      Нужно завести на CAN шилд питание (5V), соединения интерфейса данных SPI (4 пина: MOSI, MISO, SCLK, CS) и 1 пин сигнала прерывания. Всё, кроме питания, идет через преобразователь уровня, который в свою очередь тоже надо запитать.


                      На схемах ищем нужные пины.


                      Raspberry Pi:


                      Raspberry Pi pinout


                      CAN шилд:


                      Can shield pinout


                      Получаем результат:


                      • SPI на raspberry pi 19, 21, 23, 24 (MOSI, MISO, SCLK, CS) соответствуют D11, D12, D13, D9 (или на некоторых версиях D10) на CAN шилде.
                      • Прерывание с D2 на шилде можно завести на любой GPIO пин raspberry, у меня это пин 22 (GPIO 25). Номер пина укажем в софте при настройке.

                      Соединяем через преобразователь, заводим нужные напряжения питания на каждую сторону преобразователя, получается такая лапша:


                      Raspberry Pi + Arduino CAN shield


                      Всё, кроме 5V питания и земли на шилд идёт через преобразователь:


                      RPi - CAN shield converter connections labeled


                      Переходим к настройке софта (стандартный Raspbian).


                      1. Включаем поддержку SPI и CAN модуля. В /boot/config.txt добавляем


                        dtparam=spi=on
                        dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,spimaxfrequency=1000000
                        dtoverlay=spi0-hw-cs

                        Здесь interrupt=25 указывает пин, на который заведено прерывание с шилда. Индексация идёт по GPIO пинам, поэтому interrupt=25 это GPIO 25, он же пин 22 по сквозной индексации всех пинов. Также важно указать частоту интерфейса SPI spimaxfrequency, т.к. значение по умолчанию — 10 МГц — слишком высокое для шилда, он просто не соединится.


                      2. Перезагружаем raspberry pi, проверяем соединение с шилдом:


                        $ dmesg
                        ...
                        [   12.985754] CAN device driver interface
                        [   13.014774] mcp251x spi0.0 can0: MCP2515 successfully initialized.
                        ...

                      3. Устанавливаем can-utils:


                        $ sudo apt install can-utils

                      4. Запускаем виртуальный сетевой интерфейс:


                        $ sudo /sbin/ip link set can0 up type can bitrate 500000
                        $ sudo ifconfig can0 txqueuelen 1000

                        Вторая команда важна при воспроизведении большого количества данных с raspberry pi, то есть когда записанный на автомобиле полный лог CAN шины воспоизводим для изолированного узла на стенде. Без увеличения буфера он скорее всего переполнится, когда в логе встретится несколько CAN пакетов с маленькими интервалами, и тогда соединение зависнет.


                      5. Готово, можно пользоваться candump, cansniffer и всем остальным из can-utils.
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/338322/


                      Метки:  

                      Промо в чеке: Как без больших затрат построить программу лояльности для магазина

                      Среда, 20 Сентября 2017 г. 12:32 + в цитатник
                      pilot-retail сегодня в 12:32 Маркетинг

                      Промо в чеке: Как без больших затрат построить программу лояльности для магазина


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

                        Сегодня в России магазины практически всегда выбирают между двумя типами программ лояльности: бонусной и дисконтной. Первая подразумевает отсроченную выгоду для покупателя, вторая даёт ему мгновенную скидку. Кстати, маленькая тайна: магазинам выгоднее использовать бонусную программу. С её помощью проще удержать покупателя: он мотивирован на то, чтобы вновь прийти магазин за выгодой. Покупателям, конечно, зачастую интереснее дисконтная программа: проще сразу же получить скидку на товар, чем копить и потом впоследствии использовать баллы. Но речь не о том.

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

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

                        Промо в чеке


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

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

                        Например, в кассовом софте «Профи-Т» за эту задачу отвечает «Промо-Сервер» — конструктор промоакций. С его помощью маркетолог может легко создавать акции, условием срабатывания которых будет не предъявление покупателем дисконтной или бонусной карт, а покупка определенных товаров (из промо-списка, промо-группы) или купон на скидку (в том числе уникальный из чека). Кроме того, доступен «Отчёт по промоакциям на товары за период», позволяющий легко определить популярные промоакции и сумму скидки, предоставленной покупателям в рамках каждой из них. Таким образом, по анализу поступившей информации можно планировать полноценную систему лояльности.

                        Итак, условно все промоакции подразделяются на две категории:

                        • направленные на увеличение среднего чека (скидка на набор товаров, N+N, неразлучная пара, подарок за покупку);

                        • направленные на удержание покупателей (купон на скидку, рекламный текст, содержащий календарь скидок).

                        Задача фронт-офисной системы — не только обеспечить обработку запросов от касс на применение к оформляемым покупкам тех или иных промоакций, но и правильно распределить получаемую скидку между товарами и наглядно отразить её в чеке. То есть, оформить его таким образом, чтобы у покупателя не оставалось вопросов, за что и какую именно скидку он получил. Соответственно, фронт-офисная система должна при применении скидки рассчитать правильную стоимость товара, определить сумму скидки и указать её в чеке.

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

                        Акции, направленные на увеличение среднего чека


                        Самыми распространенными и эффективными акциями, направленными на увеличение среднего чека, можно назвать:
                        • акция N+N стимулирует покупателя приобретать товар впрок по сниженной цене. Например, 1+1 — два товара по цене одного — подразумевает 50% скидку на товар;



                        • скидка на набор товаров — покупатель получает скидку/подарок при покупке определенного набора товаров. Например, если вы покупаете карандаш и ручку определенного производителя, то его ластик ритейлер готов отдать вам бесплатно. Или же, он подарит вам в подарок игрушку, если вы купили детской одежды на 2000 рублей;


                        В нашем примере при приобретении набора товаров «три по цене двух» — двух лаков для ногтей — покупатель получает в подарок гребень для волос. В чеке он идёт по нулевой цене.

                        • неразлучная пара — это фиксированный набор товаров, при покупке которого один (например, с наименьшей стоимостью) для покупателя будет со скидкой.


                        В этом примере в качестве «неразлучной пары» выступают пудра и тушь — на пудру, как на товар с меньшей стоимостью, покупатель получает скидку 50%.

                        • подарок за покупку — при приобретении определенных товаров покупатель получает подарок на кассе. В чеке может быть указан рекламный текст, рассказывающий о выгоде, доступной ему. Например, уведомляющий его, что при приобретении определённой группы товаров он сможет рассчитывать на подарок. Помимо этого, на кассовом ПО можно вывести напоминание для кассира, чтобы он не забыл отдать презент покупателю.


                        В этом примере на чеке отображается сообщение для покупателя о получении подарка за покупку — мыло Safeguard на кассе. Сообщение о подарке дублируется на мониторе кассиру при переходе в расчётную часть чека.

                        Фронт-офисной системе нужно проанализировать товарную часть чека, определить плавающую скидку и распределить её между товарами. А затем наглядно оформить в чеке, указав стоимость товара до, после применения скидки и общую скидку на чек.

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


                        Акции, направленные на удержание покупателей


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

                        Самыми распространенными и эффективными мероприятиями, направленными на удержание покупателей, можно назвать:
                        • купонная акция;

                        • рекламный текст, содержащий календарь скидок.

                        Купонная акция состоит из двух обязательных этапов: печать купона и его применение (процентная или абсолютная скидка). Интервалы проведения акции могут быть различными: например, сегодня печатаем купон, а завтра применяем скидку. Либо всю неделю в будни печатаем купоны, а в выходные применяем их. Также ритейлер может указать зависимость купона (размера скидки) от суммы совершенной покупки. Например, в чеке на 500 рублей выводится купон на скидку в 5%, при 1000 рублей — на 10%. Уникальный купон формируется фронт-офисной системой динамически и содержит в себе информацию о номерах акции, магазина, кассы, кассовой смены и купона внутри чека. Применяется он единожды.

                        На примере покупатель получает купон на 10% скидку от суммы покупки, действующий в период с 1 по 30 сентября.


                        На этом примере покупатель использовал предоставленный ему купон на 10% скидку. В рамках этого же чека он получил новый купон на следующую покупку.

                        Однако фронт-офисная система может позволить ритейлеру создавать и неуникальные купоны, которыми могут воспользоваться все желающие. Так, «Промо-сервер» позволяет сгенерировать штрих-код в формате изображения, которое потом можно использовать в рекламных буклетах или листовках.

                        Ещё одна важная возможность для привлечения покупателей — это календарь скидок. Если ритейлер планирует, например, в течение недели проводить определенные промоакции для каких-то товаров, то можно уведомлять о них в чеке. Таким образом, покупатель будет точно знать, что, например, если он, придя в магазин в период с 15 по 30 сентября, сможет рассчитывать на 20% скидку на гели для душа.


                        Важно, чтобы фронт-офисная система позволяла не только проводить промоакции, но и анализировать их результаты. Ведь именно от этого напрямую зависит последующий выбор программы лояльности. Например, наш «Промо-Сервер» формирует отчёты, демонстрирующие, какие акции были наиболее популярны: сколько раз они сработали в магазине и сколько ими воспользовались. Помимо этого, он помогает контролировать суммарный уровень скидки: то есть, задать определенный порог, чтобы товар, участвующий в нескольких акциях, не превысил его и магазин не ушёл в минус.
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/338302/


                        Что конкретно входит в понятие «блокчейн»

                        Среда, 20 Сентября 2017 г. 12:28 + в цитатник
                        Kaspersky_Lab сегодня в 12:28 Разработка

                        Что конкретно входит в понятие «блокчейн»

                          Автор статьи — Алексей Маланов, эксперт отдела развития антивирусных технологий «Лаборатории Касперского».

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

                          Давайте разбираться.

                          Предупреждаю сразу, статья философская с пространными рассуждениями и демагогией. Хотите конкретики, читайте другую. Хотите разобраться — читайте третью.


                          Иллюстрация из книги Мелани Свон «Блокчейн. Схема новой экономики»

                          Блокчейн с точки зрения максималистов


                          Начнем с простой точки зрения. Блокчейн — это все технологии, которые используются или будут использоваться в криптовалютах. Включая еще не изобретенные и не реализованные.

                          Что входит в понятие криптовалют, отходит на второй план. Чтобы не отвлекаться, для простоты мы будем считать, что криптовалюты — это валюты из списка https://coinmarketcap.com/currencies/.


                          Топ криптовалют по капитализации (Источник)

                          С одной стороны, такое определение удобно, потому что позволяет делать любые заявления. Например:


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

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

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

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

                          Все они становятся ложными. Ведь мало ли что придумают? Например, в криптовалюте IOTA уже придуманы и используются направленные ациклические графы для организации транзакций — никакой цепочки блоков там нет. Или, например, когда-нибудь, вероятно, заработает Plasma, и тогда блокчейн станет масштабируемым.

                          Блокчейн с точки зрения минималистов


                          Продолжим не менее простой точкой зрения. Блокчейн — это просто база данных с инкрементальной записью. Все. Если мы умеем только дописывать в конец или выкидывать с конца и писать заново, то у нас блокчейн. Выкидывать по логике можно всегда, просто реальные блокчейн-решения стараются пользоваться такой возможностью только в исключительных случаях (например, в случае с 92 млрд биткойнов). Ни распределенности, ни консенсуса, ни блоков, ни ссылок на предыдущие блоки — ничего не требуется.

                          Это определение удобно тем, что на таком блокчейне действительно работают все известные мне криптовалюты.

                          Но такое определение еще более абсурдно и бесполезно, чем предыдущее. Более того, такой «блокчейн» известен лет 100 и называется стеком.

                          Базовая комплектация


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

                          Блокчейн предполагает, что:

                          1. Данные оформлены блоками, что бы из себя эти блоки ни представляли.
                          2. Блок либо является genesis-блоком, либо ссылается на предыдущий.
                          a. Блоки дописываются в конец.
                          b. Выкидывать блоки в рамках нормальной работы запрещено.
                          3. Блоки летают в коммуникационной среде независимо — можно загрузить произвольный блок.
                          4. Блокчейн читается как минимум двумя участниками.
                          5. В блокчейн пишет как минимум один участник.
                          6. Все пишущие достигают консенсуса — блоки соответствуют единому набору правил.
                          a. Очевидное следствие — блокчейн един для всех участников после достижения консенсуса.
                          b. Если в сети наблюдается софт-форк, то «едиными» правилами, очевидно, являются более жесткие.

                          Шпаргалка по понятию софт-форка. Источник

                          Есть что добавить?

                          1. А теперь посмотрим, что осталось за бортом такого определения.
                          2. В понятие «блокчейн» не входят принципы достижения консенсуса: Proof-of-Work, Proof-of-Stake, Proof-of-Authority и другие. А ведь в Proof-of-Work как раз заключается львиная доля инновационности биткойна, родоначальника блокчейна.
                          3. В понятие «блокчейн» не входит принцип децентрализованности. В вырожденном случае выходит, что есть сервер, он пишет в базу, один. Остальные могут читать и проверять, а могут и не проверять.
                          4. В понятие «блокчейн» не входит принцип открытости: он не обязан быть доступным на чтение широкому кругу лиц, тем более на запись.
                          5. В понятие «блокчейн» не входит принцип распределения доверия: участники могут быть исключительно доверенными.
                          6. В понятие «блокчейн» не входит защита от злонамеренных участников: ее может и не быть.
                          7. В понятие «блокчейн» никак не включена криптография. Вряд ли без нее удастся обойтись, но на каком этапе и в каком виде она будет применяться, не определено.

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

                          Кстати, такая конфетка называется частным блокчейном (private/permissioned), и именно на такие блокчейны сейчас делают ставку некоторые компании (и даже госструктуры). Это частный случай давно известных распределенных реестров (не путать с распределенной базой данных), но не каждый распределенный реестр, очевидно, является блокчейном.

                          Продвинутая комплектация — «настоящий» блокчейн


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

                          Сначала определим свойства «настоящего» блокчейна:

                          • Децентрализованный. Это дает неблокируемость/устойчивость, но заодно забирает эффективность (пропускная способность на единицу железа) и масштабируемость (рост пропускной способности с ростом количества железа).
                          • Открытый на чтение. Это дает валидируемость, но заодно и забирает конфиденциальность (которую можно прикрутить сверху обратно).
                          • Открытый на запись. Это дает доступность, но и делает запись платной. Как правило, плата символическая, но этого хватает, чтобы резко ограничить список пишущих.
                          • Неизменяемый. Это дает защиту от фальсификации, но и приводит к замусоренности (чего только не пишут в публичные блокчейны).
                          • С валютой. Это восхитительное свойство особенно ценится в блокчейн-решениях. Оно дает финансовые возможности, но взамен вносит неопределенность в правовой статус проекта. А заодно открывает и риски кибербезопасности.
                          • Доверяемый. Не требует репутации участников.

                          То, что блокчейн-решение должно быть с валютой, конечно, опциональное свойство. Но без валюты не так просто мотивировать участников обслуживать сеть, а значит, не так просто обеспечить децентрализацию — обязательное свойство «настоящего» блокчейна.

                          Для получения описанных свойств дополнительно включим в состав «настоящего» блокчейна следующее:

                          1. Каждый блок, кроме начального, содержит криптографический хеш предыдущего, а не просто ссылается, как в базовой комплектации.
                          2. Консенсус между участниками достигается таким способом, чтобы минимизировать риск переписывания базы меньшинством, как правило, Proof-of-Work или вариации Proof-of-Stake. И это, на мой взгляд, самое важное. Понятие меньшинства определяется выбранным способом.
                          3. Либо используется одноранговая сеть, либо право стать мастер-нодой формально есть у каждого желающего.
                          4. За участие в обеспечении бесперебойной работы сети (формирование корректных блоков) полагается награда в каком-то виде. И поэтому, вероятно, в каждом открытом блокчейне есть свои «койны».
                          5. Каждый участник обладает парой ключей и в том или ином виде удостоверяет свои намерения по записи в блокчейн.

                          Пара свойств (не требований):

                          1. За валидацию корректности базы награда не полагается. Участники делают это ради собственной безопасности либо не делают.
                          2. Каждый участник имеет право послать в сеть транзакцию, удовлетворяющую правилам сети, и рассчитывать, что транзакция будет включена в блокчейн за разумное время при разумной оплате.

                          Блокчейн с заданными нами в начале раздела свойствами часто называется открытым блокчейном (open/public/permissionless). Перспективы применения таких блокчейнов за рамками криптовалют автору кажутся куда более скромными, чем сейчас принято считать. Должны быть веские причины делать что-то децентрализованно, если ничего не мешает сделать это централизованно. Но это лишь личное мнение автора.

                          Дополнительные опции


                          Есть еще такое удобное понятие — «блокчейн-технологии». Это те технологии, которые блокчейном вовсе не являются, но имеют к нему непосредственное отношение — либо являются надстройками, либо улучшениями обычного блокчейна (в любом его определении). Половина из них вполне может использоваться и без блокчейна, просто потребности такой не возникает.

                          Например, Lightning Network — это привычный клиринг, но только построенный на доверии, полученном за счет уже развернутого блокчейна.

                          Другой пример — миксер. Отмывка «грязных» денег посредством смешивания с «чистыми» известна давно, но применительно к криптовалютам преобразилась и стала отдельной технологией с разными вариантами реализации.

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

                          Понятие «блокчейн-технологии» по сути означает то же самое, что максималистский подход к определению блокчейна в первом разделе. Но только мне это понятие нравится больше — это более корректно. Если упоминаются блокчейн-технологии, то это еще не значит, что блокчейн там вообще есть.

                          Заключение


                          Мы попытались определить, что же входит в понятие «блокчейн», а что — нет. Рассмотрели несколько вариантов, от абсурдных до вполне годных. Описали те свойства, которые вытекают из разных границ технологии или, наоборот, которые определяют эти границы.
                          Осталось дело за малым — просто четко понимать, а что же имеется в виду в каждом конкретном случае использования.
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338320/


                          Метки:  

                          Поиск сообщений в rss_rss_hh_new
                          Страницы: 1437 ... 1152 1151 [1150] 1149 1148 ..
                          .. 1 Календарь