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

Поиск сообщений в 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 ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

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

[Из песочницы] Идея черно-белого кино, правильных пчел и безоружных ниндзя в оптимизации сайта

Вторник, 15 Августа 2017 г. 15:30 + в цитатник

План повествования


1. Что такое SEO или эффект черно-белого кино.
2. Идея поисковой оптимизации (правильные пчелы).
3. Стратегия продвижения (безоружные ниндзя).

image

1. Что такое SEO или эффект черно-белого кино


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

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

К счастью, прогресс не стоит на месте, и поисковые системы постоянно Читать дальше →

https://habrahabr.ru/post/335696/


Метки:  

[Перевод] Показатели работы digital-агентства / продакшна (примеры с Запада)

Вторник, 15 Августа 2017 г. 15:25 + в цитатник

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


Примечание: большая часть данных взята из исследования HubSpot на основе опроса 500+ западных агентств (большинство из которых с небольшим штатом до 10 человек и оборотом до $500,000 в год).

Читать дальше ->

https://habrahabr.ru/post/335694/


Метки:  

Красочный код: как цвет помогает в работе с кодом

Вторник, 15 Августа 2017 г. 15:17 + в цитатник
Как программист, работающий с разными языками и на разных платформах, я столкнулась в определенный момент времени с одной неожиданной проблемой: для проведения ревью или же написания собственного кода, приходилось тратить достаточно много времени на переключение между IDE и языками. Возникла потребность в каком нибудь инструменте, который помог бы мне делать это эффективнее и без потери концентрации. И внезапно мне на помощь пришел цвет. И я хочу поделиться этим маленьким лайфхаком.
Читать дальше ->

https://habrahabr.ru/post/335692/


Метки:  

[Перевод] Точность через неточность: Улучшаем Time-объекты

Вторник, 15 Августа 2017 г. 15:12 + в цитатник
При создании value-объекта для хранения времени, я рекомендую выбирать вместе с экспертами в предметной области и вокруг нее с какой точностью он будет храниться.

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


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


$estimatedDeliveryDate = new DateTimeImmutable('2017-06-21');

// представим, что сегодня ТАКЖЕ 2017-06-21
$now = new DateTimeImmutable('now');

if ($now > $estimatedDeliveryDate) {
    echo 'Package is late!';
} else {
    echo 'Package is on the way.';
}

Ожидаемо что, что 21 июня этот код выведет Package is on the way., ведь день еще не закончился и пакет, например, доставят ближе к вечеру.


Несмотря на это код так не делает. Так как не указана часть со временем, PHP заботливо подставляет нулевые значения и приводит $estimatedDeliveryDate к 2017-06-21 00:00:00.
С другой стороны $now вычисляется как… сейчас. Now включает в себя текущий момент времени, который, скорее всего, не полночь, так что получится 2017-06-21 15:33:34 или вроде того, что будет позднее, чем 2017-06-21 00:00:00.

Читать дальше ->

https://habrahabr.ru/post/335494/


Метки:  

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

Вторник, 15 Августа 2017 г. 14:46 + в цитатник
Платон Бегун, руководитель направления контактных центров CTI

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

image

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


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

https://habrahabr.ru/post/335670/


[Перевод] Что за черт, Javascript

Вторник, 15 Августа 2017 г. 14:24 + в цитатник


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


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

Читать дальше ->

https://habrahabr.ru/post/335292/


Метки:  

Редизайн Хабрахабра и Гиктаймс. Финишная прямая

Вторник, 15 Августа 2017 г. 14:01 + в цитатник
Предлагаем вашему вниманию очередную публикацию про редизайн Хабрахабра и Гиктаймс. Наверняка уже кто-то подумал про себя: «Хм, они там как плитку в Москве что ль перекладывают — уже третья или четвёртая публикация про редизайн, а сайт каким был, таким и остался?!» и будет частично прав: сложно «поменять плитку» сразу на всём сайте, поэтому мы решили делать это небольшими итерациями. Чтобы вы успели привыкнуть, а мы — вовремя отреагировать на ваш фидбек.



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

https://habrahabr.ru/post/335642/


Метки:  

[Из песочницы] Отладка Xamarin проектов из VirtualBox на эмуляторе Android

Вторник, 15 Августа 2017 г. 13:30 + в цитатник
На днях задумал я попробовать использовать Visual Studio with Xamarin для написания кросс-платформенного кода сразу под три мобильные платформы. Так как раньше имел дело с AndroidStudio — мне не хватало возможности портирования кода на другие платформы.

В описании Visual Studio Community 2017 говорится красиво, что мол единая бизнес-логика для iOS, Android и Windows 10, единый подход к созданию элементов управления через Xamarin.Forms, собственный эмулятор Xamarin Instant Player и прочие плюшки. А зачем платить больше, если можно бесплатно?
Читать дальше →

https://habrahabr.ru/post/335680/


Метки:  

Новые возможности Veeam Agent for Microsoft Windows 2.0 (в бесплатной и платных версиях)

Вторник, 15 Августа 2017 г. 12:56 + в цитатник
Продукт для резервного копирования физических машин Veeam Agent for Microsoft Windows (раннее Veeam Endpoint Backup FREE) довольно-таки популярен как среди ИТ-администраторов компаний, так и среди пользователей домашних компьютеров. Во втором квартале этого года вышла в свет версия 2.0, уже с названием Veeam Agent и с тремя различными редакциями, включая одну бесплатную. Сегодня я расскажу о нескольких новых фичах, относящихся к работе этого решения с СХД, а также о поддержке Veeam Cloud Connect. Надеюсь, что-то из этих новинок окажется для вас полезным.
Итак, добро пожаловать под кат.


Читать дальше ->

https://habrahabr.ru/post/335628/


Книга «Теория и практика языков программирования. Учебник для вузов. 2-е изд. Стандарт 3-го поколения»

Вторник, 15 Августа 2017 г. 12:45 + в цитатник
image Учебник посвящен систематическому изложению теории и практики языков программирования. Он отражает классическое содержание учебной дисциплины по языкам программирования. Все сложные вопросы поясняются законченными примерами. Кроме того, здесь предлагается полный комплекс задач и упражнений по узловым вопросам. Учебник охватывает базисные разделы следующих дисциплин: теория формальных языков, теория автоматов и формальных языков, языки программирования, программирование, объектно-ориентированное программирование, логическое и функциональное программирование, теория вычислительных процессов.

В новом издании обсуждаются характеристики, а также последние тенденции развития универсальных языков программирования высокого уровня, таких как Scala, Go и Swift; поясняются главные особенности последних стандартов классических языков C++, Java и C#: лямбда-выражения во всех этих языках, cсылочный тип rvalue и семантика перемещения в языке C++ 11, ковариантность и контрвариантность родовых шаблонов в C#; существенно расширено представление скриптового языка Ruby, рассматриваются его блоки, механизмы единичного наследования и подмешивания, а также утиной типизации; добавлено описание аппарата событий и программирования на основе событий; показано применение стиля функционального программирования в скриптовых и объектно-ориентированных языках Python, Ruby, C#, Java, C++, Scala, Go и Swift.
Читать дальше ->

https://habrahabr.ru/post/335672/


Метки:  

Как узнать баланс чужой банковской карты, зная её номер?

Вторник, 15 Августа 2017 г. 12:42 + в цитатник
Мошенники, когда звонят доверчивым владельцам карт и представляются службой безопасности банка, заинтересованным покупателем, сотрудником госорганов или ещё кем-то важным, наверняка выбирают себе жертв, не тратя времени на тех клиентов, у кого мало средств на счету.

Оказывается, узнать баланс чужой карты очень просто.

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

image

Читать дальше ->

https://habrahabr.ru/post/335634/


Метки:  

Intel Optane SSD: возможности и преимущества

Вторник, 15 Августа 2017 г. 11:41 + в цитатник


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


3D X-point: новая энергонезависимая память



3D X-Point (читается 3D crosspoint) — это новая технология энергонезависимой памяти на основе фазового перехода (Phase-Change Memory, сокращённо PCM).

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

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

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

Память на основе фазового перехода: краткая справка



Идея памяти на основе фазового перехода не нова: она была высказана американским изобретателем Стэнфордом Овшинским ещё в 1960-х годах. В 1970 году статью о технологиях PC опубликовал Гордон Мур, один из основателей Intel. В течение последних 10 лет неоднократно предпринимались попытки начать производство такой памяти, но препятствием на пути к её широкому распространению был слишком большой размер ячейки, а также слишком сложный технологический процесс. Эту проблему удалось решить только сейчас. Как именно — Intel держит в секрете.

Чтобы понять, как работает 3D X-Point, вспомним, что такое фазовый переход.
Фазовый переход — это переход вещества из одной термодинамической фазы в другую при изменении внешних условий. Описание деталей — задача, которая выходит далеко за рамки этой статьи; заинтересованных читателей отсылаем к Википедии, где всё разъяснено достаточно ясно и подробно.

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

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


Иллюстрация Pcper.com

Сплавы металлоидов могут переходить из одного состояния в другое, и сопротивление при этом изменяется. В аморфном состоянии они скорее напоминают стекло, а в кристаллическом — металл.

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

Приведём таблицу, в которой память на основе фазового перехода сравнивается с другими видами памяти (взята отсюда):

Свойство PCM EERPROM NOR NAND DRAM
Энергонезависимость да да да да нет
Минимальные размер элемента, нм <10 ~4x ~3x ~1x ~2x
Побитовое изменение данных да да нет нет да
Требуется цикл стирания нет нет да да нет
Скорость записи ~100 МБ/с ~30 КБ/с ~1 МБ/с ~20 МБ/с ~1ГБ/с
Скорость чтения 50 … 100 нс ~200 нс 70 … 100 нс 15… 50 мкс 20 ..80 нс
Количество циклов перезаписи 106… 108 105… 106 105 104… 105 не ограничено


Таблица эта взята из статьи, опубликованной в  2011 году. В то время память на основе фазового перехода существовала лишь в виде экспериментальных образцов. Интересно, что указанные характеристики во многом совпадают с реальными характеристиками 3D X-Point, но есть и целый ряд отличий. В следующем разделе мы рассмотрим технические особенности памяти 3D X-Point более подробно

3D X-Point: основные технические характеристики



Рассмотрев общие принципы работы памяти на основе фазового перехода, перейдём к описанию устройства 3D X-Point. Начнём с разбора технических характеристик (здесь мы опираемся на материалы сайта TechInsights).

Размер модуля памяти 3D X-Point составляет 17.6x13.7 мм (241.12 кв.мм); единственный кристалл памяти X-Point расположен внутри. Размеры кристалла — 16.16 миллиметров в длину и 12.78 миллиметров в ширину. Эффективность памяти на кристалле составляет 91,4%. Это больше, чем значение аналогичного показателя у Samsung 3D 48L V-NAND (70%) и у Intel/Micron 3D FG NAND (84,9%).

Плотность записи данных у памяти 3D X-Point равна 0,62 ГБ/кв.мм, что гораздо ниже, чем у многих представленных на рынке модулей памяти 2D NAND и 3D NAND. Для сравнения: у Toshiba/San Disk плотность записи данных составляет Toshiba/SanDisk и Samsung 3D 48L TLC NAND 2,5 Гбит/мм), а у Toshiba/SanDisk 2D TLC NAND — 1,28 Гбит/мм^2. При этом у памяти DRAM значение этого показателя почти в пять раз ниже.

Есть все основания полагать, что модули оперативной памяти на базе 3D X-Point в ближайшее время получат широкое распространение.

На том же сайте TechInsights не так давно была опубликована фотография микросхемы модуля памяти 3D X-Point:


Иллюстрация TechInsights

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

Ячейки в кристалле расположены в несколько слоёв — отсюда и аббревиатура 3D в названии. Первое поколение 3D X-Point имеет двухслойную структуру и выпускается по 20-нанометровому технологическому процессу. По сравнению с NAND плотность упаковки ячеек у 3D X-Point в 8 — 10 раз выше.

Память на основе фазового перехода работает гораздо быстрее по сравнению с традиционной флэш-памятью. Эксперименты показывают, что время записи в одну ячейку PCM-памяти составляет 19 наносекунд (для сравнения: запись в одну ячейку флэш-памяти занимает несколько миллисекунд).

Важным плюсом такой памяти является долговечность: если флэш-память выдерживают до 10 000 циклов перезаписи, то память 3D X-Point — до 100 000 000 циклов!

Intel Optane SSD: практические преимущества



Предыдущая часть статьи была посвящена вопросам теоретическим аспектам: мы рассказали о технологии 3D X-Point. Рассмотрим теперь вопросы практические и поговорим во возможностях и преимуществах накопителей Intel Optane.

Побитовый доступ к памяти



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

В накопителях на основе технологии 3 D X-Point всё устроено по-другому: как и в памяти DRAM, в них возможен побитовый доступ к памяти. Это позволяет обеспечить в 100 раз более низкий по сравнению с NAND-памятью уровень задержек (latency), полностью избавиться от операций по сбору мусора и сэкономить энергию.

Технология Intel Memory Drive



Накопители Optane могут использоваться не только для хранения и кэширования, но и для расширения оперативной памяти. Достаточно установить специальную программу^ и операционная система будет распознавать Optane не как диск, а как RAM. Система сможет работать с огромными объёмами памяти — гораздо большими по сравнению с теми, что предусматривают её архитектурные особенности. Данные между оперативной памятью и Optane будут распределяться автоматически.

Технология Intel Memory Drive может использоваться, например в области big data и машинного обучения: она позволяет хранит в памяти крупные своды данных и обеспечивать доступ к ним с минимальной задержкой (см. заметку на эту тему здесь).

Увеличивать память с помощью технологии Intel Memory Drive выгодно и с чисто финансовой точки зрения: 1ГБ памяти DDR4 стоит примерно 10 долларов. В случае с Intel Optane даже при текущих далеко не низких ценах стоимость 1ГБ составит чуть больше 4 долларов — почти в два с половиной раза дешевле!

Долговечность



На сайте Intel указана такая характеристика Intel Optane: 30 DWPD (drive writes per day). Это означает, что накопитель можно заполнить информацией, затем стереть и снова перезаписать — и так 30 раз.
Intel Optane хорошо подойдут для использования, например, в качестве кэширующих дисков в облачных сервисах хранения данных или в корпоративных СХД: они способны выдержать любую нагрузку.

Ещё одна важная характеристика дисковых накопителей — это TBW (Total Bytes Written), то есть общий объём информации, которую можно записать на диск в течение всего срока его эксплуатации. Значение этой характеристики у Intel Optane впечатляет: 12.3 Петабайт.

Эти цифры свидетельствуют о том, что новые накопители являются практически вечными, и вполне оправдывают их высокую цену.

Заключение



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

Условия акции просты: вы записываетесь на тестирование, мы выделяем вам сервер с Intel Optane P4800x на борту.

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

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

https://habrahabr.ru/post/335652/


Метки:  

Визуализация результатов латентно-семантического анализа средствами Python

Вторник, 15 Августа 2017 г. 11:09 + в цитатник

Постановка задачи


Семантический (смысловой) анализ текста – одна из ключевых проблем как теории создания систем искусственного интеллекта, относящаяся к обработке естественного языка (Natural Language Processing, NLP), так и компьютерной лингвистики. Результаты семантического анализа могут применяться для решения задач в таких областях как, например, психиатрия (для диагностирования больных), политология (предсказание результатов выборов), торговля (анализ востребованности тех или иных товаров на основе комментариев к данному товару), филология (анализ авторских текстов), поисковые системы, системы автоматического перевода. Поисковая машина Google полностью построена на семантическом анализе.

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

Анализ публикаций в сети по латентно семантическому анализу (LSA) показывает, что визуализация результатов анализа приведена только в двух публикациях [1,2] в виде двух координатного графика семантического пространства с нанесенными координатами слов и документов. Такая визуализация не позволяет однозначно определить группы близких документов и оценить уровень их смысловой связи по принадлежащим документам словам. Хотя в моей публикации под названием “Полный латентно семантический анализ средствами Python” [1] предпринималась попытка использования кластерного анализа результатов латентно семантического анализа, однако были определены только метки кластеров и координаты центроидов для групп слов и документов без визуализации.

Визуализация результатов LSA методом кластерного анализа


Приведём все этапы LSA включая визуализацию результатов методом кластеризации:

  1. Из анализируемых документов исключаются стоп-слова. Это слова, которые встречаются в каждом тексте и не несут в себе смысловой нагрузки, это, прежде всего, все союзы, частицы, предлоги и множество других слов.
  2. Из анализируемых документов необходимо отфильтровать цифры, отдельные буквы и знаки препинания.
  3. Исключить слова, которые встречаются во всех документах только один раз. Это не влияет на конечный результат, но сильно упрощает математические вычисления.
  4. Со всеми словами из документов должна быть проведена операция стемминга – получение основы слова.
  5. Составить частотную матрицу индексируемых лов. В этой матрице строки соответствуют индексированным словам, а столбцы — документам. В каждой ячейке матрицы должно быть указано, какое количество, раз слово встречается в соответствующем документе.
  6. Полученную частотную матрицу следует нормализовать. Стандартный способ нормализации матрицы TF-IDF [3].
  7. Следующим шагом мы проводим сингулярное разложение полученной матрицы. Сингулярное разложение [4]; – это математическая операция, раскладывающая матрицу на три составляющих. Т.е. исходную матрицу M мы представляем в виде:
    M = U*W*V^t
    где U и V^t – ортогональные матрицы, а W – диагональная матрица. Причем диагональные элементы матрицы W упорядочены в порядке убывания. Диагональные элементы матрицы W называются сингулярными числами.
  8. Отбросить последние столбцы матрицы U и последние строки матрицы V^t, оставив только первые 2. Это соответственно координаты X, Y каждого слова для матрицы U и координаты X, Y для каждого документа в матрице V^t. Разложение такого вида называют двумерным сингулярным разложением.
  9. Отбросить последние столбцы матрицы U и последние строки матрицы V^t, оставив только первые 3. Это соответственно координаты X, Y, Z каждого слова для матрицы U и координаты X, Y ,Z для каждого документа в матрице V^t. Разложение такого вида называют трёхмерным сингулярным разложением.
  10. Подготовка исходных данных в виде вложенных списков координат X, Y для двух столбцов матрицы U слов и двух строк матрицы V^t документов.
  11. Построение диаграмм евклидовых расстояний меду строками двух столбцов матицы U и столбцами двух строк матрицы V^t.
  12. Выделение количества кластеров [5,6,7].
  13. Построение диаграмм и дендрограмм.
  14. Подготовка исходных данных в виде вложенных списков координат X, Y, Z для трёх столбцов матрицы U слов и трёх строк матрицы V^t документов.
  15. Выделение количества кластеров.
  16. Построение диаграмм и дендрограмм.
  17. Сравнение результатов кластерного анализа для двумерного и трёхмерного сингулярного разложения нормализованной частотной матрицы слов и документов.


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

Программа для визуализации результатов LSA
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy
from numpy import *
import nltk
import scipy
from nltk.corpus import brown
from nltk.stem import SnowballStemmer
from scipy.spatial.distance import pdist
from scipy.cluster import hierarchy
import matplotlib.pyplot as plt
stemmer = SnowballStemmer('russian')
stopwords=nltk.corpus.stopwords.words('russian')
#Тестовый набор документов из коротких новостей
docs =[
    "Британская полиция знает о местонахождении основателя WikiLeaks",# Документ № 0
    "В суде США начинается процесс против россиянина, рассылавшего спам",# Документ №1
    "Церемонию вручения Нобелевской премии мира бойкотируют 19 стран",# Документ №2
    "В Великобритании основатель арестован основатель сайта Wikileaks Джулиан Ассандж",# Документ №3
    "Украина игнорирует церемонию вручения Нобелевской премии",# Документ №4
    "Шведский суд отказался рассматривать апелляцию основателя Wikileaks",# Документ №5
    "НАТО и США разработали планы обороны стран Балтии против России",# Документ №6
    "Полиция Великобритании нашла основателя WikiLeaks, но, не арестовала",# Документ №7
    "В Стокгольме и Осло сегодня состоится вручение Нобелевских премий"# Документ №8
]
word=nltk.word_tokenize((' ').join(docs))# Разбиение всего текста на слова
n=[stemmer.stem(w).lower() for w in word if len(w) >1 and w.isalpha()]#Стемминг всех слов с исключением символов
stopword=[stemmer.stem(w).lower() for w in stopwords]#Стемминг стоп-слов
fdist=nltk.FreqDist(n)
t=fdist.hapaxes()#Слова которые встречаются один раз в тексте
#Построение частотной матрицы А
d={};c=[] 
for i in range(0,len(docs)):
    word=nltk.word_tokenize(docs[i])
    word_stem=[stemmer.stem(w).lower()  for w in word if len(w)>1 and  w.isalpha()]
    word_stop=[ w for w in word_stem if w not in stopword]
    words=[ w for w in word_stop if w not in t]
    for w in words:
        if w not in c:
            c.append(w)
            d[w]= [i]
        elif w in c:
            d[w]= d[w]+[i]
a=len(c); b=len(docs)
A = numpy.zeros([a,b])
c.sort()
for i, k in enumerate(c):
    for j in d[k]:
        A[i,j] += 1
# TF-IDF нормализация матрицы А    
wpd = sum(A, axis=0)
dpw= sum(asarray(A > 0,'i'), axis=1)
rows, cols = A.shape
for i in range(rows):
    for j in range(cols):
             m=float(A[i,j])/wpd[j]
             n=log(float(cols) /dpw[i])
             A[i,j] =round(n*m,2)
#Сингулярное разложение нормализованной матрицы А
U, S,Vt = numpy.linalg.svd(A)
rows, cols = U.shape
for j in range(0,cols):
           for i  in range(0,rows):
               U[i,j]=round(U[i,j],4)
print('Первые 2 столбца ортогональной матрицы U слов') 
for i, row in enumerate(U):
    print(c[i], row[0:2])
res1=-1*U[:,0:1]; res2=-1*U[:,1:2]
data_word=[]
for i in range(0,len(c)):# Подготовка исходных данных в виде вложенных списков координат
    data_word.append([res1[i][0],res2[i][0]])
plt.figure()
plt.subplot(221)
dist = pdist(data_word, 'euclidean')# Вычисляется евклидово расстояние (по умолчанию)
plt.hist(dist, 500, color='green', alpha=0.5)# Диаграмма евклидовых расстояний
Z = hierarchy.linkage(dist, method='average')# Выделение кластеров
plt.subplot(222)
hierarchy.dendrogram(Z, labels=c, color_threshold=.25, leaf_font_size=8, count_sort=True,orientation='right')
print('Первые 2 строки ортогональной матрицы Vt документов')
rows, cols = Vt.shape
for j in range(0,cols):
    for i  in range(0,rows):
        Vt[i,j]=round(Vt[i,j],4)
print(-1*Vt[0:2, :])
res3=(-1*Vt[0:1, :]);res4=(-1*Vt[1:2, :])
data_docs=[];name_docs=[]
for i in range(0,len(docs)):
    name_docs.append(str(i))
    data_docs.append([res3[0][i],res4[0][i]])   
plt.subplot(223) 
dist = pdist(data_docs, 'euclidean')
plt.hist(dist, 500, color='green', alpha=0.5)
Z = hierarchy.linkage(dist, method='average')
plt.subplot(224)
hierarchy.dendrogram(Z, labels=name_docs, color_threshold=.25, leaf_font_size=8, count_sort=True)
#plt.show()
print('Первые 3 столбца ортогональной матрицы U слов') 
for i, row in enumerate(U):
    print(c[i], row[0:3])
res1=-1*U[:,0:1]; res2=-1*U[:,1:2];res3=-1*U[:,2:3]
data_word_xyz=[]
for i in range(0,len(c)):    
    data_word_xyz.append([res1[i][0],res2[i][0],res3[i][0]])
plt.figure()
plt.subplot(221)
dist = pdist(data_word_xyz, 'euclidean')# Вычисляется евклидово расстояние (по умолчанию)
plt.hist(dist, 500, color='green', alpha=0.5)#Диаграмма евклидовых растояний
Z = hierarchy.linkage(dist, method='average')# Выделение кластеров
plt.subplot(222)
hierarchy.dendrogram(Z, labels=c, color_threshold=.25, leaf_font_size=8, count_sort=True,orientation='right')
print('Первые 3 строки ортогональной матрицы Vt документов')
rows, cols = Vt.shape
for j in range(0,cols):
    for i  in range(0,rows):
        Vt[i,j]=round(Vt[i,j],4)
print(-1*Vt[0:3, :])
res3=(-1*Vt[0:1, :]);res4=(-1*Vt[1:2, :]);res5=(-1*Vt[2:3, :])
data_docs_xyz=[];name_docs_xyz=[]
for i in range(0,len(docs)):
    name_docs_xyz.append(str(i))
    data_docs_xyz.append([res3[0][i],res4[0][i],res5[0][i]])   
plt.subplot(223) 
dist = pdist(data_docs_xyz, 'euclidean')
plt.hist(dist, 500, color='green', alpha=0.5)
Z = hierarchy.linkage(dist, method='average')
plt.subplot(224)
hierarchy.dendrogram(Z, labels=name_docs_xyz, color_threshold=.25, leaf_font_size=8, count_sort=True)
plt.show()

Результат работы программы
Первые 2 столбца ортогональной матрицы U слов
wikileaks [-0.0741 0.0991]
арестова [-0.023 0.0592]
великобритан [-0.023 0.0592]
вручен [-0.0582 -0.5008]
нобелевск [-0.0582 -0.5008]
основател [-0.0804 0.1143]
полиц [-0.0337 0.0846]
прем [-0.0582 -0.5008]
прот [-0.5954 0.0695]
стран [-0.3261 -0.169 ]
суд [-0.3965 0.1488]
сша [-0.5954 0.0695]
церемон [-0.055 -0.3875]
Первые 2 строки ортогональной матрицы Vt документов
[[ 0.0513 0.6952 0.1338 0.045 0.0596 0.2102 0.6644 0.0426 0.0566]
[-0.1038 -0.1495 0.5166 -0.0913 0.5742 -0.1371 0.0155 -0.0987 0.5773]]
Первые 3 столбца ортогональной матрицы U слов
wikileaks [-0.0741 0.0991 -0.4372]
арестова [-0.023 0.0592 -0.3241]
великобритан [-0.023 0.0592 -0.3241]
вручен [-0.0582 -0.5008 -0.1117]
нобелевск [-0.0582 -0.5008 -0.1117]
основател [-0.0804 0.1143 -0.5185]
полиц [-0.0337 0.0846 -0.4596]
прем [-0.0582 -0.5008 -0.1117]
прот [-0.5954 0.0695 0.1414]
стран [-0.3261 -0.169 0.0815]
суд [-0.3965 0.1488 -0.1678]
сша [-0.5954 0.0695 0.1414]
церемон [-0.055 -0.3875 -0.0802]
Первые 3 строки ортогональной матрицы Vt документов
[[ 0.0513 0.6952 0.1338 0.045 0.0596 0.2102 0.6644 0.0426 0.0566]
[-0.1038 -0.1495 0.5166 -0.0913 0.5742 -0.1371 0.0155 -0.0987 0.5773]
[ 0.5299 -0.0625 0.0797 0.4675 0.1314 0.3714 -0.1979 0.5271 0.1347]]


Диаграммы и дендрограмм двумерного сингулярного разложения нормализованной частотной матрицы слов и документов.



Получена чёткая визуализация близости документов (см. docs) и принадлежности слов к документам.

Диаграммы и дендрограмм трёхмерного сингулярного разложения нормализованной частотной матрицы слов и документов.



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

Выводы


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

Ссылки


  1. Полный латентно семантический анализ средствами Python.
  2. Латентно-семантический анализ и поиск на Python.
  3. TF-IDF-Википедия.
  4. Сингулярное разложение — Википедия.
  5. Визуализация кластерного анализа в Python (модули hcluster и matplotlib).
  6. Иерархический кластерный анализ на языке программирование Python.
  7. Алгоритм k-means [Кластерный анализ и Python].
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335668/


Метки:  

Coco Framework — блокчейн по-крупному

Вторник, 15 Августа 2017 г. 10:58 + в цитатник
Технология блокчейн получила широкую известность в связи с быстро набравшими популярность криптовалютами. Однако её возможности куда шире. Благодаря своей децентрализованности и прозрачности, блокчейн может стать удобным средством для построения профессиональных и корпоративных информационных средств – любых, где требуется самоконтролируемый обмен сообщениями о транзакциях.



Однако для того, чтобы стать профессиональным инструментом, блокчейн должен соответствовать жестким требованиям по производительности и безопасности, иметь хорошую репутацию и открытый код. Осознавая это, два компьютерных гиганта, Intel и Microsoft, решили «с нуля» создать принципиально новую блокчейн-систему, Coco Framework. Ее принципиальная особенность – поддержка технологии Intel Software Guard Extensions (Intel SGX) для аппаратного ограничения доступа к данным блокчейна и ускорения процесса их обработки.

По обещаниям разработчиков, исходный код Coco Framework будет выложен на GitHub в начале 2018 года. Под катом вы найдете инфографику о преимуществах Intel SGX с точки зрения блокчейна.
Читать дальше ->

https://habrahabr.ru/post/335658/


Метки:  

Как мы участвовали в первом Лигалтех хакатоне СНГ и почему решили делать ещё один в Москве

Вторник, 15 Августа 2017 г. 10:53 + в цитатник
Мы давно делаем b2b-решения небольшой командой и вообще счастливы. Однако in-house, это как фриланс. Однажды ты обнаруживаешь себя работающим в трусах в 4 ночи вокруг грязной посуды. Стали искать аутсорс, смотреть в сторону других технологий и проектов. В мае нас с супругой пригласили на лигалтех-хакатон в Киеве и, конечно, мне было очень интересно. Жена лигал, я тех, отличная команда. Мы собрали вещи и покатили.



Пока ехали в поезде, думали, с каким проектом пойдём. Хотели сделать бота для налоговых вычетов, но вроде сбертех это делал, да и профита там мало. Была идея сделать личного помощника по всем юр.вопросам, некий мост между клиентами и биржами юристов. В итоге остановились на системе автоматизации работы m&a-юриста венчурного фонда. Так сказать и задачка интересная, и mvp поможет супруге на работе, избавив от рутины и необходимости в помощнике.



Погуляв по Киеву, расписали MVP и легли спать. Взбодрившись ирландским кофе с утра, пошли на открытие. Победа для меня не была самоцелью, но я чувствовал наше превосходство ;) Мы практики, с большим опытом, с опытом запуска бизнеса, привлечения инвестиций, а тут студентики какие-то. Так я думал до представления команд. Самооценка падала постепенно, но уверенно ))) Те самые «студенты» предлагали интересные продукты, к некоторым из команд я сам бы с удовольствием подключился. Единственное, что вселяло в меня веру в успех — наше трудолюбие. Не каждый выдерживает сутки работы без сна, а себе я периодически устраиваю такие встряски.



К нашему проекту присоединилось 3 человека — 2 юриста и разработчик. Сначала я думал, что оно нам не надо, но я сильно ошибался. Ребята взяли на себя работу по презентации, часть кода и много поддерживали. Вдвоём я вообще не уверен, что мы бы справились.

В качестве mvp мы решили показать путь подписания документов при привлечении инвестиций для стартапа, шаблонизировать их, предлагая юристу или стартапу заполнить анкету и загрузить фотографию своих подписей. Заполнив анкету и загрузив подпись, система сама генерила docx-договоры (NDA, dd, ts и т.п.) с уже проставленными подписями и данными. Это лишь одна из задач будущей системы, но для суточного хакатона вполне подойдёт.



Накидали бэклог для канбана, оставалось порядка 20 часов. Я прикинул, что на фронт нам потребуется порядка 3-4 часов, поставил пару будильников и мы приступили к бэкенду.

Редбул лился, код мутился. Ближе к утру стало понятно с чем мы успеваем, с чем не очень, с какими проблемами столкнулись и что в итоге у нас получается. Мы закончили бэкенд, успев реализовать 99% задумок, было 7 утра. Я поставил будильник на час и улёгся на пуфик. В 8 утра народ начал стягиваться обратно на площадку, а мы сели за фронт. У нас был готов код для шаблонизации вордовских документов, был написан небольшой CV для поиска и «вычленения» подписи с фотки, однако, наш шаблонизатор не умел вставлять картинки туда, куда нам надо. Это немного печалило, но время шло и мы решили не отвлекаться на это. Покажем при демонстрации MVP, что мы это сделали, но в готовый документ не встанет, жаль, но ладно. Спасибо Ангуляру и Бутстрапу — мы достаточно быстро накидали интерфейс как для юриста фонда, так и для стартапа.

Презентация 5 минут. И тут началось самое интересное ) Ребята показывали хорошие проекты, хорошие и разные, близкие к потребителю, явно ближе, чем наш b2b-инструмент. Тут уже я начал нервничать, я понимал, что победа не главное, но победить-то хотелось ) Были, конечно, и промахи. Например, одна из команд приехала уже с готовым проектом, в чём честно признались.

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



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



После хакатона в Киеве мы задумались о развитии лигалтех-движения в России и в Москве. Оказалось, его не так много, почти нет. Нам очень понравился формат, участие и участники. Лигалтех из «какого-то там направления» стал для нас очень интересным вектором.

Захотелось провести свой хакатон, но перед ним нужно заявить о себе, что мы и сделаем 30 августа на первом мероприятии нашего лигалтех-движения в Москве. Мы уже договорились с топ-3 юридическими вузами о прямой поставке студентов, договорились с СМИ, нашли чумовую площадку для проведения ивента и активно набираем ЦА для проведения первой встречи. Мероприятие бесплатное, наша задача — развитие лигалтеха, а не моментальная прибыль. Поэтому если кому покажется интересным провести 30 августа (среда) в компании единомышленников, пообсуждать лигалтех, его будущее и узнать наши планы по хакатону, пишите в личку, отвечу всем.

Обращаясь к Киевским ребятам, которые двигают там лигалтех, хочется ещё раз сказать спасибо! Вы все большие молодцы. И то, что вы делаете для лигалтеха — бесценно.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335626/


Метки:  

Исследование асинхронной схемы в ModelSim

Вторник, 15 Августа 2017 г. 10:51 + в цитатник


Прочитал статью FPGA/Асинхронный дешифратор от ajrec.

Я сперва прочитал и ничего не понял, а потом прочитал еще раз и опять ничего не понял. На самом деле я прочитал уже все статьи ajrec про асинхронные схемы и должен констатировать, что мало понимаю, что это вообще такое (хотя считаю, что опыт проектирования в FPGA у меня есть).

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

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

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

Честно говоря, изложенное в статье "Асинхронный дешифратор" и "Система синтеза самосинхронных схем Petrify: проблемы и их решение" плохо влазит в мою голову. Я основательно «испорчен методикой синхронного дизайна».

Кроме того, в статье есть странности, которые режут глаз. Вот, например, цитата:

Выходные сигналы:
q1 — переключается если r1=1 и r2=1;
q2 — переключается если r1=1 и r2=0;
q3 — переключается если r1=0 и r2=1;
q4 — переключается если r1=0 и r2=0.

Я наверное придираюсь, но с трудом представляю себе программиста, который пишет нумерацию сигналов начинающуюся с единицы и чтобы q4 переключается, когда r1=0 и r2=0. В моей голове все строго по шаблону: { 0, 0 } — соответствует сигналу q0. { 0, 1 } — соответствует сигналу q1. { 1, 0 } — соответствует сигналу q2 и { 1, 1 } — соответствует сигналу q3. Но это, конечно, мелочи, которые не относятся к делу.

Основная же претензия с моей стороны: автор не проверяет свои гипотезы/исследования/проекты в ПЛИС или любым другим способом. Он пишет: «У меня нет возможности проверить схему в реальном воплощении.» Ну как так то?

Собственно это и подтолкнуло меня к мысли попробовать просимулировать логику описанного ajrec дешифратора. Временная симуляция — это достаточно хорошая модель, которая будет показывать поведение схемы в реальной ПЛИС. Правда… тут есть нюанс — у меня нет полной уверенности, что ModelSim сможет достоверно симулировать асинхронные схемы: симулятор ModelSim предназначен прежде всего для «традиционного» синхронного дизайна.

Итак. Исходный код из статьи FPGA/Асинхронный дешифратор у нас не знаю на каком языке и выглядит следующим образом:

e=NOT(o1); e1=AND(o1,j1); e2=AND(o2,h1); e3=NAND(e,i1);
e4=OR(o2,h1); f1=AND(d,r1); f2=AND(d,r2); g=NOT(d);
h1=NOR(g,r1); h2=NOR(g,r2); i1=NOR(f1,j1); i2=NOR(f2,j2);
j1=NOR(g,i1); j2=NOR(g,i2); k1=AND(e1,j2); k2=AND(e1,h2);
k3=AND(e2,j2); k4=AND(e2,h2); l1=AND(t1,i2); l2=NOR(t2,h2);
l3=AND(t3,i2); l4=NOR(t4,h2); m1=NOR(k1,n1); m2=NOR(k2,n2);
m3=NOR(k3,n3); m4=NOR(k4,n4); n1=NOR(l1,m1); n2=NOR(l2,m2);
n3=NOR(l3,m3); n4=NOR(l4,m4); o1=NOR(p1,p2); o2=NOR(p3,p4);
p1=NOR(m1,s1); p2=NOR(m2,s2); p3=NOR(m3,s3); p4=NOR(m4,s4);
s1=NOR(n1,l1); s2=NOR(n2,l2); s3=NOR(n3,l3); s4=NOR(n4,l4);
t1=NOR(e3,s1); t2=OR(e3,s2); t3=NOR(e4,s3); t4=OR(e4,s4);
q1=NOR(s1,k1); q2=NOR(s2,k2); q3=NOR(s3,k3); q4=NOR(s4,k4).


Далее в статье идет эквивалентная схема этой штуки и говорится о том, что вообще-то сигналы m1, m2, m3, m4 нужно еще сбрасывать в исходное состояние перед началом работы. Хорошо, перепишу все это на язык Verilog вот так:

module test(
	input wire d,
	input wire r1,
	input wire r2,
	input wire set0,
	output wire q1,
	output wire q2,
	output wire q3,
	output wire q4,
	output wire [3:0]qq
);

wire e, e1, e2, e3, e4;
wire f1, f2;
wire g;
wire i1, i2;
wire j1, j2;
wire h1, h2;
wire k1, k2, k3, k4;
wire l1, l2, l3, l4;
wire m1, m2, m3, m4;
wire n1, n2, n3, n4;
wire o1, o2;
wire p1, p2, p3, p4;
wire s1, s2, s3, s4;
wire t1, t2, t3, t4;

function NOT;
input s;
begin
	NOT=~s;
end
endfunction

function AND;
input s1,s2;
begin
	AND=s1&s2;
end
endfunction

function NAND;
input s1,s2;
begin
	NAND=~(s1&s2);
end
endfunction

function OR;
input s1,s2;
begin
	OR=s1|s2;
end
endfunction

function NOR;
input s1,s2;
begin
	NOR=~(s1|s2);
end
endfunction

assign e=NOT(o1);     assign e1=AND(o1,j1); assign e2=AND(o2,h1); assign e3=NAND(e,i1);
assign e4=OR(o2,h1);  assign f1=AND(d,r1);  assign f2=AND(d,r2);  assign g=NOT(d);
assign h1=NOR(g,r1);  assign h2=NOR(g,r2);  assign i1=NOR(f1,j1); assign i2=NOR(f2,j2);
assign j1=NOR(g,i1);  assign j2=NOR(g,i2);  assign k1=AND(e1,j2); assign k2=AND(e1,h2);
assign k3=AND(e2,j2); assign k4=AND(e2,h2); assign l1=AND(t1,i2); assign l2=NOR(t2,h2);
assign l3=AND(t3,i2); assign l4=NOR(t4,h2); 

assign m1=NAND( set0, OR(k1,n1)); /* NOR(k1,n1); */
assign m2=NAND( set0, OR(k2,n2)); /* NOR(k2,n2); */
assign m3=NAND( set0, OR(k3,n3)); /* NOR(k3,n3); */
assign m4=NAND( set0, OR(k4,n4)); /* NOR(k4,n4); */

assign n1=NOR(l1,m1); assign n2=NOR(l2,m2);
assign n3=NOR(l3,m3); assign n4=NOR(l4,m4); assign o1=NOR(p1,p2); assign o2=NOR(p3,p4);
assign p1=NOR(m1,s1); assign p2=NOR(m2,s2); assign p3=NOR(m3,s3); assign p4=NOR(m4,s4);
assign s1=NOR(n1,l1); assign s2=NOR(n2,l2); assign s3=NOR(n3,l3); assign s4=NOR(n4,l4);
assign t1=NOR(e3,s1); assign t2=OR(e3,s2);  assign t3=NOR(e4,s3); assign t4=OR(e4,s4);
assign q1=NOR(s1,k1); assign q2=NOR(s2,k2); assign q3=NOR(s3,k3); assign q4=NOR(s4,k4);

assign qq = 1 << {r2,r1};

endmodule

Я постарался в исходный код вносить минимальные изменения, чтобы случайно не нарушить логику, которую я не понимаю. Поэтому я определил Verilog функции AND, OR, NOR, NAND, чтобы они делали то, что должны делать. Присвоение значения сигнала в Verilog делается через assign. Если кому нужно, то вот Краткое описание языка Verilog.

Таким образом, в модуле test имеются входные сигналы декодируемого адреса r1 и r2, а так же сигнал сброса set0 и сигнал d — команда на операцию дешифрации адреса (в терминологии автора). Выходные сигналы q1, q2, q3 и q4.

Кроме этого, я добавил отсебятину, четырехбитный выходной сигнал qq, который вычисляется традиционным дешифратором, вот так: assign qq = 1 << {r2,r1};

Модуль test был вставлен в проект Intel Quartus Prime Lite Edition v16.1 для микросхемы ПЛИС Cyclone IV E.

Проект был скомпилирован. Предварительно в настройках проекта Assignments=> Settings => EDA Tools Settings => Simulation нужно выбрать Tool Name => ModelSim-Altera. Тогда, после компиляции будет создана папка simulation/modelsim в которой будут находиться модули *.sdo и *.vo, которые нужны для временной симуляции.

Теперь нужен testbench. Я написал его по простому:

`timescale 1ns / 1ns

module tb();

reg r1_;
reg r2_;
reg d_;
reg set_;
wire q1_,q2_,q3_,q4_;
wire [3:0]qq_;

test test_inst(
	.d(d_),
	.r1(r1_),
	.r2(r2_),
	.set0(set_),
	.q1(q1_),
	.q2(q2_),
	.q3(q3_),
	.q4(q4_),
	.qq(qq_)
);

initial
begin
	$dumpfile("out.vcd");
	$dumpvars(0,tb);
	
	//reset m1-m4 signals using "set_"
	r1_=0;
	r2_=0;
	d_=0;
	set_=0;
	#100;
	set_=1;
	#100;
	
	//check addr 00
	r1_=0;
	r2_=0;
	#100;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 01
	r1_=1;
	r2_=0;
	#100;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 10
	r1_=0;
	r2_=1;
	#100;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 11
	r1_=1;
	r2_=1;
	#100;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//--------------------
	//check addr 00
	r1_=0;
	r2_=0;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 01
	r1_=1;
	r2_=0;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 10
	r1_=0;
	r2_=1;
	d_=1;
	#100;
	d_=0;
	#200;
	
	//check addr 11
	r1_=1;
	r2_=1;
	d_=1;
	#100;
	d_=0;
	#200;
end

endmodule

Здесь сигналы адресов r1 и r2 поочередно устанавливаются во все четыре возможные значения 2'b00, 2'b01, 2'b10 и 2'b11, при этом еще вырабатывается этот сигнал d, который активизирует декодирование.

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

Теперь запускаю ModelSim-Altera (или теперь уже Intel). Создаю проект и воркспейс. Добавляю в него два существующих файла: тестбенч tb.v и скомпилированный квартусом проект async_test.vo:



Их теперь еще нужно откомпилировать уже с помощью ModelSim. Правая кнопка мыши и выбираю из меню Compile All. Нужно чтобы появились зеленые чек-марки возле каждого файла. Иногда бывает странность и ModelSim находит синтаксические ошибки там, где их не видит квартус. Это так, к слову.

Теперь можно начинать симуляцию через меню ModelSim, Simulate-> Start Simulation…
Тут появляется диалоговое окно где нужно:

1) выбрать топ модуль и сейчас это тестбенч



2) добавить библиотеки альтеры



3) добавить скомпилированный SDF файл, из которого все временные параметры пойдут



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



Нажимаем OK и далее меню Simulate => Run => Run-all

Вот оно и получилось — заработало!



Что я вижу:
Во-первых, проект похоже почти работает и декодирует адреса, как и обещано — вот только для первой группы четырех импульсов d. Как-то перепутаны выходы дешифратора, при {r2,r1} = 2'b01 зажигается q2. Но я про эту странность выше уже говорил. Честно говоря, я был сильно удивлен, что это вообще работает при каких-то условиях.

Вторая группа из 4х импульсов d не работает правильно. Это тот момент когда сигнал d приходит одновременно с изменяющимися r1 и r2.

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


Защелкиваемый в регистре сигнал обязан быть стабильным некоторое время tsu (setup time) до фронта тактовой частоты и некоторое время после фронта тактовой частоты thold (hold time). Если это условие не выполняется, то синхронная схема не работает или работает не надежно (ну то есть фактически не работает).


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

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

Мне кажется, что автору асинхронной схемы не удастся избежать временного анализа. Обязательно нужно позаботиться о стабильности сигналов r1 и r2 до прихода d. Это нужно как-то контролировать и учитывать. Честно говоря, сам импульс d чем-то напоминает синхроимпульс тактовой частоты. У сигнала d есть длительность, значит она, эта длительность чем-то обеспечена, каким-то генератором? Получается, что для работы асинхронной схемы все таки нужны времязадающие цепи, те которые определяют длительность и позицию сигала d? Вообще, происхождение этого сигнала d не очень понятно…

Хотел обратить внимание еще на несколько моментов в моей симуляции. Даже когда схема работает (первые 4 импульса d на симуляции) выходные сигналы q1, q2, q3, q4 сдвинуты относительно сигнала d и каждый сдвинут на разное время. Самое интересное, что ширина импульсов q1, q2, q3 и q4 всегда больше ширины импульса d и все они разные по ширине. Я не знаю, как автор собирается комбинировать такие схемы одну с другой. Если предположить, что выходной сигнал q1 для последующих схем становится сигналом d, то получится, что через цепочку схем сигнал d становится шире и шире — но это уже мои фантазии. Повторюсь, я не очень понимаю как такие схемы будут собираться в бОльшие.

Еще одна мысль не покидает меня.
Мне кажется, что традиционный дешифратор вроде такого, как у меня выше assign qq = 1 << {r2,r1}; займет в чипе гораздо меньше места по числу транзисторов, чем описанная автором асинхронная схема. А число транзисторов в ASIC напрямую влияет на производительность, ведь получается большая площадь чипа занята и более длинные трассы между элементами, большее энергопотребление. Об этом обязательно нужно подумать, как это оценить и как это посчитать.

У меня иногда у самого возникают странные «прорывные» идеи о том, как сделать электронику быстрее или задействовать «иной принцип» работы. Закон Мура уже как-то не очень работает и для увеличения быстродействия электроники требуются новые идеи. В случае с микропроцессорами это может быть некая принципиально иная архитектура (хм… она есть у меня). Или нужны свежие технологии и идеи об устройстве базовых элементов чипов.

Я как-то делал эксперименты по реализации схемы на Double-Edge-Trigger. Идея заключалась в том, чтобы использовать для обычной синхронной логики оба фронта тактовой частоты. Я думал, что использование DET триггера позволит в чипе для той же скорости вычислений иметь рабочую частоту в два раза меньше и значит как минимум снизится энергопотребление. Я просимулировал свой проект и даже запустил его в ПЛИС — он работал. Подробности об этом проекте здесь.

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

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

Симуляция — бесплатна! Пробуйте господа!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335386/


Метки:  

Чат-бот своими руками: история одного велосипеда

Вторник, 15 Августа 2017 г. 10:44 + в цитатник


Привет, хабр! Сегодня я расскажу о том, как своими руками с нуля собирались мозги для чат-бота, умеющего создавать резюме на основе беседы с человеком. Речь пойдет о том, как развивался написанный для этого дела велосипед, какие трудности встречал на своем пути и как изменялся в целях преодоления этих трудностей. Все описанные события происходили в процессе моего обучения в Школе программистов HeadHunter в 2017 году. Кому интересно — добро пожаловать под кат. Читать дальше ->

https://habrahabr.ru/post/335574/


Метки:  

Избранное: ссылки по reverse engineering

Вторник, 15 Августа 2017 г. 10:42 + в цитатник


Всем привет!


Сегодня мы хотели бы поделиться своим списком материалов по тематике reverse engineering (RE). Перечень этот очень обширный, ведь наш исследовательский отдел в первую очередь занимается задачами RE. На наш взгляд, подборка материалов по теме хороша для старта, при этом она может быть актуальной в течение продолжительного времени.


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


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


Итак, перейдем к списку материалов!


  1. Тематики
    a. Реверс
    b. Поиск уязвимостей (fuzzing)
    c. Эксплуатация уязвимостей
    d. Анализ вредоносного кода
  2. Инструменты
    a. IDA Pro
    b. Radare2
    c. WinDBG (Ollydbg / Immunity Debugger / x64dbg)
    d. GDB
    e. DBI
    f. SMT
    g. Python для автоматизации
    h. BAF (Binary Analysis Frameworks)
  3. Архитектуры
    a. x86-x86_64
    b. ARM
  4. ОС
    a. Windows
    b. Linux
    c. Mac OS(OSX) / iOS
    d. Android
  5. Форматы файлов
    a. PE
    b. ELF
    c. Mach-O
  6. Программирование
    a. C/C++
    b. Assembler
  7. Практика
    a. War games



1. Тематики


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


1.a Reverse engineering


  • "Искусство дизассемблирования" от Крис Касперски — не новая, но очень хорошая и до сих пор актуальная книга от Криса с хорошей систематизацией знананий и отличным материалом;
  • "Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation" — "новая" книга от нескольких известных специалистов по ИБ, покрывающая некоторые новые моменты и темы, что отсутствуют в книге Криса;
  • "Реверсинг для начинающих" от Дениса Юрьевича — полностью бесплатная книга, переведенная уже на множество языков мира. Здесь, наверное, самое примечательное — это наличие интересных заданий после каждой главы, при этом — для нескольких архитектур сразу;
  • "Practical RE tips" — отличный webinar на английском языке от Gynvael Coldwind, содержащий много полезных советов и скриптов про RE;
  • Ресурс "OPENSECURITYTRAINING.INFO" содержит хорошие обучающие лекции и видеоролики по RE на английском;
  • "Digging Through the Firmware" — неплохая серия статей Practical Reverse Engineering — полезные статьи для тех, кто только собирается погрузиться в мир реверсинга прошивок устройств;
  • "Training: Security of BIOS/UEFI System Firmware from Attacker and Defender Perspectives" — если вы хотите окунуться в мир firmware security, UEFI BIOS, то вам определенно нужно ознакомиться с данными слайдами, которые ранее были в платном тренинге на ведущих конференциях по безопасности;
  • CRYPTO101 — немного введения в криптографию, без которой не обойтись.

1.b Поиск уязвимостей



1.c Примеры эксплуатации найденных уязвимостей



1.d Анализ вредоносных программ



2. Необходимый инструментарий


Ниже представлены популярные инструменты, применяемые при RE.


2.a IDA Pro



2.b Radare2


  • "The radare2 book" — основная книга по использованию фреймворка Radare2 для реверса;
  • "Radare2 Cheatsheet" — "шпаргалка" по основным командам;
  • "Radare Today — the blog of radare2" — блог фреймворка. В нём найдутся не только новости, но и практические примеры.

2.c WinDBG (Ollydbg / Immunity Debugger / x64dbg)


Без знания принципов работы отладчика и умения им пользоваться тоже не обойтись. Ниже мы рассмотрим отладчики для ОС Windows, а в следующем пункте уделим внимание знаменитому GDB. Итак, поехали:


  • Advanced Windows Debugging: Developing and Administering Reliable, Robust, and Secure Software — в первую очередь, эта книга пригодится для понимания и "отлова" ошибок типа повреждения кучи;
  • "Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows" — это издание хорошо дополнит предыдущую книгу;
  • "Введение в крэкинг с нуля, используя OllyDbg" — к сожалению, старейший ресурс wasm.ru закрылся, но подобная подборка легко ищется, поскольку была продублирована на множество ресурсов. К тому же, в сети стали появляться "форки", только в них уже используется x64dbg или IDA.

2.d GDB



2.e DBI


Программируемая отладка — это сегодня неотъемлемый подход в арсенале любого реверсера. И DBI — один из инструментов. Подробнее:


  • "Dynamic Binary Instrumentation в ИБ" — в этой статье уже собрана некоторая обобщенная информация про DBI;
  • "Light And Dark Side Of Code Instrumentation" — данная презентация поможет вам ориентироваться в разновидностях различных инструментаций кода и в том, что и когда вам может помочь с анализом программ.

2.f SMT


Что такое SMT-решатель? Если кратко, SMT-решатель — это программа, которая может решать логические формулы.


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


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


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

За это время SMT потеряла ореол таинственности, появились более-менее работающие инструменты для "простых" людей.


Ниже приведены источники, которые помогут погрузиться в тему:



2.g Python для автоматизации


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



2.h BAF (Binary Analysis Frameworks)


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



Несколько интересных фреймворков/инструментов:



3. Архитектуры


Мы рассмотрим только несколько популярных архитектур. В конце статьи в разделе с дополнительными материалами вы найдете информацию по многим другим (MIPS, PowerPC и т.д.).


3.a x86-x86_64


  • "Intel 64 and IA-32 Architectures Software Developer Manuals" — раньше такие руководства отправляли на почту, но из-за большого количества материала в них печать стала дорогим удовольствием. Рекомендуется в качестве настольного справочника.

3.b ARM


  • Azeria Labs (ARM Assembly Basics & ARM Exploit Development) — сайт со статьями по основам ARM-ассемблера и разработке эксплойтов под эту архитектуру;
  • Курс "Introduction to ARM" — двухдневный видеокурс, посвященным ARM-разработке и эксплуатации;
  • VisUAL — визуализация работы ARM-команд.

4. ОС


Знание принципов работы популярных Операционных Систем.


4.a Windows



4.b Linux



4.c Mac OS(OSX) / iOS



4.d Android


  • "Android Hacker's Handbook" — наверное, самая популярная книга, посвященная безопасности ОС Android;
  • "Android Internals::Power User's View" — книга, рассказывающая о внутренних механизмах этой ОС. Из-за недавних утечек материал появился в открытом доступе, о чём пишет сам автор на своём сайте и предоставляет возможность скачать прошлую версию.

5. Форматы исполняемых файлов


В этом разделе представлены ссылки, разъесняющие подробности популярных форматов исполняемых файлов.


5.a PE



5.b ELF



5.c Mach-O



Известный исследователь corkami делает очень полезные и интересные "постеры" со схемой различных форматов файлов, в том числе, упомянутых выше. Советуем использовать их как шпаргалку.


6. Программирование


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


6.a C/C++



6.b ASM



7. Практика


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


7.a War Games


  • SmashTheStack Wargaming Network — данная сеть с несколькими wargame поддерживается волонтёрами и доступна онлайн. Мы рекомендуем начать с неё;
  • BinTut — локальный wargame;
  • Reversing Workshop — мастер-класс по решению заданий с ежегодного соревнования "The Flare On Challenge" за 2016 г.;
  • Exploit-Challenges — подборка уязвимых ARM бинарных файлов;
  • ARM Reverse Engineering Exercises — оригинальный репозиторий "пропал", но был найден один из форков на просторах github;
  • CTF Time — тут вы сможете узнать расписание будущих CTF-мероприятий и прочитать решения прошедших.

Ну и напоследок несколько ссылок с большим количеством материалов по вышеуказанным темам:


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

https://habrahabr.ru/post/334832/


Метки:  

[Перевод] 10 шагов по решению задач в программировании

Вторник, 15 Августа 2017 г. 10:39 + в цитатник


Перевод статьи Валинды Чен.

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

1. Прочитайте условия задачи как минимум трижды (или хотя бы столько раз, сколько вам будет удобно)


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

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

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

function selectEvenNumbers() {
  // здесь ваш код
}

Какие вопросы можно себе задать:

  • Как компьютер может сказать, что число является чётным? Разделить на 2 и проверить, чтобы результат получился целым.
  • Что я передаю этой функции? Массив.
  • Что содержит этот массив? Одно или несколько чисел.
  • Какие типы данных у элементов массива? Числа.
  • Какова цель этой функции? Что я возвращаю в конце её выполнения? Цель — получить все чётные числа и вернуть их в массиве. Если нет чётных чисел, то массив возвращается пустым.

2. Пройдите по задаче вручную как минимум с тремя наборами данных


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

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

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

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

[1]
[1, 2]
[1, 2, 3, 4, 5, 6]
[-200.25]
[-800.1, 2000, 3.1, -1000.25, 42, 600]

Когда только начинаешь, то зачастую пренебрегаешь какими-то шагами. Поскольку наш мозг уже знаком с чётными числами, то можно просто посмотреть на набор чисел и сразу передать в массив 2, 4, 6 и так далее, не думая о том, как наш мозг выбирает конкретные числа. Если вы замечаете это за собой, то лучше взять большой набор данных, чтобы помешать мозгу решать задачу, просто глядя на числа. Это поможет придерживаться настоящего алгоритма.

Давайте пройдём по массиву [1]

  1. 1. Смотрим на единственный элемент массива [1].
  2. 2. Определяем, является ли он чётным. Не является.
  3. 3. Замечаем, что других элементов в массиве нет.
  4. 4. Определяем, что здесь нет чётных чисел.
  5. 5. Возвращаем пустой массив.

Теперь пройдём по массиву [1, 2]

  1. Смотрим на первый элемент массива [1, 2]
  2. Это 1.
  3. Определяем, является ли он чётным. Не является.
  4. Смотрим на следующий элемент.
  5. Это 2.
  6. Определяем, является ли он чётным. Является.
  7. Создаём массив evenNumbers и добавляем в него 2.
  8. Замечаем, что других элементов в массиве нет.
  9. Возвращаем массив evenNumbers — [2].

Можно пройти по задаче ещё несколько раз. Обратите внимание, что количество шагов в алгоритме для [1] отличается от алгоритма для [1, 2]. Поэтому рекомендуется проходить по нескольким наборам данных. Например, с единственным элементом; смесь целых и нецелых чисел; многоразрядные числа; наборы с отрицательными числами.

3. Упрощайте и оптимизируйте свой алгоритм


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

  1. 1. Создадим функцию selectEvenNumbers.
  2. 2. Создадим новый пустой массив evenNumbers для хранения чётных чисел.
  3. 3. Проходим по каждому элементу массива [1, 2].
  4. 4. Находим первый элемент.
  5. 5. Делим его на 2 и определяем, чётный ли он. Если да, то прибавляем к evenNumbers.
  6. 6. Находим следующий элемент.
  7. 7. Повторяем шаг №4.
  8. 8. Повторяем шаги №5 и №4, пока не кончатся элементы в массиве.
  9. 9. Возвращаем массив evenNumbers вне зависимости от того, есть ли в нём что-то.

Этот подход напоминает математическую индукцию:

  1. 1. Доказываем истинность для n = 1, n = 2, ...
  2. 2. Предполагаем, что будет истинно для n = k.
  3. 3. Доказываем истинность для n = k + 1.



4. Пишите псевдокод


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

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

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

Вот пример псевдокода, в основном состоящего из слов:

function selectEvenNumbers
создаём массив evenNumbers и делаем его эквивалентным пустому массиву
для каждого элемента в этом массиве
  смотрим, является ли элемент чётным
   если чётный (при делении на 2 результат получается нецелым)
     добавляем его к массиву evenNumbers
return evenNumbers

А вот псевдокод, в котором слов гораздо меньше:

function selectEvenNumbers
evenNumbers = []
for i = 0 to i = length of evenNumbers
  if (element % 2 === 0) 
    добавляем его к массиву evenNumbers
return evenNumbers

Главное, писать код построчно и понимать логику каждой строки.

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

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


Когда ваш псевдокод будет готов, преобразуйте каждую строку в реальный код на вашем языке. Здесь мы воспользуемся JavaScript.

Если вы писали на бумаге, то перенесите всё в редактор в виде комментариев, а затем замените каждую строку.

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

selectEvenNumbers([1])
selectEvenNumbers([1, 2])
selectEvenNumbers([1, 2, 3, 4, 5, 6])
selectEvenNumbers([-200.25])
selectEvenNumbers([-800.1, 2000, 3.1, -1000.25, 42, 600])

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

function selectEvenNumbers(arrayofNumbers) {
let evenNumbers = []
 console.log(evenNumbers) // Удаляем после проверки выходных данных
 console.log(arrayofNumbers) // Удаляем после проверки выходных данных
}

Ниже приведён код, полученный после обработки каждой строки псевдокода. Символы // обозначают строки из псевдокода. Жирным выделен реальный код на JavaScript.

// function selectEvenNumbers
function selectEvenNumbers(arrayofNumbers) {
// evenNumbers = []
  let evenNumbers = []
// for i = 0 to i = length of evenNumbers
  for (var i = 0; i < arrayofNumbers.length; i++) {
// if (element % 2 === 0) 
    if (arrayofNumbers[i] % 2 === 0) {
// добавляем его к массиву evenNumbers
      evenNumbers.push(arrayofNumbers[i])
    }
  }
// return evenNumbers
  return evenNumbers
}

Уберём псевдокод, чтобы не путаться.

function selectEvenNumbers(arrayofNumbers) {
  let evenNumbers = []
for (var i = 0; i < arrayofNumbers.length; i++) {
    if (arrayofNumbers[i] % 2 === 0) {
      evenNumbers.push(arrayofNumbers[i])
    }
  }
return evenNumbers
}

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



6. Упрощайте и оптимизируйте код


Возможно, вы заметили, что упрощение и оптимизация — это повторяющиеся темы.

«Простота — предпосылка надёжности».

Эдсгер Дейкстра, нидерландский учёный и один из первопроходцев в ряде областей информатики

В нашем примере одним из путей оптимизации будет фильтрация элементов в массиве посредством возвращения нового массива с помощью filter. В этом случае нам не нужно определять переменную evenNumbers, потому что filter вернёт новый массив с копиями элементов, которые соответствуют фильтру. При этом исходный массив не изменится. Также нам не нужно использовать цикл for. filter пройдёт по каждому элементу, и если вернёт true, то элемент попадёт в массив, а если false, то будет пропущен.

function selectEvenNumbers(arrayofNumbers) {
  let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)
  return evenNumbers
}

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

Задавайте себе такие вопросы:

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

«Программы должны быть написаны так, чтобы люди их читали, и лишь во вторую очередь — чтобы машины их исполняли».

Джеральд Сассман и Гарольд Абельсон, авторы “Structure and Interpretation of Computer Programs”

7. Отлаживайте


Этот шаг необходимо выполнять в ходе всего процесса. Сквозная отладка поможет раньше выловить любые ошибки синтаксиса или недостатки логики. Воспользуйтесь преимуществами своего IDE (Integrated Development Environment) и отладчика. При обнаружении бага рекомендуется просматривать код построчно, стараясь найти неожиданные вещи. Несколько советов:

  • Читайте, что пишется в сообщения об ошибках в консоли. Иногда в них указываются номера строк для проверки. Это даст вам исходную точку для поисков, хотя иногда проблемы могут скрываться в других строках.
  • Комментируйте блоки кода или строки, а также выходные данные, чтобы быстро подмечать поведение кода. При необходимости код можно всегда раскомментировать.
  • Используйте другие образцы данных, если возникают непредусмотренные сценарии.
  • Сохраняйте разные версии файла, если применяете другие подходы. Не стоит терять наработанное, если захочется откатиться к прежнему решению!

«Самый эффективный инструмент отладки — тщательное продумывание в сочетании с разумно размещёнными командами вывода на экран».

Брайан Керниган, профессор информатики в Принстонском университете

8. Пишите полезные комментарии


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

Избегайте таких комментариев:

// Это массив. Итерируем его.
// Это переменная.

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

  • Для чего этот код?
  • Что он делает?

9. Получайте отзывы посредством ревизии кода


Получайте отзывы от коллег, руководителей и других разработчиков. Читайте Stack Overflow. Смотрите, как другие решали аналогичные задачи и учитесь у них. Нередко бывает несколько способов решения задачи. Узнайте, что они собой представляют, и вам будет быстрее и проще приходить к ним самостоятельно.

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

Дядя Боб Мартин, программный инженер и соавтор манифеста Agile

10. Практикуйтесь, практикуйтесь, практикуйтесь


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

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

Майкл Джозефсон, основатель Института этики Джозефа и Эдны Джозефсон
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335666/


Метки:  

Как провести неидеальное собеседование тестировщика и почему идеальных не бывает

Вторник, 15 Августа 2017 г. 10:38 + в цитатник


Дрейк и не знал, насколько был близок к подбору правильного тестировщика.


Рано или поздно может настать момент, когда к вам придут с просьбой найти тестировщика. Можно, конечно, почитать какую-нибудь литературу про тестирование – например, «тестирование .net» Романа Савина. Да только, вполне возможно, кандидаты её тоже читали.


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


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


#1 Сжигайте письма к Санте


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


Есть даже расхожее название псевдо-идеальных резюме – «письма к Санте». К ним стоит в начале добавлять: «Дорогой Санта, сделай так, чтобы в следующем году я знал: ...» А в конце: «Best regards, Tommy».

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


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


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


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


#2 Предложите протестировать ваш продукт


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


  • %candidacy_name% должен уметь все, включая администрирование и навыки моделирования ракетных двигателей. На всякий случай.


  • %candidacy_name% должен быть отличным разработчиком.

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


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


Например, мы просим протестировать наш небольшой сервис под названием «Напоминатель» – письменные напоминания о том, что какой-то платеж нужно будет вот-вот совершить. Удобен он тем, что не очень понятно, как его тестировать: как получить напоминание, которое должно прийти через месяц, как проверить, что если напоминание поставлено на 31 число месяца, то в условном феврале оно придет 28, а не 29-ого.


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


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

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


#3 Проверьте, насколько он "в IT теме"


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


К такому собеседованию как раз удобно привлекать разработчиков из своей команды – разумеется, они легко «завалят» кандидата, но вы сможете оценить кругозор нового человека и его общее понимание, где он оказался. Например, банальные фразы про JIRA, Bitbucket, сертификаты и IDE могут быть наскальной азбукой для совсем новичков в профессии.

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


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


#4 О тестовых заданиях


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


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


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


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


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

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


#5 Что делать, когда вогоны сносят планету


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


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


Примеры подходящих вопросов:
  • «Два ПМа приходят к тебе и просят быстро протестировать их проект, который нужно релизить вечером. Что ты будешь делать?»
  • «ПМ укатил в отпуск и не сказал, должна ли стоять по умолчанию галочка в пункте «да, я хочу получать ежесекундные напоминания о трансфере Неймара», а разработчик говорит, что в гробу он его видел и галочка стоять не должна. Стоит ли заводить баг или нет?»

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


Один из наших старших тестировщиков устроился в Яндекс.Деньги после письма, которое начиналось со слов: «Я ничего не знаю о тестировании, но очень хочу у вас работать». Это было три года назад, и с тех пор он сначала избавился от приставки «младший», а потом получил «старшего». Леша, привет!

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

https://habrahabr.ru/post/335612/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1096 1095 [1094] 1093 1092 ..
.. 1 Календарь