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

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

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

Роботы в человеческом обществе

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

Роботы в человеческом обществе

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



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

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

    История развития


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

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



    В 16-17 веке в Западной Европе инженеры начали конструировать автоматоны — заводные механизмы наподобие человека, которые могли выполнять довольно сложные действия. Самый известный из них – робот «испанский монах», который был изобретен примерно в 1560 году механиком Хуанело Турриано для императора Карла V. Автоматон был около 40 см в высоту, способный ходить, бить себя в грудь рукой, кивать головой и даже преподносить деревянный крест к губам.

    Более заметный прогресс в робототехнике наблюдался в 18 веке. К примеру, в 1738 году французский инженер Жак де Вокансон собрал первого в мире андроида, способного играть на флейте.

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

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

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

    В 1968 году японской компанией Kawasaki Heavy Industries, Ltd был произведен первый промышленный робот. С тех пор Япония начала вовсю стремиться стать мировой столицей робототехники, и ей это удалось. Несмотря на то, что роботы изначально разрабатывались в США, они импортировались в Японию в малых количествах, где инженеры изучали их и применяли в производстве.



    Коммерческое распространение роботов началось с 1980-ых годов. Технический прогресс двигался в направлении совершенствования систем управления. Такие компании как Unimate, Hitachi KUKA, Westinghouse, FANUC развивали системы датчиков для своих роботов, делая их более чувствительными к задачам, которые они выполняют.

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

    В это время также появились новые человекоподобные роботы, такие как канадский Aiko, имитирующий человеческие чувства (осязание, слух, речь, зрение), ASIMO – гуманоид японской фирмы Honda, робот-собака AIBO, созданная компанией Sony и другие.

    • В 2005 году вышел робот-гуманоид RoboThespian британской компании Engineered Arts. Пройдя несколько модификаций, он стал наилучшей платформой для общения и развлечений. В этом же году мир увидел BigDog – боевой четвероногий робот, созданный Boston Dynamics.
    • В 2008 году вышел гуманоидный дружелюбный робот NAO, предназначенный для работы в домах, университетах и лабораториях и предлагающий помощь в научных исследованиях и образовании.
    • В 2011 году на МКС был отправлен первый робот-космонавт НАСА Robonaut-2.

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



    Препятствия


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

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

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



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

    Роботы сегодня


    Как уже упоминалось, наибольшей отраслью, где используется робототехника, является промышленность, в частности, автомобилестроение. Манипуляторы, работающие на заводах, варьируются от размеров и функциональности в зависимости от типа выполняющей задачи – сборочные, сварочные, режущие, красящие. Наряду с ними на производстве можно встретить разгрузочно-погрузочных роботов, упаковщиков, сортировщиков, формовщиков и прочие механизмы, заменяющие человека в рутинных повторяющихся задачах. Компаниями-лидерами в промышленной автоматизации являются – KUKA (Германия), Fanuc (Япония), Kawasaki (Япония), ABB (Швейцария), Denso (Япония) и другие.



    Наряду с этим новых масштабов приобретает рынок совместных роботов, которые могут работать с людьми на одной производственной линии, не причиняя им вреда. Это манипуляторы компании Universal Robots, а также промышленные роботы нового поколения Baxter и Sawyer от Rethink Robotics.

    В последние годы весь мир внимательно следит за разработкой автомобилей с автономным управлением, которые будут перевозить людей без их участия в процессе. Сейчас ближе всего к беспилотным машинам находится служба такси Uber. Но прогресс в разработке технологии регулярно демонстрируют такие производители, как Ford, Mercedes, Toyota, BMW и Tesla.

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

    А какие роботы служат в быту? Безусловно, первое место здесь принадлежит роботам-пылесосам, которые стали незаменимыми помощниками по уборке в доме. Лидером среди производителей этих устройств является американская фирма iRobot и её пылесосы Roomba. Последние модели производителя отличаются улучшенной навигацией и сопряжением со смартфоном. Данное дополнение открывает новые возможности для обычных пользователей, которые могут через специальные приложения добавлять роботам больше функций.



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

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

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

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



    Вспомогательным гаджетом может выступать эхо-колонка (Amazon Echo, Google Home и другие), позволяющая с помощью голосовых команд управлять всей техникой в доме. Или роботы-помощники, которые выступают в роли органайзера, будильника, мультимедиа проигрывателя. Будучи подключенными к Интернету, они сообщают о погоде, рассказывают новости, предоставляют информацию о пробках в вашем городе и прочее. А благодаря открытому доступу к программированию, из них можно сделать отличных помощников для учебы детей, развлечения пожилых и даже игрушек для домашних животных.

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

    Прогнозы на будущее


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

    Если верить статистическим данным организации Tractica, число потребляемых человечеством роботов достигнет 31,2 млн единиц по всему миру к 2020 году. При этом, лидерство на рынке займут бытовые роботы, обогнав промышленных и военных.



    Ученые прогнозируют, что уже к 2018 году Интернет вещей будет насчитывать около 6 млрд подключенных устройств. Эти устройства будут обращаться к сервисам и данным в Сети, что позволит людям строить новые бизнес-планы для обслуживания этих подключенных устройств. К 2020 году 40% взаимодействий с мобильными устройствами будут осуществляться через «умных» агентов. Этот прогноз основан на том, что наш мир движется к эпохе приложений, в которой такие сервисы, как Amazon Alexa, Microsoft Cortana и Apple Siri будут играть роль универсального интерфейса для взаимодействия человека с устройствами.

    Технический директор Google Рэй Курцвейл в своих прогнозах по поводу развития робототехники и информационных технологий предполагает, что персональные роботы, способные на полностью автономные сложные действия, станут такой же привычной вещью, как холодильники или стиральные машины уже в 2027 году. А беспилотные автомобили заполнят полностью дороги в 2033 году.

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

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

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

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



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

    Роботы в концепции IoT


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

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

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



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

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

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

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

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

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



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

    Заключение


    В заключение стоит отметить, что по мере того как наш мир будет наполняться роботами, навыки общения с ними будут не менее полезны чем навыки общения с людьми. Мы видим, как современные технологии постепенно объединяют людей и умные машины в одну большую социально-аппаратную сеть. И это только начало сложного, но очень увлекательного путешествия в будущее.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337902/


    Метки:  

    Правильный выбор СрЗИ: от рекламных листовок к use case

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

    Метки:  

    Играючи BASH'им дальше

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

    Метки:  

    Просто о сложном: что нужно знать о биоинформатике

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

    Просто о сложном: что нужно знать о биоинформатике

      Если спросить случайного прохожего, что такое биология, он наверняка ответит что-то вроде «наука о живой природе». Про информатику скажет, что она имеет дело с компьютерами и информацией.  Если мы не побоимся быть навязчивыми и зададим ему третий вопрос – что такое биоинформатика? – тут-то он наверняка и растеряется. Логично: про эту область знаний даже в ЕРАМ знает далеко не каждый – хотя в нашей компании и биоинформатики есть. Давайте разбираться, для чего эта наука нужна человечеству вообще и ЕРАМ в частности: в конце концов, вдруг нас на улице об этом спросят.


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



      Чтобы провести исследование, биологам уже недостаточно взять анализы и посмотреть в микроскоп. Современная биология имеет дело с колоссальными объемами данных.  Часто обработать их вручную просто невозможно, поэтому многие биологические задачи решаются вычислительными методами. Не будем далеко ходить: молекула ДНК настолько мала, что разглядеть ее под световым микроскопом нельзя. А если и можно (под электронным), всё равно визуальное изучение не помогает решить многих задач.

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

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



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

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

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

      Биоинформатика в ЕРАМ



      В ЕРАМ биоинформатикой занимается подразделение Life Sciences. Там разрабатывают программное обеспечение для фармкомпаний, биологических и биотехнологических лабораторий всех масштабов — от стартапов до ведущих мировых компаний. Справиться с такой задачей могут только люди, которые разбираются в биологии, умеют составлять алгоритмы и программировать.

      Биоинформатики – гибридные специалисты. Сложно сказать, какое знание для них первично: биология или информатика. Если так ставить вопрос, им нужно знать и то и другое. В первую очередь важны, пожалуй, аналитический склад ума и готовность много учиться. В ЕРАМ есть и биологи, которые доучились информатике, и программисты с математиками, которые дополнительно изучали биологию.

      Как становятся биоинформатиками



      Мария Зуева, разработчик:

      «Я получила стандартное ИТ-образование, потом училась на курсах ЕРАМ Java Lab, где увлеклась машинным обучением и Data Science. Когда я выпускалась из лаборатории, мне сказали: «Сходи в Life Sciences, там занимаются биоинформатикой и как раз набирают людей». Не лукавлю: тогда я услышала слово «биоинформатика» в первый раз. Прочитала про нее на Википедии и пошла.

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


      Геннадий Захаров, бизнес-аналитик:

      «По образованию я биофизик, в 2012-м защитил кандидатскую по генетике. Какое-то время работал в науке, занимался исследованиями – и продолжаю до сих пор. Когда появилась возможность применить научные знания в производстве, я тут же за нее ухватился.

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


      Как читают геном



      Чтобы понять суть биоинформатических проектов ЕРАМ, сначала нужно разобраться, как секвенируют геном. Дело в том, что проекты, о которых мы будем говорить, напрямую связаны с чтением генома. Обратимся за объяснением к биоинформатикам.

      Михаил Альперович, глава юнита биоинформатики:

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

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

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

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




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

      Геннадий Захаров:

      «Для анализа раковых заболеваний секвенировать нужно и здоровую, и больную клетку. Рак появляется в результате мутаций, которые клетка накапливает в течение своей жизни. Если в клетке испортились механизмы, отвечающие за ее рост и деление, то клетка начинает неограниченно делиться вне зависимости от потребностей организма, т. е. становится раковой опухолью. Чтобы понять, чем именно вызван рак, у пациента берут образец здоровой ткани и раковой опухоли. Оба образца секвенируют, сопоставляют результаты и находят, чем один отличается от другого: какой молекулярный механизм сломался в раковой клетке. Исходя из этого подбирают лекарство, которое эффективно против клеток с “поломкой”».

      Биоинформатика: производство и опенсорс



      У подразделения биоинформатики в ЕРАМ есть и производственные, и опенсорс-проекты. Причем часть производственного проекта может перерасти в опенсорс, а опенсорсный проект – стать частью производства (например, когда продукт ЕРАМ с открытым кодом нужно интегрировать в инфраструктуру клиента).

      Проект №1: вариант-коллер



      Для одного из клиентов – крупной фармацевтической компании – ЕРАМ модернизировал программу вариант-коллер. Ее особенность в том, что она способна находить мутации, недоступные другим аналогичным программам. Изначально программа была написана на языке Perl и обладала сложной логикой. В ЕРАМ программу переписали на Java и оптимизировали – теперь она работает в 20, если не в 30 раз быстрее.

      Исходный код программы доступен на GitHub.

      Проект №2: 3D-просмотрщик молекул



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

      Для 3D-просмотра молекул ЕРАМ сделал онлайн-инструмент, который изначально работал только в окне браузера. Потом на основании этого инструмента разработали версию, которая позволяет визуализировать молекулы в очках виртуальной реальности HTC Vive. К очкам прилагаются контроллеры, которыми молекулу можно поворачивать, перемещать, подставлять к другой молекуле, поворачивать отдельные части молекулы. Делать всё это в 3D куда удобнее, чем на плоском мониторе. Эту часть проекта биоинформатики ЕРАМ делали совместно с подразделением Virtual Reality, Augmented Reality and Game Experience Delivery.

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

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

      Проект №3: геномный браузер NGB



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

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

      Новый геномный браузер NGB (New Genome Browser) от ЕРАМ работает в вебе, но по скорости и функционалу не уступает десктопным аналогам. Это продукт, которого не хватало на рынке: предыдущие онлайновые инструменты работали медленнее и умели делать меньше, чем десктопные. Сейчас многие клиенты выбирают веб-приложения из соображений безопасности. Онлайн-инструмент позволяет ничего не устанавливать на рабочий компьютер ученого. С ним можно работать из любой точки мира, зайдя на корпоративный портал. Ученому не обязательно всюду возить за собой рабочий компьютер и скачивать на него все необходимые данные, которых может быть очень много.



      Геннадий Захаров, бизнес-аналитик:

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

      В 3D-просмотрщике молекул это была работа с виртуальной реальностью, а в геномном браузере – улучшенная работа с вариациями. Мутации бывают сложными. Перестройки в раковых клетках иногда затрагивают огромные области. В них появляются лишние хромосомы, куски хромосом и целые хромосомы исчезают или объединяются в случайном порядке. Отдельные куски генома могут копироваться по 10–20 раз. Такие данные, во-первых, сложнее получить из прочтений, а во-вторых, сложнее визуализировать.

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


      Как изучать биоинформатику



      Мы уже говорили, что биоинформатики – гибридные специалисты, которые должны знать и биологию, и информатику. Самообразование играет в этом не последнюю роль. Конечно, в ЕРАМ есть вводный курс в биоинформатику, но рассчитан он на сотрудников, которым эти знания пригодятся на проекте. Занятия проводятся только в Санкт-Петербурге, а общедоступных курсов на University и Learn пока нет. И всё же, если биоинформатика вам интересна, возможность учиться есть:

      1) Вводный курс в генетическую диагностику от компании 23andme.
      2) Несколько курсов на Coursera (в том числе пара курсов на русском: введение в биоинформатику и в метагеномику).
      3) Курсы на Stepik от института биоинформатики: молекулярная биология и генетика, молекулярная филогенетика, генная инженерия и введение в технологии высокоэффективного секвенирования. Полный список курсов от института можно посмотреть на его официальном сайте.
      4) Лекции Павла Певзнера – профессора Калифорнийского университета в Сан-Диего, специалиста в области биоинформатики.
      5) Если вы живете в Санкт-Петербурге, можно прийти на гостевые лекции в институт биоинформатики – это бесплатно.
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/337892/


      Метки:  

      Серверы HPE ProLiant Gen8 и Gen9 vs. Gen10

      Среда, 13 Сентября 2017 г. 19:09 + в цитатник
      Orest_ua сегодня в 19:09 Администрирование

      Серверы HPE ProLiant Gen8 и Gen9 vs. Gen10

        Семейство серверов HPE ProLiant сегодня насчитывает несколько десятков моделей нескольких генераций. Имеется достаточно много подробных описаний отдельных моделей. Однако часто возникает необходимость охватить одним взглядом общую картину и сравнить модели. В данной статье акцент сделан на сравнительную характеристику некоторых серверов наиболее распространенных Gen8 и Gen9 с появившейся в этом году Gen10.

        .



        Очевидно, что IT должны работать на скоростях, которые требует современный бизнес, и быть ускорителем новых идей, продуктов и сервисов. Для построения быстро набирающих популярность гибридных решений необходима соответствующая IT инфраструктура, которая сочетает облачную экономичность и «проворство» (agility) с безопасностью локального (on-premises) информационного центра.

        Серверы HPE ProLiant разработаны, чтобы упростить построение корпоративных гибридных информационных технологий (Hybrid IT). Согласно внешнему независимому тестированию, проведенному в мае 2017 г., HPE ProLiant признаны самыми безопасными серверами промышленного стандарта в мире.

        Более 1 млн. клиентов во всем мире построили свой бизнес на серверах HPE ProLiant. На данный момент доступны следующие линейки серверов в стоечном (rack) и корпусном (tower) исполнении.

        — HPE ProLiant Easy Connect
        — HPE ProLiant MicroServer
        — HPE ProLiant DL
        — HPE ProLiant ML

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

        HPE ProLiant Easy Connect

        Внешний вид серверов EC200a (слева) и ML110 на въездной иллюстрации
        =

        HPE ProLiant Easy Connect Managed Hybrid Servers обеспечивают удаленно управляемые сервисы, предлагаемые партнерами HPE как подписка на 1, 3, или 5 лет с оплатой ежемесячно или ежегодно. Они обеспечивает безопасный и надежный доступ к приложениям Windows, Linux и SaaS. Эти управляемые решения уменьшают совокупную стоимость владения (Total Cost of Ownership, TCO) для удаленных точек продаж и офисов

        Примечание. Здесь и далее используются официальные фотографии и таблицы с сайта https://www.hpe.com/

        HPE ProLiant MicroServer


        Внешний вид MicroServer Gen8 (слева) и Gen10

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

        HPE ProLiant MicroServer Gen10 поддерживает потоковое медиа 4K с двумя портами для дисплеев. Он поставляется с предварительно установленной, удобной в работе ClearOS и приложениями для малого или домашнего офиса (Small Office / Home Office, SOHO).

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

        HPE ProLiant DL


        Внешний вид серверов DL380 Gen9 (слева) и Gen10



        Внешний вид серверов DL560 Gen9 (слева) и Gen10

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

        HPE ProLiant ML

        Внешний вид серверов ML350 Gen9 в корпусном (слева) и стоечном исполнении

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

        Общая характеристика серий (1 полугодие 2017 г.)

        HPE ProLiant 10 series. Серверы малого масштаба (Small Scale Servers). Они недороги и просты в развертывании.

        HPE ProLiant 100 series. «Именно те серверы, которые нужны» (Right Sized Servers). Обеспечивают наилучшее сочетание производительности, эффективности, возможностей и управляемости.

        HPE ProLiant 300 series. Универсальные исполнительные серверы (Versatile Performance Servers). Лучшая в отрасли конструкция с гибким выбором для разнообразных рабочих нагрузок в области вычислений и хранения данных.

        HPE ProLiant 500 series. Расширяемые серверы (Scale-up Servers). Масштабируются для критических рабочих нагрузок в любом бизнесе.

        Для предварительного ориентировочного расчета экономических характеристик может быть использован HPE server TCO calculator.

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

        Для многих пользователей HPE MicroServer станет лучшим выбором, по крайней мере, на первых порах. В Gen10 его характеристики улучшены.

        Варианты решений HPE ProLiant

        Для построения современной и оптимизированной IT среды можно выбрать различные варианты HPE Rack и Power Infrastructure. Она содержит следующие составляющие.

        — стойки с многими вариантами высоты, ширины и глубины;
        — устройства распределения электропитания (Power Distribution Units, PDU), от минимальных до масштаба предприятия;
        — блоки бесперебойного питания (Uninterruptable Power Supplies, UPS) различной мощности и размера;
        — решения для виртуальных машин (Virtual Machine, VM);
        — другие элементов оборудования стоечных решений.

        Стоечные HPE ProLiant Gen10 обеспечивают 71%-е увеличение производительности с новыми процессорами Intel Xeon Processor Scalable Family и 66%-е расширение полосы пропускания памяти для интенсивно использующих память приложений.

        Сравнение полосы пропускания серверов Gen10 и Gen9 (Июль 2017).

        Gen10 = 12 Channels x 2666 data rate x 8 bytes = 256 GB/sec.
        Gen9 = 8 channels x 2400 x 8 bytes = 154 GB/Sec.

        256/154 = 1,66 т.е., полоса пропускания Gen10 на 66% больше.

        Технологии серверов HPE ProLiant Gen10

        Проворство. Intelligent System Tuning (IST) оптимизирует производительность. Включает средства сглаживания колебаний (Jitter Smoothing), ускорения ядра (Core Boosting) и соответствия рабочей нагрузки (Workload Matching).

        — Intel Xeon Processor Scalable Family обеспечивает большее количество ядер и высокую пропускную способность.
        — Увеличение производительности сервера достигается за счет HPE SmartMemory с производительностью 2666 MT/s (megatransfers per second) и технологии «быстрой отказоустойчивости» (Fast Fault Tolerance).
        — Серверы оснащены наиболее быстрой постоянной памятью (Persistent Memory), объем которой может достигать терабайтного уровня.
        — Обеспечивается простой выбор, развертывание, управление и поддержка инфраструктуры серверов HPE по всему жизненному циклу за счет применения HPE OneView 3.1, HPE iLO 5 и iLO Amplifier Pack.

        Безопасность (Security) обеспечивается целым рядом технологий.

        — Реализована защита от кибератак нападений с Silicon Root of Trust.
        — Обнаруживается вредоносный код и malware с Run-time Firmware Verification.
        — Восстанавливаются исходные или безопасные настройки с Secure Recovery.
        — Расширенная безопасность достигается с iLO 5 Advanced Premium Security Edition.
        — Опции безопасности аппаратных средств включают Trusted Platform Module (TPM), Chassis Intrusion Detection Kit и Secure NICs.

        Руководство для перехода на Gen10

        Семейство Gen10 предлагает варианты, которые соответствуют всем возможным потребностям рабочей нагрузки. Для большей гибкости предлагаются HPE FlexibleLOM, HPE Flexible Smart Array, HPE SmartMemory, NVMe, Persistent Memory и другие составляющие решений. Полный список вариантов и подробности можно посмотреть в QuickSpecs.

        Линейка серверов Gen10 создавалась на основе опыта разработки предыдущих поколений HPE ProLiant и отзывов потребителей. В таблицах ниже приведены официальные сведения по эволюции серверов HPE ProLiant от Gen8 к Gen10, а также характеристики для HPE MicroServer Gen8, HPE DL380 Gen9 и HPE DL560 Gen9 - для тех случаев, когда возможно их корректное сравнение с аналогичными моделями Gen10. Для HPE ProLiant Easy Connect и HPE ProLiant ML такое сравнение пока не опубликовано разработчиком.


        Таб. 2. Сравнительные характеристики HPE MicroServer Gen8 и Gen10

        Наиболее заметными изменениями в HPE MicroServer Gen10 стала замена процессора Intel Xeon на AMD Opteron. Улучшились характеристики подсистем оперативной памяти и хранения данных.



        Таб. 3. Сравнительные характеристики DL380 Gen9 и Gen10

        Позиционирование универсальных серверов HPE ProLiant 300 series практически не изменилось. Характеристики DL380 Gen10 скорее оптимизированы, чем существенно улучшены.



        Таб. 4. Сравнительные характеристики DL560 Gen9 и Gen10

        Расширяемые серверы HPE ProLiant 500 series подверглись наиболее существенным изменениям в подсистемах работы с данными и электропитания.




        Примечание. Во всех таблицах указание звездочки около характеристики обозначает ее введение во втором полугодии 2017 г.

        Расширенная функциональность и дополнительные преимущества с HPE Server Options

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

        Таким образом, серверы ProLiant Gen10, конфигурируемые с HPE Server Options, являются идеальным решением для любой прикладной рабочей нагрузки и любой IT окружающей среды, - от SMB до крупного корпоративного информационного центра.

        HPE Server Options интегрируются со многими системными инструментами управления HPE для легких установки, конфигурирования и поддержки, снижая операционные затраты по сравнению с не-HPE компонентами. HPE предлагает широкий диапазон вариантов систем хранения данных, памяти, сетевых адаптеров и процессоров.

        HPE Memory. Выбор соответствующей памяти является ключом к получению самых высоких потребительских свойств, системной надежности и более быстрого возврата IT инвестиций. Портфель HPE включает HPE Standard Memory для типовых рабочих нагрузок и HPE SmartMemory для нагрузок, интенсивно использующих память. Клиенты могут выбрать необходимый вариант из различных типов памяти HPE и объема модулей DIMM, чтобы оптимизировать производительность и эффективность сервера.

        HPE Server Storage. HPE Server Storage для серверов ProLiant Gen10 включают жесткие диски (HDD), твердотельные диски (SSD) и Smart Array Controllers. Новая линия HPE контроллеров RAID уровня предприятия для серверов Gen10 помогает максимизировать производительность, доступность данных и вместимость систем хранения.

        Они обеспечивают до 1,6 млн. операций ввода-вывода в секунду (Input/Output per Second, IOPS) и на 65% лучшую производительность, потребляя при этом до 45% меньше мощности, чем контроллеры предыдущего поколения.

        Новый смешанный режим обеспечивает клиентам высокую гибкость за счет использования и HBA (Host Bus Adapter), и RAID одновременно, на единственном контроллере, что освобождает слот PCIe для другого использования. В ассортименте HPE - контроллеры Smart Array S-Class software RAID, Smart Array E-Class и P-Class.

        Для решений начального уровня с дисками SATA наиболее подходящим является HPE Smart Array Software RAID. Его особенности включают уровни RAID 0/1/5/10, поддержку 6G SATA и доступ к инструменту конфигурации Unified Extensible Firmware Interface (UEFI).

        Рентабельные HPE Smart Array E-Class Controllers реализуют простой RAID для определяемого ПО устройства хранения данных (Software-Defined Storage, SDS) с надежностью и безопасностью уровня предприятия. Его главные особенности - RAID on Chip (ROC) и реализация RAID levels 0/1/5/10.

        Эти контроллеры работает в смешанном режиме, шифруют любой подключенный к ним диск, используя HPE Smart Array SR Secure Encryption, и предоставляют администратору инструмент конфигурации UEFI.

        Максимальная производительность системы хранения данных корпоративного класса достигается применением HPE Smart Array P-Class Controllers.

        Эти контроллеры поддерживаются в стойках и корпусах HPE ProLiant, BladeSystem, серверах Apollo и в Synergy Compute Modules. Их главные особенности - технология Raid-on-Chip (ROC), поддержка флеш-кэша (Flash-Backed Write Cache, FBWC) и расширенный RAID levels 0/1/5/6/10/50/60/1 ADM/10 ADM.

        Контроллер работает в смешанном режиме, шифрует любой присоединенный диск с HPE Smart Array SR Secure Encryption и предоставляет UEFI. Он доступен для трех типов рабочих нагрузок - предприятие (оптимизация производительности), средний бизнес (оптимизация емкости) и малый бизнес. Имеет интерфейсы SAS (12G) и SATA (6G) и допускает два форм-фактора дисков - SFF (2,5 дюйма) и LFF (3,5 дюйма).

        Жесткие диски уровня предприятия (SAS 15K и 10K) обеспечивают наивысшие уровни производительности и надежности работы приложений для решения ответственных задач с интенсивным потоком операций ввода-вывода (Input/Output, I/O).

        Жесткие диски среднего уровня (SAS/SATA 7,2K) обеспечивают высокую производительность и надежность для большинства бизнес-приложений.

        Жесткие диски начального уровня предназначены для некритических потребностей сегодняшних приложений в среде хранения. Эти диски имеют достаточную производительность и самое низкое значение стоимости ($/GB).

        Дальнейшее ускорение выполнения приложений с интенсивным обменом данными в корпоративной среде достигается применением твердотельных дисков (Solid-State Drives, SSD) с высокой производительностью и малым временем ожидания.

        HPE SSD могут иметь шесть форм-факторов - SFF (2,5 дюйма), LFF (3,5 дюйма), M.2, M.2 Enablement Kits, Mezzanine и Add-in Cards. Они доступны в трех категориях, разделенных по уровню целевых рабочих нагрузках - Read Intensive, Mixed Use и Write Intensive.

        Рабочая нагрузка определяется как число записей на диск в день (Drive Writes Per Day, DWPD) и обычно рассчитывается по формуле

        DWPD = (GB/Day) / Capacity

        Т.е., сколько объемов диска записывается в течение суток. HPE также определяет DWPD как «максимальное количество записей хоста 4K на всю емкость диска SSD в день за пятилетний период».

        Read Intensive SSD, как правило, имеют наименьшую цену и выносливость <= 1 DWPD. Они идеальны для загрузки приложений, веб-серверов и чтения кэша.

        Write Intensive SSD типично имеют самую высокую производительность при чтении со значением DWPD >= 10. Идеальны для обработки транзакций онлайн (On-Line Transaction Processing, OLTP), для применения в бизнес-аналитике (Business Intelligence, и Big Data аналитике.

        Mixed Use SSD используются для неопределенных рабочих нагрузок, которые нуждаются в балансе между высокой производительностью записи и чтения. Значение DWPD для них составляет 1-10. Идеальны для приложений с большими потоками I/O.

        Все диски серверов HPE поддерживаются HPE Digitally Signed Firmware, которое предотвращает несанкционированный доступ к данным. Каждый диск протестирован на 3,35 млн. часов безотказной работы. Дополнительная информация приведена здесь.

        Устойчивая память (HPE Persistent Memory). HPE предлагает самый широкий ассортимент устойчивой памяти на рынке, состоящий из высокопроизводительной NVDIMM и HPE Scalable Persistent Memory - интегрированного решения для хранения данных. Решение работает на скоростях DRAM, сочетая производительность памяти с устойчивостью хранения. К настоящему времени HPE Scalable Persistent Memory поддерживается только на серверах DL380 Gen10.

        HPE Scalable Persistent Memory содержит три основных компонента - DRAM для ускорения работы приложений, специализированную флеш-память для обеспечения устойчивости и источник резервного питания для бесперебойного перемещения данных от DRAM к Flash.

        HPE Scalable Persistent Memory реализует дополнительные функции памяти, выполняя проверку правильности выполнения операций до х27 быстрее, и до х20 сокращает время перезапуска базы данных, обеспечивая максимальную продолжительность бесперебойной работы.

        HPE Scalable Persistent Memory может также быть полезна в HTAP (Hybrid Transactional / Analytical Processing), многорядном кэшировании SDS и др. Модули HPE NVDIMM объемом 8 GB и 16 GB (последние доступны со второго полугодия 2017) поддерживаются флеш DIMM. Дополнительная информация приведена здесь.

        HPE Server Network Adapters. Адаптеры HPE Server Networking помогают предотвратить, обнаружить кибератаки и восстановиться после них, защищая приложения, данные и серверную инфраструктуру средствами установления подлинности (аутентификации) программируемого оборудования через архитектуру Root of Trust. Кроме того, они предлагают Secure Boot, Device-level Firewall и другие продвинутые механизмы безопасности. Дополнительная информация приведена здесь.

        HPE Rack and Power Infrastructure. HPE Rack and Power Infrastructure предоставляет конфигурируемые решения для построения инфраструктуры «из коробки», чтобы соответствовать потребностям предприятий всех размеров, - сегодня и в будущем. Поставка HPE Rack and Power Infrastructure предусматривает стойку сервера, а также системы электропитания и охлаждения.

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

        В данную статью не вошли сведения о дополнительных сервисах HPE для серверов HPE ProLiant Gen10, требующих отдельного описания - OneView, ASHRAE, iLO5 и других.
        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/337890/


        Метки:  

        Параллельный Hystrix. Повышаем производительность распределенных приложений

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

        Параллельный Hystrix. Повышаем производительность распределенных приложений

          Около года назад наша команда переписала бэкенд одного малоизвестного приложения с 5 млн. пользователей с использованием «latency and fault tolerance» Hystrix. Это позволило значительно повысить надежность приложения при падении или задержках в нижестоящих системах (их около 10, что для серьезной системы не много), предоставило замечательный инструмент (Hystrix Dashboard) мониторинга нагрузки внешних систем (теперь мы знаем кто тормоз), позволило оптимизировать размеры различных пулов в приложении. Однако, осталась проблема длительной обработки отдельных тяжелых запросов, решению которой и посвящена эта статья.

          Почему вставить хистрикс было легко


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

          Рассмотрим простой пример — команду CommandHelloWorld, которая с задержкой извлекает очень важные данные и клиентский код, который ее использует.

          public class CommandHelloWorld extends HystrixCommand {  
              @Override
              protected String run() throws InterruptedException {       
                  // вот тут происходит очень важное обращение во внешнюю систему
                  // все это работает в пуле потоков хистрикса
                  Thread.sleep(random.nextInt(500));
                  return "Hello " + name + "!";
              }
          }
          
          // клиентский код
          String executeCommand(String str) {
                  // вызов зависает на время, не большее чем установленный таймаут.
                  return new CommandHelloWorld(str).execute();        
              }
          


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

          Как нам обустроить хистрикс



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


          Конечно, теоретически, в java stream есть операция parallel, но по факту в ней крайне плохое управление пулами потоков, в которых будет производиться работа, что ее использования было решено отказаться. Нужно было бы какое-то понятное решение, которое бы не сломало исходный Паттерн и не сломало моск команде. В результате было предложено 2 работающих решения — на основе reactivex.io и надстройкой над java stream.

          Демонстрационный пример можно найти на гитхабе, все работающие примеры помещены в тесты.

          Вариант 1. Добавим реактивности


          Нужно заметить, что внутри хистрикс использует реактивную (это термин, не факт что она быстрая) библиотеку " асинхронных источников данных" reactivex.io. Статья не является руководством по этой не объятной теме, но будет показано одно элегантное решение. К несчастью, я не знаком с устоявшимся русским переводом термина observable, потому буду называть его источником. И так, желая не сломать Паттерн, мы будем действовать таким образом:
          • получаем список с исходными данными
          • формируем из него источник
          • фильтруем/маппируем источник, с хистриксом в том числе
          • коллекционируем из источника список

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

          static List toList(Observable observable) {
                  return observable.timeout(1, TimeUnit.SECONDS).toList().toBlocking().single();
          }
          


          Создавать команды и источники будем двумя функциями, пользуясь родным API:

               /**
               * создает горячую хистриксную команду-источник    
               */
              static Observable executeCommand(String str) {
                  LOG.info("Hot Hystrix command created: {}", str);
                  return new CommandHelloWorld(str).observe();
              }
          
              /**
               * создает холодную хистриксную команду-источник    
               */
              static Observable executeCommandDelayed(String str) {
                  LOG.info("Cold Hystrix command created: {}", str);
                  return new CommandHelloWorld(str).toObservable();
              }
          


          И так, рассмотрим простой случай обработки списка их 6 элементов:
              public void testNaive() {
                  List source = IntStream.range(1, 7).boxed().collect(Collectors.toList());
                  Observable observable = Observable.from(source)
                          .flatMap(elem -> executeCommand(elem.toString()));
                  toList(observable).forEach(el ->LOG.info("List element: {}", el));
              }
          

          Все замечательно параллельно отрабатывает приблизительно за 500мс, логи программы подтверждают одновременное использование потоков хистрикса. Как побочный эффект — элементы располагаются в списке в случайном порядке. Такова цена реактивности.
          Попробуем увеличить размер списка до 49 — и получим закономерный облом:
              public void testStupid() {
                  List source = IntStream.range(1, 50).boxed().collect(Collectors.toList());
          
                  Observable observable = Observable.from(source)
                          .flatMap(elem -> executeCommand(elem.toString()));
          
                  toList(observable).forEach(el ->LOG.info("List element: {}", el));
              }
          

          Вот такой смешной выхлоп в лог:
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 1
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 2
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 3
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 4
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 5
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 6
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 7
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 8
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 9
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 10
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 11
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command start: 5
          [hystrix-ExampleGroup-2] INFO org.silentpom.CommandHelloWorld - Command start: 2
          [hystrix-ExampleGroup-9] INFO org.silentpom.CommandHelloWorld - Command start: 9
          [hystrix-ExampleGroup-8] INFO org.silentpom.CommandHelloWorld - Command start: 8
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command start: 4
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command start: 1
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command start: 6
          [hystrix-ExampleGroup-10] INFO org.silentpom.CommandHelloWorld - Command start: 10
          [hystrix-ExampleGroup-3] INFO org.silentpom.CommandHelloWorld - Command start: 3
          [main] ERROR org.silentpom.RxHystrixTest - Ooops
          com.netflix.hystrix.exception.HystrixRuntimeException: CommandHelloWorld could not be queued for execution and no fallback available.
          


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

          Решение обнаружилось достаточно простое:
          1. Для начала мы не будет использовать flatMap, чтобы подписка на источник не вызывала создание всех команд. А создадим двойной источник методом map.
          2. сгруппируем эти источники методом window — получим тройной источник!
          3. пришло время строго упорядочить тройные источники — выпускаем их один за одним методом concatMap
          4. каждый двойной источник параллельно вычислим методом flatMap


          Код оказался удивительно компактным, хотя на понимание его работы ушло много времени:
          public void testWindow() {
                  List source = IntStream.range(1, 50).boxed().collect(Collectors.toList());
          
                  Observable observable =  Observable.from(source)
                                  .map(elem -> executeCommandDelayed(elem.toString()))
                                  .window(7)
                                  .concatMap(window -> window.flatMap(x -> x));
          
                  toList(observable).forEach(el ->LOG.info("List element: {}", el));
              }
          

          Посмотрим фрагмент логов:
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 20
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 21
          [hystrix-ExampleGroup-3] INFO org.silentpom.CommandHelloWorld - Command start: 3
          [hystrix-ExampleGroup-7] INFO org.silentpom.CommandHelloWorld - Command start: 7
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command start: 5
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command start: 4
          [hystrix-ExampleGroup-2] INFO org.silentpom.CommandHelloWorld - Command start: 2
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command start: 6
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command start: 1
          [hystrix-ExampleGroup-3] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 3
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 6
          [hystrix-ExampleGroup-2] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 2
          [hystrix-ExampleGroup-7] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 7
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 1
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 5
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 4
          [hystrix-ExampleGroup-8] INFO org.silentpom.CommandHelloWorld - Command start: 8
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command start: 11
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command start: 12
          


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

          Вариант 2. Нафиг реактивность! У нас есть екзекуторы


          Редкий человек понимаем rx. Если даже он говорит обратное — попросите написать код выше своими словами. Но ведь в java 8 и так есть stream и future, хистрикс вроде умеет работать с future как с родной, давайте попробуем запустить параллельную обработку с их помощью. Создавать future будем так:

            // просим хистрикс запустить команду и вернуть фьючу
            static Future executeCommandDelayed(String str) {
                  LOG.info("Direct Hystrix command created: {}", str);
                  return new CommandHelloWorld(str).queue();
              }
          
            // по старинке синхронно вызываем хистрикс, все в ручную
            static String executeCommand(String str) {
                  LOG.info("Direct Hystrix command created: {}", str);
                  return new CommandHelloWorld(str).execute();
              }
          

          Пробуем обработать список из 49 элементов:
          public void testStupid() {
                      IntStream.range(1, 50).boxed().map(
                              value -> executeCommandDelayed(value.toString())
                      ).collect(Collectors.toList())
                              .forEach(el -> LOG.info("List element (FUTURE): {}", el.toString()));
          }
          

          и снова знакомая проблема.
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 2
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 3
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 4
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 5
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 6
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 7
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 8
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 9
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 10
          [main] INFO org.silentpom.stream.ParallelAsyncServiceTest - Direct Hystrix command created: 11
          [main] ERROR org.silentpom.stream.ParallelAsyncServiceTest - Ooops
          com.netflix.hystrix.exception.HystrixRuntimeException: CommandHelloWorld could not be queued for execution and no fallback available.
          

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

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

          Для реализации первого шага сделаем отдельный оператор parallelWarp по преобразованию пользовательской функции, для второго шага придется написать функцию waitStream, принимающую и возвращающую стримы:
            public void testSmart() {
                  service.waitStream(
                          IntStream.range(1, 50).boxed().map(
                                  service.parallelWarp(
                                          value -> executeCommand(value.toString())
                                  )
                          )
                  ).collect(Collectors.toList())
                          .forEach(el -> LOG.info("List element: {}", el));
              }

          получилась почти привычная для пользователей стримов запись. Посмотрим что под капотом, это последний фрагмент кода на сегодня:
          // по традиции threadSize = 7
           public ParallelAsyncService(int threadSize) {
                  ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
                          .setNameFormat("parallel-async-thread-%d").build();
          // создаем промежуточный экзекутор, который будет создавать команды хистрикса
                  executorService = Executors.newFixedThreadPool(threadSize, namedThreadFactory);
              }
          
              /**
               * Maps user function T -> Ret to function T -> Future. Adds task to executor service
               * @param mapper user function
               * @param  user function argument
               * @param  user function result
               * @return function to future
               */
              public  Function> parallelWarp(Function mapper) {
                  return (T t) -> {
                      LOG.info("Submitting task to inner executor");
                      Future future = executorService.submit(() -> {
                          LOG.info("Sending task to hystrix");
                          return mapper.apply(t);
                      });
                      return future;
                  };
              }
          
              /**
               * waits all futures in stream and rethrow exception if occured
               * @param futureStream stream of futures
               * @param  type
               * @return stream of results
               */
              public  Stream waitStream(Stream> futureStream) {
                  List> futures = futureStream.collect(Collectors.toList());
          
                  // wait all futures one by one.
                  for (Future future : futures) {
                      try {
                          future.get();
                      } catch (InterruptedException e) {
                          throw new RuntimeException(e);
                      } catch (ExecutionException e) {
                          Throwable cause = e.getCause();
          
                          if (cause instanceof RuntimeException) {
                              throw (RuntimeException) cause;
                          }
                          throw new RuntimeException(e);
                      }
                  }
          
                  // all futures have completed, it is safe to call get
                  return futures.stream().map(
                          future -> {
                              try {
                                  return future.get();
                              } catch (Exception e) {
                                  e.printStackTrace();
                                  return null; // не должен вызываться вообще
                              }
                          }
                  );
          

          Метод waitStream очень прост, только обработка ошибок его испортила. Оператор parallelWarp крайне прост и наверняка имеет специальное название у адептов функционального программирования. Новые хистрикс команды создаются только внутренним экзекутором, который имеет нужную нам степень параллельности. Пруфлинк:
          main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 18
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 19
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 20
          [main] INFO org.silentpom.RxHystrix - Cold Hystrix command created: 21
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command start: 4
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command start: 1
          [hystrix-ExampleGroup-2] INFO org.silentpom.CommandHelloWorld - Command start: 2
          [hystrix-ExampleGroup-3] INFO org.silentpom.CommandHelloWorld - Command start: 3
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command start: 5
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command start: 6
          [hystrix-ExampleGroup-7] INFO org.silentpom.CommandHelloWorld - Command start: 7
          [hystrix-ExampleGroup-2] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 2
          [hystrix-ExampleGroup-5] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 5
          [hystrix-ExampleGroup-3] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 3
          [hystrix-ExampleGroup-7] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 7
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 6
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 4
          [hystrix-ExampleGroup-1] INFO org.silentpom.CommandHelloWorld - Command calculation finished: 1
          [hystrix-ExampleGroup-4] INFO org.silentpom.CommandHelloWorld - Command start: 11
          [hystrix-ExampleGroup-6] INFO org.silentpom.CommandHelloWorld - Command start: 12
          [hystrix-ExampleGroup-8] INFO org.silentpom.CommandHelloWorld - Command start: 8
          [hystrix-ExampleGroup-7] INFO org.silentpom.CommandHelloWorld - Command start: 13
          [hystrix-ExampleGroup-9] INFO org.silentpom.CommandHelloWorld - Command start: 9
          


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

          Повторюсь, что все примеры можно посмотреть в тестах на гитхабе. Буду рад знаменитой хаброкритике.
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/337864/


          Метки:  

          Конкурс Fintech-стартапов FINOPOLIS-2017

          Среда, 13 Сентября 2017 г. 18:33 + в цитатник

          Метки:  

          [Перевод] О-о-очень долгожданный релиз Sublime Text 3.0

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

          О-о-очень долгожданный релиз Sublime Text 3.0

          • Перевод

          Спустя долгие годы ожидания в beta и alpha релизах (а это около 3.5 лет) наконец-то вышел Sublime Text 3.0!


          linux


          Предисловие: Sublime Text — является комерческим (хотя никто и не заставляет покупать лицензию) графическим текстовым редактором под 3 основные десктопные платформы.


          В сравнении с последней бетой, версия 3.0 привносит обновленную тему пользовательского интерфейса, новые цветовые схемы и новую иконку. Помимо этого улучшена подсветка синтаксиса, поддержка тачпада на Windows, поддержка тачбара на macOS и репозитории apt/yum/pacman для Linux.


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


          Определенно, в 3 версии добавили огромные фичи, например: прыжок на определение (F12), новый движок для подсветки синтаксиса, новый UI и расширенное API. Однако различия повсюду ощущаются в мелочах, которые сложно выделить самодостаточные: проверка орфографии работает лучше, автоматический отступ стал делать правильные вещи чаще, перенос слов лучше обрабатывает исходный код, правильно поддерживаются мониторы с высоким DPI, а также переход к файлам (Goto Anything ctrl+p) стал умнее. Перечислять все нудно и долго, но отличия разительны.


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

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

          https://habrahabr.ru/post/337882/


          Метки:  

          Причуды Stream API

          Среда, 13 Сентября 2017 г. 17:52 + в цитатник

          Метки:  

          [Из песочницы] Streaming API. Небольшой пример на PHP

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

          Streaming API. Небольшой пример на PHP

          Летом проходил конкурс от ВКонтакте на тему «Streaming API Contest». Я решил поучаствовать, но так как нормальной идеи для реализации всех возможностей Streaming API я не нашел, то решил просто выводить записи по указанным правилам.

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

          Более подробно здесь.

          Сначала думал реализовать все на Node.Js, но потом, чтобы не тратить время на его настройку на VPS сервере, решил использовать PHP.

          Всю логику проекта решил отдать клиенту, на сервере же только небольшие настройки по работе с API ВКонтакте и анализатор.

          Начнем с интересного — главного:

          //все понятно и стандартно
          var socket = new WebSocket("wss://streaming.vk.com/stream?key=" + window.key);
          var close_connect = ge("close_connect");
          
          /*
          * Здесь еще очень много кода
          */
          
          socket.onmessage = function(event) {
            var incomingMessage = event.data;
            var loading = document.getElementById("loading_text");
            var preview = document.getElementById("preview_text");
            var serf = document.getElementById("serf");
          
            loading.classList.add("none");
            preview.classList.add("none");
            serf.classList.remove("none");
            parser(event.data); //вот здесь начинается вся логика
            console.log(event.data);
          };
          
          socket.onclose = function(event) {
            if (event.wasClean) {
              console.warn('Соединение закрыто чисто');
            } else {
              console.warn('Обрыв соединения');
            }
            console.info('Код: ' + event.code + ' причина: ' + event.reason);
            var loading = ge("loading_text");
            if (event.code == 1006) {
              loading.innerHTML = "На этой планете уже есть человек, который сидит на этом сайте.
          К сожалению - это не Вы. Повторите попытку позже.
          Код ошибки - " + event.code; } else { loading.innerHTML = "Что-то или кто-то здесь не так...
          Код ошибки - " + event.code; } }; socket.onerror = function(error) {}; //close connect close_connect.addEventListener("click", function() { socket.close(); close_connect.innerHTML = "Соединение закрыто клиентом."; ge("analiz_block").classList.remove("none"); }, false);


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

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


          Далее разберём основную функцию parser(event.data). Я люблю шаблоны, ими легко управлять и с ними легко взаимодействовать.

          Много кода
          var parser = function(json) {
            var response = JSON.parse(json);
            console.log(response);
            var code = response.code;
            console.log(code);
          
            if (code != 100) return;
          
            var tpl_block = document.getElementById("tpl");
            var tpl = tpl_block.innerHTML;
            var main_tpl = tpl_block.innerHTML;
            var content = document.getElementById("main").innerHTML;
            var main = document.getElementById("main");
          
            var time = response.event['creation_time'];
            var date = new Date(time);
            var type;
          
            var cnt = ge("cnt");
            var cnt_value = +cnt.innerHTML;
            cnt.innerHTML = cnt_value + 1;
          
            var creation_time = timestampToDate(response.event['creation_time'] * 1000);
          
            if (response.event['event_type'] == "post") {
              type = "Публикация";
              count['post'] = ++count['post'];
            } else if (response.event['event_type'] == "comment") { 
              type = "Комментарий";
              count['comment'] = ++count['comment'];
            } else if (response.event['event_type'] == "share") {
              type = "Репост";
              count['share'] = ++count['share'];
            }
          
            var photo_context;
            if (response.event.attachments) {
              //image 
              if (response.event.attachments[0].type == "photo") {
                photo_context = '
          image
          '; } else { photo_context = ""; } } else { photo_context = ""; } tpl = tpl.split("{event_type}").join(type); tpl = tpl.split("{text}").join(response.event['text']); tpl = tpl.split("{url}").join(response.event['event_url']); tpl = tpl.split("{date}").join(creation_time); tpl = tpl.split("{photo}").join(photo_context); tpl = tpl.split("{type}").join(response.event['event_type']); tpl = tpl.split("{cnt}").join(cnt_value+1); tpl = tpl.split("\"").join("'"); if (filter.top) main.innerHTML = tpl + "" + content; else main.innerHTML = content + "" + tpl; //post_id if (response.event['event_type'] != "comment") { var post_owner_id = response.event.event_id['post_owner_id']; var post_id = response.event.event_id['post_id']; var wall_id = post_owner_id + "_" + post_id; array_post_id.push(wall_id); } //limit if (cnt_value + 1 >= +filter.limit) { socket.close(); close_connect.innerHTML = "Достигнут лимит публикаций."; ge("analiz_block").classList.remove("none"); } }


          Сам шаблон:

          {event_type}
          {text}
          {photo}
          Дата публикации - {date}

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

          Один шаблон под три разновидности публикации. Удобно.

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

          Анализ кода
          var analiz = {
            start: function() {
            	//
              if (count['post'] == 0 && count['comment'] == 0 && count['share'] == 0) {
                alert("Невозможно запустить анализ. Причина - публикации не найдены.");
                return;
              }
          
              var url = "/vk-competition/VKanaliz.php";
              var loading = ge("loading_sp");
              var button = ge("btn_analiz");
              var analiz_stats = ge("analiz_stats");
              loading.classList.remove("none");
              button.classList.add("none");
          
              ajax.post({
                url: url,
                data: "post_id=" + array_post_id.join(","),
                callback: function(data) {
                	var resp = JSON.parse(data);
                	if (resp.error) {
                	  alert(resp.error);
                	  return;
                	} else {
                	  var count_likes_all_ = resp.response.count_likes_all;
                	  var count_share_all_ = resp.response.count_share_all;
                	  var count_views_all_ = resp.response.count_views_all;
                	  var analiz_posts = ge("analiz_post");
                	  var analiz_share = ge("analiz_share");
                	  var analiz_comments = ge("analiz_comments");
                	  var analiz_likes = ge("analiz_likes");
                	  var analiz_views = ge("analiz_views");
                	  var analiz_reposts = ge("analiz_reposts");
                    var analiz_years = ge("analiz_years_");
                    var analiz_sex = ge("analiz_sex");
                    var percent_sex_m, percent_sex_w;
          
                    if (resp.response.percent_sex_w == "-") 
                      percent_sex_w = 0;
                    else 
                      percent_sex_w = resp.response.percent_sex_w;
          
                    if (resp.response.percent_sex_w == "-")
                      percent_sex_m = 0;
                    else
                      percent_sex_m = 100 - +percent_sex_w;
          
                    console.log("spam " + resp.response.spam + "%");
          
                	  //insert data 
                    analiz_posts.innerHTML = count['post'];
                    analiz_share.innerHTML = count['share'];
                    analiz_comments.innerHTML = count['comment'];
                    analiz_likes.innerHTML = count_likes_all_;
                    analiz_views.innerHTML = "H" + count_views_all_;
                    analiz_reposts.innerHTML = count_share_all_;
                    analiz_sex.innerHTML = percent_sex_w + "%, " + percent_sex_m + "%";
                    analiz_years.innerHTML = resp.response.middle_years;
          
                    //show stats
                    loading.classList.add("none");
                	  analiz_stats.classList.remove("none");
                	}
                }
              });
            }
          }
          


          VKanaliz.php — файл, который возвращает данные в json. Его содержимое можно посмотреть здесь.

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

          Посмотреть пример в живую можно здесь.
          Исходный код доступен на GitHub.

          Всем добра!
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/337874/


          Метки:  

          RailsClub 2017. Интервью с Luca Guidi, автором Hanami: смешиваем FP и OOP в Ruby

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

          RailsClub 2017. Интервью с Luca Guidi, автором Hanami: смешиваем FP и OOP в Ruby

            Всем привет! Мы вовсю готовимся к RailsClub, который состоится 23 сентября (ааааа, это уже на следующей неделе!!). Программа на сайте, 500 крутых рубистов уже зарегистрировались, ждем только тебя! Еще можно успеть заскочить в последний вагон и поучаствовать в главном Ruby событии года в России.

            У Павла Аргентова получилось очень интересное интервью с потрясающим человеком. Luca Guidi — семьянин, независимый OSS разработчик, автор Ruby фреймворка Hanami.

            image

            Каков твой программистский опыт? Как ты попал во вселенную Ruby?

            Программировать я начал ещё подростком, в старших классах школы. Профессиональная карьера стартовала около пятнадцати лет назад — я работал вебдевом на Java, что было ужасно. Это продолжалось пару лет, это была боль. Затем я переключился на Ruby, потому что появились Rails. Rails в те времена произвели революцию: веб-разработка стала сопряжена с меньшими страданиями. С тех самых пор, а это было ещё в эпоху до версии 1.0, Ruby является моим главным языком. Кроме Ruby я изучил Go и пару капель Elixir-а: последний мне интересен, а Go я использую для работы.

            Не кажется ли тебе, что Ruby — лучший OO-язык, чем другие языки этой разновидности?

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

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

            Каковы, по твоему мнению, сильные и слабые стороны Ruby? Есть ли в Ruby жизнь вне Rails?

            Исторически сложилось, что самая сильная сторона Rails — монолитность, сам факт, что “Рельсы” стали “большой” платформой. Это сыграло свою роль не только в экосистеме Ruby, но и в индустрии веб-разработки в целом.

            Можно заметить, что с приходом Rails язык получил невероятное распространение. Огромное количество людей стали его использовать. Это сформировало к Ruby должное доверие. Плохо то, что Rails целиком поглотили Ruby, что создало излишнее единообразие. Есть куча программистов, которые знают Rails, но совсем не знают Ruby как язык. Куча гемов по умолчанию подразумевает, что ты используешь Rails. Такая ситуация может здорово навредить языку. Если попытаться работать вне Rails, например с Hanami или с системной автоматизацией, обязательно возникнут проблемы.Так что скажу, что Rails это и главное благословение, и в то же время главное проклятие для Ruby комьюнити.

            Продолжая тему борьбы добра со злом, скажу, что в Ruby сейчас самый удачный момент для развития экосистемы. Хорошая новость в том, что если у тебя в руках 5-8-летнее Rails-приложение, то несмотря на некоторые проблемы с переходом на новые версии Rails, все работает — потому что изначальные приёмы работы с фреймворком не менялись уже более десятилетия. Поэтому у тебя все ок. Плохая новость — экосистема и язык, которые принципиально не эволюционируют и предлагают только один путь решения всех задач, в конце концов сойдут на нет. Тем не менее, сейчас происходит много вещей, полезных в этом отношении. Во-первых, Hanami в этом году дошел до версии 1.0; все больше приложений начинают использовать его в продакшн. Во-вторых, ROM, у которого вышла уже версия 4.0. В третьих, Dry-rb — набор компактных библиотек для таких вещей, как обработка данных и тому подобного. Развитие всего этого — отличная новость. У нас появляется выбор: если тебе как разработчику подходят Rails — Rails даст уверенность. Если же Rails не подходит — есть рабочие альтернативы.

            Ты написал Hanami. Зачем нам еще один web framework?

            В экосистеме Ruby уже довольно много веб фреймворков, но почти все они являются клонами Sinatra. Hanami отличается тем, что не повторяет Sinatra. Он впитывает хорошие идеи Rails и приводит в порядок те моменты, которые стоит улучшить. Я хочу посоветовать даже тем, кто не планирует переходить с Rails никогда и никуда, пристально посмотреть на Hanami и другие фреймворки, чтобы научиться чему-то новому.

            Какие гемы/идеи ты считаешь наиболее полезными в Ruby?

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

            На что в FP, по твоему, стоит обратить внимание рубистам, которые в основном занимаются OOP?

            Снова, иммутабельность и композиция. Не обязательно под соусом чистых функций. Определенно стоит посмотреть, как устроен Elixir. Моя идея заключается в том, что стоит сочетать FP и OOP. Пример, который я могу привести — функциональные объекты. Это объекты, которые, подобно функции, принимают на вход некоторые данные и возвращают результат, но кроме всего прочего имеют некоторое хранимое состояние или способ вызова, при котором нет необходимости постоянно передавать всё это состояние и прочие зависимости в параметрах. В то же время, по определению, функциональный объект призван качественно выполнять одну единственную задачу, что согласуется с принципом single responsibility.

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

            Так о чем же ты будешь говорить на RailsClub?

            Буду говорить о том, как совмещать OOP и FP. Как это стало движущей идеей в Hanami 1.0. Если конкретнее, то я буду говорить об actions. Actions — это объекты, которые “показывают” один единственный метод, принимающий ввод и возвращающий вывод — HTTP-response, отвечающий спецификации Rack. Есть ещё валидаторы, которые ведут себя аналогичным образом. Идея в том, чтобы оценить то, что мы имеем сейчас — и стандартизировать поведение в версии 2.0. Ещё идея — пытаться построить приложение для каждого юзкейса, для каждой фичи, которая есть в монолитных приложениях — сделать что-то вроде конвейера из функций, скомбинированных друг с другом. Когда принимаешь данные на вход, валидируешь, приводишь типы, манипулируешь, обрабатываешь и потом возвращаешь что-то пользователю. Что-то такое я и хочу показать, хочу стандартизировать находящийся в нашем распоряжении набор объектов. Это уже выходит за пределы MVC, потому что в MVC ты делаешь запрос к контроллеру, ты делаешь бла-бла-бла, и ты совершенно не знаешь, что происходит там внутри. А мы все хотели бы иметь четко определенный воркфлоу, знать когда и где к нам вернется ответ. На этом уровне наша цель — создать конвейер преобразования данных. Если описывать, что делает то или иное приложение, получается, что оно принимает данные на вход, как-то их обрабатывает при помощи базы данных и выдает то, что получилось, на выход. Если мыслить в терминах преобразования данных, все можно разбить на последовательные шаги. Если предыдущий шаг выполнен успешно, можно переходить к следующему. Если нет, разбираемся с исключениями и ошибками, которые вернул предыдущий шаг. На мой взгляд, все это можно и нужно стандартизировать.

            Что посоветуешь почитать начинающим и опытным рубистам?

            Рекомендую “Practical Object-Oriented Design in Ruby” от Sandi Metz. Там нет ничего про FP, но это важная книга, которая помогает понять OOP-часть. Было бы неестественно использовать Ruby как чисто функциональный язык, никто не отменял все те хорошие OOP-вещи, которые в Ruby уже есть, и они отлично описаны в книге.

            Вторая книга — “Exceptional Ruby” от Avdi Grimm. Это короткая книжка, которая разбирает, почему в экосистеме Ruby мы используем exceptions для сигнализации ошибок. В теории exceptions должны использоваться для действительно исключительных ситуаций, типа “ой, у нас пропала база данных”, но никак для таких вещей как проверка базы данных на консистентность. В новых языках программирования типа Go и Elixir мы никогда не встречаемся с exceptions, только с errors, и это делает виртуальную машину менее тяжелой. А еще такой подход делает код более естественным. Эта короткая, но очень серьёзная книга показывает концепцию, которая сильно повлияла на мой образ мыслей.

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

            Как бы ты пригласил программистов к участию в Open Source?

            Это вопрос отдачи. Например, Rails, как open source проект, бесплатны в том смысле, что мы не платим денег за их использование, но при этом они помогают нам зарабатывать деньги. Поэтому нужно осознать ту ценность, которую принцип open source несёт для разработчика и его компании, и начать отдавать что-то взамен. Это не значит, что следует заниматься open source фултайм — достаточно просто помогать другим время от времени. Я, например, начинал заниматься Hanami по 30 минут каждый день, я вообще большой поклонник концепции маленьких шажочков. Open source не обязан становиться второй работой. Быть open source разработчиком это в большей степени про отношение, а не про конкретные коммиты в проекты. Например, добавить пару слов в устаревшую документацию занимает 5 минут, но может быть очень полезно для сообщества. Нашел баг — заведи issue. А есть еще и меркантильная сторона: то, что ты контрибьютишь в популярные проекты, отлично выглядит в резюме. Да, при таком подходе приходится работать асинхронно, но я думаю что это будущее, которое нас ждет. Учишься быть терпеливым, проникаешься этой философией, привыкаешь адаптироваться под разные условия и концепции. Open source поможет быстрее освоиться на новых местах работы, лучше узнать Ruby, научит читать чужой код. Короче говоря, получаешь очень много навыков, которые здорово помогут тебе текущей работе. Или — найти новую, если заскучаешь на этой. Open source помогает не только быть хорошим программистом, но еще и учит куче важных вещей помимо программирования, которые могут очень сильно пригодиться.

            Если вы хотите поговорить с Лукой лично (а это очень вдохновляет!), откладывать покупку билета уже некуда! Регистрация тут, цена билета — 9000 рублей.

            Читать интервью на английском — на hype.codes

            Спасибо компаниям, которые поддерживают конференцию:
            Генеральный партнер: Toptal
            Золотой партнер: Лига Цифровой Экономики
            Бронзовые партнеры: Mkdev, VoltMobi, Рево, InSales

            До встречи на RailsClub!
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/337862/


            Метки:  

            Нейросети: как искусственный интеллект помогает в бизнесе и жизни

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

            Нейросети: как искусственный интеллект помогает в бизнесе и жизни

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

              В работе Oxford Martin School 2013 года говорилось о том, что 47% всех
              рабочих мест может быть автоматизировано в течение следующих 20 лет. Основным драйвером этого процесса является применение искусственного интеллекта, работающего с большими данными, как более эффективной замены человеку.



              Машины теперь способны решать все больше процессов, за которые раньше отвечали люди. Кроме того, делают это качественнее и во многих случаях дешевле. О том, что это значит для рынка труда, в июле этого года говорил Герман Греф, выступая перед студентами Балтийского федерального университета им. Канта:
              Мы перестаём брать на работу юристов, которые не знают, что делать с нейронной сетью. <...> Вы — студенты вчерашнего дня. Товарищи юристы, забудьте свою профессию. В прошлом году 450 юристов, которые у нас готовят иски, ушли в прошлое, были сокращены. У нас нейронная сетка готовит исковые заявления лучше, чем юристы, подготовленные Балтийским федеральным университетом. Их мы на работу точно не возьмем.”

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



              Искусственный интеллект, машинное обучение и нейросети: в чем разница



              Нейронная сеть – один из способов реализации искусственного интеллекта (ИИ).

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

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

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



              #интересное Существует два типа искусственного интеллекта (ИИ): слабый (узконаправленный) и сильный (общий). Слабый ИИ предназначен для выполнения узкого списка задач. Такими являются голосовые помощники Siri и Google Assistant и все остальные примеры, которые мы приводим в этой статье. Сильный ИИ, в свою очередь, способен выполнить любую человеческую задачу. На данный момент реализация сильного ИИ невозможна, он является утопической идеей.

              Как устроена нейросеть



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

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

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

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



              История нейросетей



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

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


              Mark I Perceptron — машина Розенблатта

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

              Почему нейросети вновь популярны



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

              Но в 2010 году появилась база ImageNet, содержащая 15 миллионов изображений в 22 тысячах категорий. ImageNet многократно превышала объем существовавших баз данных изображений и была доступна для любого исследователя. С такими объемами данных нейросети можно было учить принимать практически безошибочные решения.


              Размер ImageNet в сравнении с другими существовавшими в 2010 году базами изображений

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

              Результатов в решении этой проблемы в 2006 году добились три независимых группы ученых. Во-первых, Джеффри Хинтон реализовал предобучение сети при помощи машины Больцмана, обучая каждый слой отдельно. Во-вторых, Ян ЛеКан предложил использование сверточной нейронной сети для решения проблем распознавания изображений. Наконец, Иошуа Бенджио разработал каскадный автокодировщик, позволивший задействовать все слои в глубокой нейронной сети.

              Примеры успешного применения нейросетей в бизнесе



              Медицина


              Команда исследователей из Ноттингемского университета разработала четыре алгоритма машинного обучения для оценки степени риска сердечно-сосудистых заболеваний пациентов. Для обучения использовались данные 378 тыс. британских пациентов. Обученный искусственный интеллект определял риск кардиологических заболеваний эффективнее реальных врачей. Точность алгоритма — между 74 и 76,4 процентами (стандартная система из восьми факторов, разработанная Американской коллегией кардиологии, обеспечивает точность лишь в 72,8%).

              Финансы


              Японская страховая компания Fukoku Mutual Life Insurance заключила контракт с IBM. Согласно нему, 34 сотрудников японской компании заменит система IBM Watson Explorer AI. Нейросеть будет просматривать десятки тысяч медицинских сертификатов и учитывать число посещений госпиталей, перенесенные операции и другие факторы для определения условий страхования клиентов. В Fukoku Mutual Life Insurance уверены, что использование IBM Watson повысит продуктивность на 30% и окупится за два года.

              Машинное обучение помогает распознавать потенциальные случаи мошенничества в различных сферах жизни. Подобный инструмент использует, например, PayPal – в рамках борьбы с отмыванием денег компания сравнивает миллионы транзакций и обнаруживает среди них подозрительные. В результате, мошеннические транзакции в PayPal составляют рекордно низкие 0,32%, тогда как стандарт в финансовом секторе — 1,32%.

              Коммерция


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

              Механизм рекомендаций обеспечивает Amazon 35% продаж. Алгоритм Brain, используемый YouTube для рекомендации контента, позволил добиться того, что практически 70% видео, просматриваемых на сайте, люди нашли благодаря рекомендациям (а не по ссылкам или подпискам). WSJ сообщало о том, что использование искусственного интеллекта для рекомендаций является одним из факторов, повлиявших на 10-кратный рост аудитории за последние пять лет.

              Алгоритм Yandex Data Factory способен предсказывать влияние промоакций на объем продаж товаров. Анализируя историю продаж, а также тип и ассортимент магазина, алгоритм дал 87% точных (с точностью до коробки) и 61% ультраточных (с точностью до упаковки) прогнозов.

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

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

              Транспорт


              Беспилотные автомобили – концепт, над которым работает большинство крупных концернов, а также технологические компании (Google, Uber, Яндекс и другие) и стартапы, в своей работе опирается на нейросети. Искусственный интеллект отвечает за распознавание окружающих объектов – будь то другой автомобиль, пешеход или иное препятствие.


              Так видит наш мир нейросеть

              Потенциал искусственного интеллекта в этой сфере не ограничивается автопилотом. Недавний опрос IBM показал: 74% топ-менеджеров автомобильной индустрии ожидают, что умные автомобили появятся на дорогах уже к 2025 году. Такие автомобили, интегрированные в Интернет вещей (см. наш предыдущий лонгрид), будут собирать информацию о предпочтениях пассажиров и автоматически регулировать температуру в салоне, громкость радио, положение сидений и другие параметры. Помимо пилотирования, система также будет информировать о возникающих проблемах (и даже попытается решить их сама) и ситуации на дороге.

              Промышленность


              Нейросеть, разработанная Марком Уоллером из Шанхайского Университета, специализируется на разработке синтетических молекул. Алгоритм составил шестистадийный синтез производного бензопирана сульфонамида (необходим при лечении Альцгеймера) всего за 5,4 секунды.

              Инструменты Yandex Data Factory помогают при выплавке стали: использующийся для производства стали металлический лом зачастую неоднороден по составу. Чтобы сталь соответствовала стандартам, при ее выплавке всегда нужно учитывать специфику лома и вводить специальные добавки. Этим обычно занимаются специально обученные технологи. Но, поскольку на таких производствах собирается много информации о поступающем сырье, применяемых добавках и результате, эту информацию с большей эффективностью способна обработать нейросеть. По данным Яндекса, внедрение нейросетей позволяет на 5% сократить расходы дорогих ферросплавов.

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

              Сельское хозяйство


              Инженеры Microsoft совместно с учеными из ICRISAT применяют искусственный интеллект, чтобы определить оптимальное время посева в Индии. Приложение, использующее Microsoft Cortana Intelligence Suite, также следит за состоянием почвы и подбирает необходимые удобрения. Изначально в программе участвовало всего лишь 175 фермеров из 7 деревень. Они начали посев только после соответствующего SMS уведомления. В результате, они собрали урожая на 30-40% больше, чем обычно.

              Развлечения и искусство


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

              Яндекс успешно экспериментирует с музыкой: нейронные сети компании уже записали два альбома: в стиле Nirvana и “Гражданской обороны”. А музыка, написанная нейросетью под композитора-классика Александра Скрябина, была исполнена камерным оркестром, что заставляет вновь задуматься над вопросом о том, сможет ли робот сочинить симфонию. Нейросеть, созданная сотрудниками Sony, вдохновлялась Бахом.

              Японский алгоритм написал книгу “День, когда Компьютер написал роман”. Несмотря на то что с характерами героев и сюжетными линиями неопытному писателю помогали люди, компьютер проделал огромную работу – в итоге одна из его работ прошла отборочный этап престижной литературной премии. Нейросети также написали продолжения к Гарри Поттеру и Игре Престолов.

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

              Безопасность


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

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

              В 2014 году Лаборатория Касперского сообщала, что их антивирус регистрирует 325 тыс. новых зараженных файлов ежедневно. В то же время, исследование компании Deep Instinct показало, что новые версии вирусов практически не отличаются от предыдущих – изменение составляет от 2% до 10%. Самообучающаяся модель, разработанная Deep Instinct, на основании этой информации способна с высокой точностью определять зараженные файлы.

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

              Бонус: нейросети на страже нашего газона


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

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


              Изображение с камеры во дворе Бонда

              До начала работы нейросеть прошла обучение: Бонд “скормил” ей 300 разных фотографий кошек. Анализируя эти фотографии, нейросеть училась распознавать животных. Но этого оказалось недостаточно: она корректно определяла кошек лишь в 30% случаев и приняла за кошку тень Бонда, в результате чего он сам оказался мокрым.

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

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

              Заключение



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

              Однако не везде, куда приходит машинное обучение, оно вытесняет людей. Если нейросеть ставит диагнозы лучше живого врача, это не значит, что в будущем нас будут лечить исключительно роботы. Вероятнее, врач будет работать вместе с нейросетью. Аналогично, суперкомпьютер IBM Deep Blue выиграл в шахматы у Гарри Каспарова еще в 1997 году, однако люди из шахмат никуда не делись, а именитые гроссмейстеры до сих пор попадают на обложки глянцевых журналов.

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

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

              https://habrahabr.ru/post/337870/


              Метки:  

              [Из песочницы] Как написать хорошее решение для Highload Cup, но недостаточно хорошее чтобы выйти в топ

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

              Как написать хорошее решение для Highload Cup, но недостаточно хорошее чтобы выйти в топ

              На прошлой недели закончилось соревнование HighLoad Cup, идея которого заключалась в реализации HTTP сервера для сайта путешественников. О том как за 5 дней написать решение на Go, которое принесет 52 место в абсолютном зачете из 295, читайте под катом.


              Описание задачи


              Пользователь Afinogen в своей статье уже описывал условия конкурса, но для удобства я сжато повторюсь. Сервер должен реализовывать API для работы сайта путешественников и поддерживать сущности трех видов: путешественник (User), достопримечательность (Location) и посещение (Visit). API должно предоставлять возможность добавлять любые новые сущности в базу, получать их и обновлять, а также делать 2 операции над ними — получение средней оценки достопримечательности (avg) и получение мест, посещенных путешественником (visits). У каждой из этих операций так же есть набор фильтров, которые необходимо учитывать при формировании ответа. Так, например, API позволяет получить среднюю оценку оценку достопримечательности среди мужчин от 18 до 25 лет начиная с 1 апреля 2010 года. Это накладывает дополнительные сложности при реализации.


              На всякий случай приведу краткое формальное описание API:


              • GET // для получения данных о сущности
              • POST // для обновления
              • POST //new для создания
              • GET /users//visits для получения списка посещений пользователем
              • GET /locations//avg для получения средней оценки достопримечательности

              Как хранить данные


              Самый первый вопрос который возникает у всех кто ознакомился с условием задачи — как хранить данные. Многие (как например я) сначала пытались использовать какую-нибудь базу с расчетом на большое количество данных, которые не поместятся в память и не городить костыли. Однако этот подход не давал высокое место в рейтинге. Дело в том что организаторы конкурса очень демократично подошли к размеру данных, поэтому даже без каких либо оптимизаций структуры хранения все данные без труда помещались в памяти. Всего в рейтинговом обстреле было около 1 млн путешественников, 100 тысяч достопримечательностей и 10 миллионов посещений, идентификаторы каждой сущности шли по порядку от 1. На первый взгляд объем может показаться большим, но если посмотреть на размер структур, которые можно использовать для хранения данных, а так же на размер строк в структурах, то можно увидеть что в среднем размеры не слишком большие. Сами структуры и размеры их полей я привел ниже:


              type Visit struct {  // overall 40 bytes
                  Id        int    // 8 bytes
                  Location  int    // 8 bytes
                  User      int    // 8 bytes
                  VisitedAt int    // 8 bytes
                  Mark      int    // 8 bytes
              }
              
              type User struct {    //overall 133 bytes
                  Id        int       // 8 bytes
                  Email     string    // 22 bytes + 16 bytes
                  FirstName string    // 12 bytes + 16 bytes
                  LastName  string    // 18 bytes + 16 bytes
                  Gender    string    // 1 byte   + 16 bytes
                  Birthdate int       // 8 bytes
              }
              
              type Location struct { // overall 105 bytes
                  Id       int       // 8 bytes
                  Place    string    // 11 bytes + 16 bytes
                  Country  string    // 14 bytes + 16 bytes
                  City     string    // 16 bytes + 16 bytes
                  Distance int       // 8 bytes
              }

              Размеры string в структуре я указал в формате "средняя длинна строки" + "размер объекта string". Умножив средний размер каждой структуры на количество объектов получаем, что чисто для хранения данных нам нужно всего лишь примерно 518 МБ. Не там уж не много, при условии того что мы можем разгуляться аж на 4 ГБ.


              Самое большое потребление памяти, как это не было бы странно на первый взгляд, происходит не при самом обстреле, а на этапе загрузки данных. Дело в том, что изначально все данные запакованы в .zip архив и в первые 10 минут серверу необходимо загрузить эти данные из архива для дальнейшей работы с ними. Нераспакованный архив весит 200 МБ, + 1.5 ГБ весят файлы после распаковки. Без аккуратной работы с данными и без более агрессивной настройки сборщика мусора загрузить все данные не получалось.


              Второй момент, который был очень важен, но не все сразу его заметили — обстрелы сервера проходили так, что состояние гонки не могло получиться в принципе. Тестирование сервера проходило в 3 этапа: на первом этапе шли GET запросы, которые получали объекты и вызывали методы avg (получения средней оценки) и visits (получения посещений пользователем), вторым этапом данные обновлялись (на этом этапе были исключительно POST запросы на создание и обновление данных) и на последнем этапе опять шли GET запросы, только уже на новых данных и с большей нагрузкой. Из-за того что GET и POST запросы были жестко разделены, не было нужды использовать какие-либо примитивы синхронизации потоков.


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


              type Database struct {
                  usersArray     []*User
                  locationsArray []*Location
                  visitsArray    []*Visit
                  usersMap       map[int]*User
                  locationsMap   map[int]*Location
                  visitsMap      map[int]*Visit
              }

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


              Индексы


              Довольно скоро стало понятно, что для быстрой реализации методов avg и visits необходимо хранить не только сами структуры User и Location, но и id посещений пользователя и достопримечательностей вместе с самими структурами соответственно. В результате я добавил поле Visits, представляющее собой обычный массив в эти две структуры, и таким образом смог быстро находит все структуры Visit, ассоциированные с этим пользователем/достопримечательностью.


              В процессе тестирования я так же думал об использовании "container/list" из стандартной библиотеки, но знание устройства этого контейнера подсказывало мне что он всегда будет проигрывать и по скорости доступа к элементам, и по памяти. Его единственный плюс — возможность быстрого удаления/добавления в любую точку не сильно важен для этой задачи, так как соотношение количества посещений к пользователям примерно 10 к 1, то мы можем сделать предположение что контейнеры Visit в структурах Location и User будут примерно размером 10. А удалить элемент из начала массива размером 10 единиц не так уж и затратно на общем фоне и не является частой операцией. Что касается памяти, то ее потребление можно проиллюстрировать следующим кодом:


              package main
              
              import (
                  "fmt"
                  "runtime"
                  "runtime/debug"
                  "container/list"
              )
              
              func main() {
                  debug.SetGCPercent(-1)
                  runtime.GC()
                  m := &runtime.MemStats{}
                  runtime.ReadMemStats(m)
                  before := m.Alloc
              
                  for i:=0;i<1000;i++ {
                      s := make([]int, 0)
                      for j:=0;j<10;j++ {
                          s = append(s, 0)
                      }
                  }
                  runtime.ReadMemStats(m)
                  fmt.Printf("Alloced for slices %0.2f KB\n", float64(m.Alloc - before)/1024.0)
              
                  runtime.GC()
                  runtime.ReadMemStats(m)
                  before = m.Alloc
              
                  for i:=0;i<1000;i++ {
                      s := list.New()
                      for j:=0;j<10;j++ {
                          s.PushBack(1);
                      }
                  }
                  runtime.ReadMemStats(m)
                  fmt.Printf("Alloced for lists %0.2f KB\n", float64(m.Alloc - before)/1024.0)
              
              }

              Этот код дает следующий вывод:


              Alloced for slices 117.19 KB
              Alloced for lists 343.75 KB

              Этот код создает 1000 массивов и 1000 списков и заполняет их 10 элементами, так как это среднее число посещений. Число 10 является плохим для массива, так как при добавлении элементов, на 8 элементе он расширится до 16 элементов и тем самым памяти будет затрачено больше чем необходимо. По результатам все равно видно что на решение со слайсами было затрачено в 3 раза меньше памяти, что сходится с теорией, так как каждый элемент списка хранит указатель на следующий, предыдущий элемент и на сам список.


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


              Библиотеки


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


              Далее под замену ушла стандартная библиотека кодирования/декодирования json. Я выбрал easyjson, так как он показывал отличные данные по скорости/памяти + имел схожий с "encoding/json" API. Easyjson генерирует свой собственный парсер для каждой структуры данных, что и позволяет показывать такие впечатляющие результаты. Его единственный минус — небольшое число настроек. Например, в задаче были запросы, в которых одно из полей отсутствовало, что должно приводить в ошибке, однако easyjson тихо пропускал такие поля, из-за чего пришлось лезть в исходных код парсеров.


              Прочие оптимизации


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


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


              Результат


              За 5 последних дней конкурса я, без какого либо опыта участия в подобных конкурсах, написал решение на Go, которое принесло мне 52 место из 295 участников. К сожалению мне не хватило совсем чуть чуть до прохождения в финал, но с другой стороны в финале собрались достойные соперники, поэтому из-за того что данные и условия задачи никак не менялись то маловероятно что я смог бы подняться выше.


              GitHub с решением

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

              https://habrahabr.ru/post/337868/


              Метки:  

              Привет, Программист

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

              Привет, Программист

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



                За N-ые лета программирования на том и сём у автора (@ahriman) скопилась подборка соответствующих вышеуказанным темам ресурсов. Того, что может значительно упростить жизнь (или нет). Сегодня акцент ставим на Visual Studio и Visual Studio Code разных версий, а также на архитектуре. Приглашаем под кат, друзья. И не забудьте поделиться, кого вы читаете, что вы используете и какие фичи больше всего любите.

                Блоги, которые можно почитать


                Скотт Хансельман, Principal Program Manager в команде Visual Studio Tools . Один из самых известных авторов-программистов из Microsoft — Скотт Хансельман. Известный евангелист Open Source как вне, так и внутри компании (например, именно Скотт выступил за то, чтобы заопенсорсить Windows Live Writer, и в процессе принимал активное участие в рефакторинге). Скотт много кода пишет сам, и знает, что Тебе нужно.

                Хансельман пишет статьи, которые могут пригодиться как каждый день:

                -> Visual Studio's most useful (and underused) tips
                -> Exploring refit, an automatic type-safe REST library for .NET Standard
                -> A proper terminal for Visual Studio

                Так и что-то, что может пригодится когда-нибудь, но неизвестно когда, и это попадает в папку «Прочитать».
                T4MVC and R4MVC — Roslyn code generators for ASP.NET Core tag helpers



                Мадс Кристенсен — Senior Program Manager в соседней со Скоттом группе Visual Studio. Возможно, вы знакомы с Web Extension Pack, а ныне Web Essentials? Если вы веб-разработчик, то обязательно познакомьтесь. Если нет, то опыт Мадса в написании экстеншенов, о котором он иногда рассказывает в интервью и своем блоге, плюс разные типсы и триксы, будут однозначно полезны для общего развития.
                 
                 


                Phil Haack — программист-блогер с 13-летним стажем. Пишет в основном про веб.
                -> GitHub Beyond Your Browser
                 
                 
                 
                 
                 
                 


                Андрей Игнат, технический директор в Electronic Arts. Любитель формата небольших заметок и дайджестов, состоящих из сборной солянки.
                -> Пример дайджеста
                 
                 
                 
                 



                Андрей Веселов, Microsoft MVP из Сибири. Много лет ведёт блог, многие наверняка знакомы с его циклами статей. От взгляда Андрея обычно не уходят важные новости. Один из немногих блогеров, кто, спустя 37 страниц постов продолжает держать профессиональную марку. Также публикует дайджесты.
                -> Конфигурация ASP.NET Core приложения
                 
                 
                 


                Гуннар Пайпман, еще один MVP. Пишет про всё на свете в разработке (правда, фокусируется на ASP.NET, включая Core), любит фановые проекты.
                -> Beer IoT: Visualizing sensors data using Power BI
                 
                 
                 
                 
                 


                Курсы и обучающие материалы


                Channel 9 — флагманский канал доставки материалов Microsoft во внешний мир. Автор статьи после каждого большого мероприятия обязательно смотрит, нет ли в очередной раз видео про фичи в Visual Studio.
                -> Coding at 88MPH: Tips and tricks with Visual Studio 2017
                Обычно есть. Еще есть сериалы, один из самых занимательных — Visual Studio Toolbox. Говорят о новых фичах, иногда обсуждают архитектуру.
                -> Visual Studio Toolbox


                Microsoft Virtual Academy — флагманский канал доставки обучающих курсов Microsoft во внешний мир. Можно выбрать интересующие темы и составить план обучения по ним.
                -> Все курсы по Visual Studio
                 
                 
                 
                 

                P.s. Все, кто видел Сашу Белоцерковского, наверняка оценят картинку до ката. :)
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/337866/


                Метки:  

                [recovery mode] Как ускорить загрузку сайта

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

                Как ускорить загрузку сайта

                Николай Лавлинский, технический директор «Метод Лаб», специально для Нетологии рассказал о том, как можно ускорить сайт и ничего при этом не потерять. Статья участвует в конкурсе блога.

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



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

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

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

                Поэтому скоростью сайта нужно заниматься как с технической, так и с экономической точек зрения. В этой статье мы сконцентрируемся на технической стороне ускорения сайтов.

                Скорость сайта: основные компоненты


                Скорость сайта касается двух сторон: клиентской и серверной. На сегодняшний день каждая из этих частей равнозначна для конечного результата. Но каждая со своими особенностями.

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

                Полный процесс загрузки сайта (первое посещение) выглядит следующим образом:
                1. DNS-запрос по имени сайта.
                2. Подключение к серверу по IP (ТCP-подключение).
                3. Установление защищённого соединения при использовании HTTPS (TLS-подключение).
                4. Запрос HTML-страницы по URL и ожидание сервера. (HTTP-запрос)
                5. Загрузка HTML.
                6. Разбор HTML-документа на стороне браузера, построение очереди запросов в ресурсам документа.
                7. Загрузка и парсинг CSS-стилей.
                8. Загрузка и выполнение JS-кода.
                9. Начало рендеринга страницы, выполнение JS-кода.
                10. Загрузка веб-шрифтов.
                11. Загрузка изображений и других элементов.
                12. Окончание рендеринга страницы, выполнение отложенного JS-кода.

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

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

                Измерение скорости сайта


                Главный вопрос: что нужно измерять? Существует множество метрик по скорости сайтов, но основных не так много.

                Во-первых, это время до первого байта (TTFB — time to first byte) — это время от начала процесса загрузки до получения первой порции данных от сервера. Это основная метрика для серверной оптимизации.
                Во-вторых, это начало рендеринга страницы (start render, first paint). Метрика показывает время до окончания периода «белого экрана» в браузере, когда начинается отрисовка страницы.

                В-третьих, это загрузка основных элементов страницы (load time). Сюда входит загрузка и интерпретация всех ресурсов для работы со страницей, после этой отметки индикатор загрузки страницы перестаёт крутиться.

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

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

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

                Один из самых мощных инструментов — панель разработчика в браузере. Наиболее развитая функциональность у панели в Chrome. На вкладке Network можно получить метрики по времени загрузки всех элементов, включая сам HTML-документ. При наведении на элемент можно узнать, сколько времени потрачено на каждый этап получения ресурса. Для оценки полной картины процесса загрузки страницы можно воспользоваться вкладкой Performance, которая даёт полную детализацию вплоть до времени декодирования картинок.

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

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

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

                Серверная оптимизация


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

                Хостинг (серверные ресурсы)


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

                СУБД (сервер базы данных)


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

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

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

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

                Влияние CMS и программного кода


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

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

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

                Кэширование


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

                Оптимизация TCP, TLS, HTTP/2


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

                Тюнинг TCP сегодня требуется для больших проектов и серверов с подключением от 10G, основное, что нужно помнить: сетевая подсистема регулярно обновляется с выходом новых ядер Linux, поэтому стоит обновляться. Правильная настройка TLS (HTTPS) позволяет получить высокий уровень безопасности и максимально сократить время установления защищенного соединения. Хорошие рекомендации выпущены компанией Mozilla.

                Новая версия HTTP протокола — HTTP/2 призвана ускорить загрузку сайтов. Этот протокол появился недавно и сейчас активно используется (около 20% доли среди веб-сайтов). В общем, в HTTP/2 действительно заложены механизмы ускорения, основной — снижение влияния сетевых задержек на время загрузки страницы (request multiplexing). Но ускорение за счет HTTP/2 далеко не всегда успешно, поэтому не стоит уповать на этот протокол.

                Клиентская оптимизация


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

                Оптимизация критического пути: CSS, JS


                Критический путь рендеринга (critical rendering path) — набор ресурсов для начала отрисовки страницы в браузере. Как правило, в этот список входят сам HTML-документ, CSS-стили, веб-шрифты и JS-код.

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

                Основная техника в сокращении критического пути: убираем всё, что не нужно или можно отложить. Например, большинство JS-кода можно отложить до загрузки страницы. Для этого размещаем вызов JS-ресурса в конце HTML-документа или используем атрибут async.

                Для отложенной загрузки CSS можно воспользоваться динамическим подключением стилей через JS (дождавшись события domContentLoaded).

                Оптимизация веб-шрифтов


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

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

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

                Повлиять на быстрое отображение веб-шрифтов можно с помощью новых спецификаций link rel=«preload» и CSS-свойства font-display. Preload позволит как можно раньше указать браузеру о необходимости загрузки файла шрифта, а font-display даёт гибкие возможности по управлению поведением браузера в случае задержки файла (подождать, отрисовать запасной, не ждать шрифт более трех секунд)

                Оптимизация изображений


                Изображения составляют большинство веса современного сайта. Конечно, картинки это не такие критичные ресурсы для страницы, как CSS- и JS-код. Но для множества сайтов изображения составляют важную часть контента: вспомним любую карточку товара в интернет-магазине.

                Основная методика при оптимизации изображений: сокращение их размера. Для этого нужно использовать правильный формат и инструменты сжатия:
                • PNG для картинок с прозрачностью и текстом;
                • JPEG для фото и сложных изображений;
                • SVG для векторной графики.

                В дополнение к этим форматам сейчас разрабатываются новые: например, WebP от Google. Этот формат может покрыть область использования PNG и JPEG — поддерживает сжатие с потерями и без потерь, прозрачность и даже анимацию. Для его использования достаточно создать копии картинок в WebP и отдавать их браузерам, которые их поддерживают.

                Для PNG существует множество утилит по оптимизации, которые можно использовать для сокращения размера, например, OptiPNG, PNGout, ect и другие. Также внутреннюю оптимизацию сжатия данных можно проводить с помощью zopfliPNG. Основная идея такого софта в подборе оптимальных параметров компрессии, удалении лишних данных из файла. Здесь нужно быть осторожным: некоторые утилиты имеют режим с потерей качества, что может не подходить вам (если вы ожидаете на выходе точно такую же картинку).

                Оптимизация JPEG также разделяется на два типа: с потерями и без потерь. В целом можно порекомендовать пакет Mozilla JPEG, который специально разработан для лучшего сжатия в этом формате. Для оптимизации без потерь можно использовать jpegtran, с потерями — cjpeg.

                Кэширующие заголовки


                Это наиболее простая методика клиентской оптимизации. Её смысл в кэшировании браузером редкоизменяемых ресурсов: картинок, CSS и JS-файлов, шрифтов, иногда даже самого HTML-документа. В результате каждый ресурс запрашивается с сервера только один раз.

                Если вы используете Nginx, достаточно добавить директиву:

                add_header Cache-Control "max-age=31536000, immutable";

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

                Конечно, возникает вопрос: а что делать, если нам нужно изменить закэшированный ресурс? Ответ прост: изменить его адрес, URL. Например, можно добавить версию в имя файла. Для HTML-документов такой метод также применим, но, как правило, используется более короткий срок кэширования (например, одна минута или час).

                Сжатие данных


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

                Во-первых, степень сжатия регулируется и должна быть близкой к максимальной.
                Во-вторых, можно использовать статическое сжатие, то есть предварительно сжать файлы и положить на диск. Тогда веб-сервер будет искать сжатую версию и сразу её отдавать.В-третьих, можно использовать более эффективные алгоритмы сжатия: zopfli (совместим с gzip) и brotli (новый алгоритм сжатия). Brotli будет работать только с HTTPS. Так как эти алгоритмы (особенно zopfli) затратны при сжатии, обязательно используем их в статическом варианте.

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

                Использование CDN


                Применение CDN (content delivery network) для ускорения сайтов очень разрекламированная мера, имеющая много маркетинговой шелухи вокруг сути технологии.

                Теория: зачем


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

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

                Сегодня большинство CDN позиционируют себя как средство ускорения сайтов, в первую очередь за счет сокращения расстояния от контента до клиента (посетителя сайта).

                Возможные эффекты


                Как можно ускорить сайт с помощью CDN?

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

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

                Недостатки использования CDN


                Недостатки, как обычно, продолжение достоинств: объект может быть не в кэше узла CDN. Например, он ещё не запрашивался или его нельзя кэшировать (HTML-документ). В этом случае мы получаем дополнительные задержки между узлом CDN и нашим сервером.

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

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

                Закрепляем результат


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

                Поддержка ускорения


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

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

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

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

                Мониторинг реальной скорости у пользователей


                Синтетическое тестирование в идеальных лабораторных условиях очень полезно для оценки изменений в коде системы, но его недостаточно. В конце концов мы хотим, чтобы сайт работал быстро и реальных пользователей. Для сбора таких данных существует мониторинг скорости на стороне пользователей (RUM — real user monitoring).

                Чтобы организовать RUM, достаточно подключить одну из систем веб-аналитики (Яндекс.Метрика, Google Analytics) и посмотреть отчеты по времени загрузки сайта. Для более подробных и точных данных можно использовать специализированные сервисы мониторинга скорости.

                Выводы


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

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

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

                https://habrahabr.ru/post/337842/


                Финал Imagine Cup 2017 глазами команды МФТИ

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

                Финал Imagine Cup 2017 глазами команды МФТИ

                  Друзья! Лето прошло, но хорошие воспоминания от него остались. Одним из таких воспоминаний был международный финал Imagine Cup в Сиэтле, на который поехали сразу три команды из России. Мы предлагаем вашему вниманию статью Марии Сандриковой, участницы команды МФТИ, в которой она делится своими впечатлениями от поездки.



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

                  Несколько недель назад в главном офисе Microsoft в Сиэтле встретились 54 команды, чтобы побороться за главный приз Imagine Cup 2017. В том числе и три наши команды из России, собранные студентами МГУ, МФТИ и ВШЭ.

                  Мы, команда МФТИ, расскажем о нашем опыте участии в Imagine Cup. Надеемся, что у нас получится мотивировать других студентов принять участие в конкурсе в следующем году, потому что это действительно потрясающая возможность! :)

                  Долгая дорога в Сиэтл


                  У каждой команды своя история выхода в финал Imagine Cup. Так ребята из ВШЭ и МГУ стали победителями хакатонов в своих университетах с главными призом — путевкой в финал, а наша команда из МФТИ выиграла московский и российский отборочные этапы.


                  Слева направо команды МФТИ, МГУ и ВШЭ на российских финалах

                  Участники команды EverMind из МГУ познакомились прямо на хакатоне. Александр Сафонов (3 курс, Физфак) отвечал за маркетинг, а Роман Кривоногов (2 курс, ВМК) и Даниил Исхаков (2 курс, Мехмат) за 24 часа воплотили в жизнь прототип приложения для защиты дорог от пьяных водителей. Вдохновившись недавней интеграцией Microsoft Cognitive Services в приложение Uber для идентификации водителей с камеры телефона перед поездками, ребята решили внедрить несколько быстрых тестов, позволяющих по движениям глаз человека определить, следует ли его допускать к вождению.

                  Студенты 3 курса ФКН ВШЭ Артем Шафаростов, Илья Соловьев и Дарья Вальтер смогли обойти других участников хакатона, покорив членов жюри системой Boremeter для оценки внимательности аудитории во время презентации. Алгоритм определяет месторасположение каждого слушателя в зале и следит за направлением его взгляда и наклоном головы, чтобы измерить заинтересованность выступлением. Ребята придумали идею, работая над курсовым проектом и смогли успешно представить его на отборе.

                  Мы представляли проект MeetArticles, над которым работала большая команда из почти 20 студентов ФИВТ МФТИ в рамках учебного курса “Инновационный практикум”. Мы создали платформу для интерактивного и визуального поиска среди научных статей, позволяющую ускорить процесс поиска источников для исследований, определить актуальные тренды в науке и найти таланты по всему миру. Красивые и живые визуализации вместе с хорошо продуманной архитектурой решения позволили нам победить на московском и российском финалах соревнования. В конкурсе предусмотрены ограничения на размер команд, поэтому на российском и международных финалах мы представлял проект лишь втроем: Мария Сандрикова (5 курс), Андрей Саутин и Алексей Журавлев (4 курс). Учитывайте это, если решите принять участие в следующем году ;)

                  Выход в финал был лишь началом пути для наших команд. В течение трех месяцев все команды активно дорабатывали свои проекты и десятки раз репетировали свои презентации самостоятельно и вместе с представителями российского офиса Microsoft, Дмитрием Сошниковым и Анастасией Макеенок, за что мы им очень благодарны. И вот, в конце июля, спустя 20 часов перелета наши команды оказались в самом сердце Microsoft в Редмонде на финале, к которому так долго готовились.

                  Схема соревнования


                  Само соревнование проходило в два дня, и его схема чем-то напоминала чемпионат мира по футболу. Начиналось все с выставки, во время которой к каждой команде подходили несколько членов жюри и оценивали демонстрацию проектов с технической точки зрения. В следующий этап прошли 32 команды из 54, и внутри групп по 4 команды развернулась борьба за выход в полуфинал. Каждый этап оценивали независимые бригады жюри. У двух проектов, не прошедших в полуфинал напрямую, был шанс все-таки получить свои путевки, завоевав приз зрительских симпатий. В финале встретились 4 самые стойкие команды для борьбы за главный приз в 100 000$ и менторскую сессию с генеральным директором Microsoft Сатьей Наделла.

                  Выставка


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


                  Техническая выставка проектов

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

                  Wildcard round


                  Самый динамичный этап конкурса — это Pitch Battle. Он позволял попасть в полуфинал в обход борьбы в четвертьфинале. Каждой команде давалось лишь 2 минуты и микрофон, чтобы представить свой проект остальным участникам, которые потом сами выбирали победителя.

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


                  Pitch Battle, слева Рома из команды EverMind

                  Роман Кривоногов, участник команды МГУ EverMind:
                  Я знал текст, который следовало говорить, я долго и упорно репетировал, я подбадривал себя и всё равно ничего не мог с собой поделать: руки и ноги тряслись так, как будто вместо них у меня отбойные молотки. Я думал, что выроню микрофон, и молился, чтобы текст не вылетал из головы. Он, конечно же, вылетал.

                  Презентации


                  Полуфиналы и четвертьфиналы проходили в виде презентаций. Командам давалось по 10 минут на выступление: 5 минут на презентацию и демонстрацию и 5 минут на ответы на вопросы жюри.

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

                  • 50% — Технологии и реализация
                  • 20% — Инновационность
                  • 15% — Актуальность
                  • 15% — План выхода на рынок

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

                  Две наши команды участвовали в этих этапах: мы (МФТИ) в четвертьфинале и МГУ в полуфинале, но к сожалению, нашим командам не удалось пройти дальше.

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


                  Слева четыре команды-финалисты, справа победители, команда X.GLU из Чехии

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

                  Кроме соревнований


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

                  Андрей Саутин, участник команды МФТИ MeetArticles:
                  Соревнование в этом году проводилось в рекордно сжатые сроки (2 дня вместо 4 дней в прошлом году и недели в более ранние года). Тем не менее даже этого времени было достаточно, чтобы почувствовать, что ты приехал не просто на соревнование, а еще и в некое подобие летнего студенческого лагеря, лагеря амбициозных творческих ребят-сверстников-единомышленников. Общение с ними — это не только отличная практика английского и других иностранных языков, но и прекрасная возможность узнать много нового о других странах и культурах, весело провести время и, самое главное, найти друзей по всему миру.


                  Слева Сатья Наделла с участниками, справа вечеринка после соревнования

                  Многие участники благодаря конкурсу впервые побывали в Америке и продолжили свое путешествие по другим городам после конкурса. Это небольшое приключение стало отличным завершением нашего долгого пути к финалу Imagine Cup.


                  Российская команда Imagine Cup 2017

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

                  Мария Сандрикова, mashaka
                  участница команды MФТИ MeetArticles
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/337852/


                  Метки:  

                  Хакатон HackCV, 7-8 октября

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

                  Хакатон HackCV, 7-8 октября

                    За несколько лет Computer Vision стало трендом в C/C++ разработке благодаря востребованности в индустрии Automotive. Эта технология позволяет наделять компьютеры когнитивными способностями, так что автомобили будущего будут видеть, осязать, а следовательно, и взаимодействовать с окружающим миром подобно людям. На обучающем хакатоне HackCV эксперты Luxoft не только поделятся опытом в Computer Vision, но и научат вас практическим навыкам работы с этой технологией.

                    Сегодня Luxoft является мировым лидером по интеграции технологии CV в автомобилестроении. По дорогам мира уже колесят миллионы машин, на которых установлено разработанное в Luxoft ПО. В Петербурге сейчас мы работаем над созданием программного обеспечения для беспилотных автомобилей — Advanced Driver Assistance Systems (ADAS) – технологии помощи водителю, которая обеспечит небывалый уровень надежности и безопасности.

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

                    К участию приглашаются команды от 2 до 6 человек. Для успешного выполнения задания необходима экспертиза С++ и хорошая математическая подготовка, библиотеки компьютерного зрения (OpenCV, OpenVX etc). Опыт работы с CV приветствуется.

                    Мы хотим максимально приблизить участников хакатона к разработке safety critical embedded system, поэтому фрейворками TensorFlow, Caffe, Theano, которые по системным и архитектурным причинам не могут быть использованы в Automotive, пользоваться будет нельзя. Уровень хардкора будет стремиться к отметке “critical”.

                    На HackCV вы сможете:

                    • Узнать больше о технологии Computer Vision
                    • Познакомиться с экспертами и разработчиками в этой сфере
                    • Научиться работать с технологией Computer vision или повысить свой уровень экспертизы в этом направлении
                    • Послушать лекции по Computer Vision и применению нейросетей в CV
                    • Пообщаться с единомышленниками
                    • Приобрести уникальные знания и сразу же применить их на практике
                    • и многое другое!

                    7-8 октября в Санкт-Петербурге у вас есть реальная возможность попасть в общество экспертов по компьютерному зрению, embedded разработке и нейросетям для обмена опытом, идеями и мнениями.

                    Участие бесплатное

                    Узнать больше и зарегистрироваться для участия в хакатоне HackCV можно по ссылке career.luxoft.com/lp/hack-cv
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/337848/


                    Метки:  

                    Аудиоплеер с плейлистом на javascript

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

                    Аудиоплеер с плейлистом на javascript

                      Здравствуйте, уважаемые читатели. Сегодня хотелось бы рассказать Вам о том, как сделать простейший кастомный аудиоплеер с плейлистом. Будем делать его, используя HTML5 и Javascript. В результате, получим вот такой простенький плеер. По внешнему виду похожий на плеер vk.com)

                      Пример
                      Самый простой способ для воспроизведения аудиофайлов в браузере — использование тэга
                      :
                      Например:
                       
                       

                      Атрибут
                      controls
                      отображает стандартные элементы управления, такие как кнопка play/pause, mute.

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

                      Чтобы воспроизвести аудио, используя Javascript, достаточно лишь две строки кода:
                      let file = new Audio('track1.mp3');
                      file.play(); 

                      Тут создается объект Audio, им-то мы и будем оперировать. Вот краткий список общих методов и свойств:
                      .play()
                      запустить проигрывание аудиофайла;
                      .pause()
                      поставить на паузу;
                      .duration 
                      длина дорожки (в секундах). Duration становится доступен только после срабатывания события ‘loadedmetadata’;
                       currentTime
                      получить/установить момент проигрывания звуковой дорожки;

                      Полный список доступен тут.

                      Так как данная реализация всего-лишь фронтенд пример, то добавим аудио файлы в локальную папку files (для удобства и налгядности) и захардкодим их названия:
                      const FILES = [
                       'track1',
                       'track2',
                       'track3',
                       'track4' 
                      ]

                      В продакшене нельзя использовать такой подход по очевидным причинам.
                      Теперь создадим класс Player с такими методами:
                      init — инициализация плейлиста;
                      loadFile — загрузить дорожку, при запросе на запуск, только если она еще не было загружена.
                      play — запустить/поставить на паузу дорожку;
                      playNext — запустить следующую дорожку;
                      playPrev — запустить предыдущую дорожку;
                      setTitle — установить название файла в шапке плеера;
                      setProgress — установить процент на сколько заполнен прогресс-бар;
                      countProgress — посчитать в процентах количество проигранного времени;
                      runProgress — запустить отрисовку заполнения прогресс-бара;
                      stopProgress — сбросить процент заполненности прогресс-бара;
                      pickNewProgress — навигация по файлу с помощью клика по прогресс-бару;
                      toggleStyles — метод для изменения стилей кнопки play/pause и плейлиста;

                      Код плеера:
                       class Player {
                       constructor(files) {
                         this.current = null;
                         this.status = 'pause';
                         this.progress = 0;
                         this.progressTimeout = null;
                         this.files = FILES.map(name => {
                           return {
                             name: name
                           }
                         });
                       }
                       init() {
                         let playlist = getByQuery('.playlist');
                       
                         this.files.forEach((f, i) => {
                           let playlistFileContainer = createElem({
                             type: 'div',
                             appendTo: playlist,
                             textContent: f.name,
                             class: 'fileEntity',
                             handlers: {
                               click: this.play.bind(this, null, i)
                             }
                           });
                           createElem({
                             type: 'div',
                             appendTo: playlistFileContainer,
                             textContent: '--:--',
                             class: 'fileEntity_duration',
                           })
                         });
                       }
                       loadFile(i) {
                       
                         let f = this.files[i];
                         f.file = new Audio(prepareFilePath(f.name));
                       
                         f.file.addEventListener('loadedmetadata', () => {
                           getByQuery('.playlist').children[i].children[0].textContent = prettifyTime(f.file.duration);
                         });
                       
                         f.file.addEventListener('ended', this.playNext.bind(this, null, i));
                       }
                       
                       play(e, i = this.current || 0) {
                         if (!this.files[i].file) {
                           this.loadFile(i);
                         }
                       
                         let action = 'play';
                       
                         if (this.current == i) {
                           action = this.status === 'pause' ? 'play' : 'pause';
                           this.toggleStyles(action, i);
                         } else if (typeof this.current !== 'object') {
                           this.files[this.current].file.pause();
                           this.files[this.current].file.currentTime = 0;
                           this.toggleStyles(action, this.current, i);
                         } else {
                           this.toggleStyles(action, i);
                         }
                       
                         this.current = i;
                         this.status = action;
                         this.files[i].file[action]();
                       
                         if (action == 'play') {
                           this.setTitle(this.files[i].name);
                           this.stopProgress();
                           this.runProgress();
                         } else {
                           this.stopProgress();
                         }
                       }
                       
                       playNext(e, currentIndex) {
                         let nextIndex = (currentIndex ? currentIndex : this.current) + 1;
                       
                         if (!this.files[nextIndex]) {
                           nextIndex = 0;
                         }
                       
                         this.play(null, nextIndex);
                       }
                       
                       playPrev(e, currentIndex) {
                         let prevIndex = (currentIndex ? currentIndex : this.current) - 1;
                       
                         if (!this.files[prevIndex]) {
                           prevIndex = this.files.length - 1;
                         }
                       
                         this.play(null, prevIndex);
                       }
                       
                       setTitle(title) {
                         getByQuery('.progress_bar_title').textContent = title;
                       }
                       
                       setProgress(percent = 0, cb) {
                         getByQuery('.progress_bar_container_percentage').style.width = `${percent}%`;
                         cb && cb();
                       }
                       
                       countProgress() {
                         let file = this.files[this.current].file;
                       
                         return (file.currentTime * 100 / file.duration) || 0;
                       }
                       
                       runProgress(percent = 0) {
                         let percentage = percent || this.countProgress();
                         let cb = percent ? () => {
                           this.files[this.current].file.currentTime = percentage * this.files[this.current].file.duration / 100;
                         } : null;
                       
                         this.setProgress(percentage, cb);
                         this.progressTimeout = setTimeout(this.runProgress.bind(this), 1000)
                       }
                       
                       stopProgress() {
                         clearTimeout(this.progressTimeout);
                         this.progressTimeout = null;
                       }
                       
                       pickNewProgress(e) {
                         if (this.status != 'play') {
                           this.play();
                         }
                       
                         let coords = e.target.getBoundingClientRect().left;
                         let progressBar = getByQuery('.progress_bar_stripe');
                         let newPercent = (e.clientX - coords) / progressBar.offsetWidth * 100;
                       
                         this.stopProgress();
                         this.runProgress(newPercent);
                       }
                       
                       toggleStyles(action, prev, next) {
                         let prevNode = getByQuery('.playlist').children[prev];
                         let nextNode = getByQuery('.playlist').children[next];
                         let playPause = getByQuery('.play_pause .play_pause_icon');
                       
                         if (!next && next !== 0) {
                           if (!prevNode.classList.contains('fileEntity-active')) {
                             prevNode.classList.add('fileEntity-active');
                           }
                           playPause.classList.toggle('play_pause-play');
                           playPause.classList.toggle('play_pause-pause');
                         } else {
                           prevNode.classList.toggle('fileEntity-active');
                           nextNode.classList.toggle('fileEntity-active');
                         }
                       
                         if (playPause.classList.contains('play_pause-play') && action == 'play' && prev != next) {
                           playPause.classList.toggle('play_pause-play');
                           playPause.classList.toggle('play_pause-pause');
                         }
                       }
                      }
                      



                      Далее цепляемся на событие
                      DOMContentLoaded
                      инициализируем наш плеер и вешаем обработчики на элементы управления:

                      window.addEventListener('DOMContentLoaded', initHandlers);
                       
                      function initHandlers() {
                       let player = new Player(FILES);
                       player.init();
                       
                       getByQuery('.player .controls .play_pause').addEventListener('click', player.play.bind(player));
                       getByQuery('.player .controls .navigation_prev').addEventListener('click', player.playPrev.bind(player));
                       getByQuery('.player .controls .navigation_next').addEventListener('click', player.playNext.bind(player));
                       getByQuery('.player .controls .progress_bar_stripe').addEventListener('click', player.pickNewProgress.bind(player));
                      }
                      

                      Функция
                      getByQuery()
                      сокращенный вариант
                      document.querySelector()
                      :
                      А вот она в коде:
                      function getByQuery(elem) {
                       return typeof elem === 'string' ? document.querySelector(elem) : elem;
                      }

                      Помимо этого было использовано еще несколько кастомных функций, код которых можно найти в репозитории.
                      Логика работы плеера очень простая. Мы читаем массив файлов и записываем его в
                      this
                      . Кликнув по дорожке, в плейлисте вызывается метод
                      play
                      . Ему мы передаем индекс файла в массиве. Он подгружает дорожку, используя метод
                      loadFile
                      Только если дорожка еще не была загружена. Затем метод запускает ее проигрывание. Не забываем и за прогресс-бар. В контексте плеера мы также храним статус (play/pause), индекс текущего файла и переменную с таймаутом. Таймаут мы используем, чтоб раз в секунду (при условии проигрывания файла) мы могли перерисовывать прогресс-бар. Ссылка на демо.

                      В следующей статье разберем более сложные способы реализации аудиоплеера.
                      Спасибо за внимание.

                      Над статьей работали varog-norman и greebn9k
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/337846/


                      Метки:  

                      Сеть магазинов «М.Видео» проведёт хакатон по искусственному интеллекту

                      Среда, 13 Сентября 2017 г. 14:42 + в цитатник

                      Метки:  

                      Positive Technologies на GitHub

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

                      Positive Technologies на GitHub

                        Поздравляю программистов с их профессиональным днем! В связи с этим праздником наша компания Positive Technologies решила рассказать о своей деятельности, напрямую связанной с разработкой, а именно с открытым исходным кодом и GitHub.


                        Positive Technologies  GitHub


                        В последнее время все больше и больше компаний, таких как Google, Microsoft, Facebook, JetBrains, выкладывают в открытый доступ исходный код как небольших, так и крупных проектов. Positive Technologies славится не только высококлассными специалистами по информационной безопасности, но и большим количеством профессиональных разработчиков. Это позволяет ей также вносить свой посильный вклад в развитие движения Open Source.


                        У PT есть следующие GitHub-организации, поддерживающие открытые проекты компании:



                        Мы подробно описали первую организацию с ее проектами и кратко — все остальные.


                        Содержание



                        Организации


                        Positive Technologies


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


                        Open DevOps Community


                        Open DevOps Community

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


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


                        Активные проекты:


                        1. crosspm — универсальный пакетный менеджер, который позволяет скачивать пакеты для сборок многокомпонентных продуктов, используя правила, заданные в манифесте.
                        2. vspheretools — инструмент, который позволяет управлять виртуальными машинами на vSphere прямо из консоли. Также есть возможность подключать его как API-библиотеку в своих Python-скриптах.
                        3. YouTrack Python 3 Client Library — Python-клиент для работы с API YouTrack.
                        4. TFS API Python client — Python-клиент для работы с API Team Foundation Server от Microsoft.
                        5. A Python client for Artifactory — Python-клиент для работы с API хранилища бинарных данных Artifactory.
                        6. FuzzyClassificator — универсальный нейронечёткий классификатор произвольных объектов, свойства которых могут быть оценены на нечёткой измерительной шкале.

                        Каждый инструмент имеет автоматическую сборку в Travis CI с выкладкой в PyPI-репозиторий, где их можно найти и установить через стандартный pip install.


                        Готовятся к публикации еще несколько инструментов:


                        1. CrossBuilder — система организации кросс-платформенных сборок build as a code, а-ля Travis CI, но независящая от используемой CI-системы (TeamCity, Jenkins, GitLab-CI и т. п.).
                        2. ChangelogBuilder — генератор релиз-нотов с описанием изменений по продукту, который получает и агрегирует данные из различных трекеров (TFS, YouTrack, GitLab и т. п.).
                        3. polyglot.sketchplugin — плагин для системы Sketch, которым пользуются дизайнеры для упрощения работы с мультиязычной вёрсткой.

                        В качестве контрибьюторов любого инструмента приглашаются все желающие. У нас есть типовой проект ExampleProject, в котором содержатся общая структура и подробная инструкция по созданию собственного проекта в сообществе. Фактически достаточно его скопировать и сделать свой проект по аналогии. Если у вас есть идеи или инструменты для автоматизации чего-либо, давайте делиться ими с сообществом под MIT-лицензией! Это модно, почётно, престижно :)


                        Positive Research


                        Группа исследователей, содержащая репозиторий AttackDetection, в который команда обнаружения атак выкладывает правила для определения эксплуатации уязвимостей с помощью систем обнаружения вторжений Snort и Suricata IDS. Основная цель проекта — создание правил для уязвимостей, имеющих широкое распространение и высокий уровень опасности (high impact). Репозиторий содержит файлы для интеграции с oinkmaster — скриптом для обновления и развертывания правил в указанных IDS. А для теста самих правил прилагаются pcap-файлы с трафиком. Стоит отметить, что репозиторий уже набрал свыше 100 добавлений в избранное, а за год добавилось около 40 новых уязвимостей, среди которых BadTunnel, ETERNALBLUE, ImageTragick, EPICBANANA, SambaCry. Все анонсы о новых угрозах публикуются в Twitter.


                        Positive JS


                        Сообщество по разработке инструментария (преимущественно веб), используемого в продуктах PT.


                        Проекты


                        PT.PM


                        PT.PM Logo

                        PT Pattern Matching Engine — универсальный сигнатурный анализатор кода, который принимает на вход пользовательские шаблоны, описанные на специальном языке. Данный движок испольуется в бесплатном инструменте для проверки веб-приложений на наличие уязвимых компонентов Approof, а также в анализаторе исходного кода PT Application Inspector.



                        Процесс анализа состоит из нескольких этапов:


                        1. Парсинг исходного кода в дерево разбора.
                        2. Преобразование дерева в унифицированный формат.
                        3. Сопоставление дерева с пользовательскими шаблонами.

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


                        В PT.PM внедрена непрерывная интеграция, поддерживаются сборка и тестирование модулей проекта как под Windows, так и под Linux (Mono). Процесс разработки организуется с помощью размеченных метками задач (Issues) и пул-реквестов. Наряду с разработкой ведется документация проекта, а результаты всех значимых сборок публикуются в формате как пакетов NuGet, так и «сырых» артефактов. Организацию PT.PM, вероятно, можно считать образцовой, к которой хотелось бы стремиться во всех остальных проектах.


                        Для первого этапа, а именно парсинга исходного кода, используются парсеры на базе ANTLR. Этот инструмент генерирует их для различных языков (рантаймов) на основе формальных грамматик, для которых существует репозиторий. Наша компания его активно развивает. В настоящее время поддерживается генерация под Java, C#, Python 2 и 3, JavaScript, C++, Go и Swift, причём поддержка последних трех была добавлена совсем недавно.


                        Стоит отметить, что ANTLR используется не только в проектах PT направления Application Security, но и в Max Patrol SIEM: там он используется для обработки собственного языка DSL (Domain Specific Language), который применяется для описания динамических групп активов. Обмен опытом в этой сфере позволил не тратить время на задачи, которые уже были решены ранее.


                        Грамматики ANTLR


                        При участии Positive Technologies были разработаны и улучшены грамматики для языков PL/SQL, T-SQL, MySQL, PHP, Java 8 и C#.


                        PL/SQL


                        Грамматики SQL имеют обширный синтаксис с большим количеством ключевых слов. К счастью, грамматика PL/SQL существовала под ANTLR 3 и портировать её под ANTLR 4 было не очень сложно.


                        T-SQL


                        Для T-SQL не было найдено достойных парсеров, не говоря уже об открытых, и мы долго и кропотливо восстанавливали грамматику из документации MSDN. Однако результат получился достойным: она уже охватывает много распространённых синтаксических конструкций, опрятно выглядит, независима от рантайма и покрыта тестами (примерами SQL-запросов из той же MSDN). С 2015 в нее внесли свой вклад более 15 сторонних пользователей. Более того, эта грамматика сейчас уже используется и в DBFW, прототипе межсетевого экрана уровня систем управления базами данных, подпроекте PT Application Firewall. Денис Колегов с Арсением Реутовым рассказывали о нем на PHDays VII: «Как разработать DBFW с нуля».


                        MySQL


                        Грамматика, разработанная вышеупомянутой командой, в первую очередь Иваном Худяшовым и Денисом Колеговым, на основе T-SQL. Она также используется в DBFW.


                        PHP


                        Данная грамматика транслировалась из грамматики Bison в ANTLR. Она интересна тем, что поддерживает парсинг сразу PHP, JavaScript и HTML. Точнее, участки кода JavaScript и HTML парсятся в текст, который позже обрабатывается парсерами конкретно под эти языки.


                        Java8


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


                        C#


                        Это по большей части экспериментальная грамматика, созданная для сравнения скоростей парсеров на основе ANTLR и парсера Roslyn.


                        Разработка и перспективы


                        ANTLR Logo

                        О деталях разработки грамматик можно почитать в нашей прошлогодней статье «Теория и практика парсинга исходников с помощью ANTLR и Roslyn».


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


                        PT.SourceStats


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


                        AspxParser


                        В рамках данного проекта разрабатывается парсер страниц ASPX, который используется не только в открытом движке PT.PM, но и во внутреннем анализаторе .NET-приложений (AI.Net), основанном на абстрактной интерпретации кода.


                        FP Community Rules


                        Approof Logo

                        В репозитории идет разработка наборов правил в формате YARA, которые используются в модуле сигнатурного анализа проектов в Approof. В августе прошлого года в рамках PDUG (юзер-группы по безопасной разработке) Алексей Гончаров делал доклад о модуле FingerPrint, используемом в PT AI и Approof.


                        Движок FingerPrint запускается на наборе исходных кодов сайта (бэкенда, фронтенда) и в соответствии с описанными правилами YARA ищет известные версии сторонних компонентов (например, библиотеку bla-bla версии 3). Правила составляются так, что содержат сигнатуры уязвимых версии библиотек с текстовым описанием проблемы.


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


                        Подробнее об этом можно почитать в статье Дениса Ефремова (ИСП РАН) «Разработка правил для Approof». Также см. его доклад «Автоматизация построения правил для Approof» на PDUG секции PHDays.


                        Учебно-демонстрационные проекты


                        На PHDays VII в рамках PDUG прошел мастер-класс «Appsec Outback». Для него были разработаны учебно-демонстрационные версии статического анализатора кода Mantaray и межсетевого экрана Schockfish. Данные проекты имеют все основные механизмы, которые используются в реальных средствах защиты. Но, в отличие от последних, их основная цель продемонстрировать алгоритмы и методы защиты, помочь понять процесс анализа и защиты приложений, а также проиллюстрировать фундаментальные теоретические возможности и ограничения технологий.


                        Также в репозитории имеются примеры реализации механизмов защиты:


                        • DOMSanitizer — модуль для обнаружения XSS-атак на стороне веб-браузера.
                        • DOMParanoid — модуль (security linter) для проверки безопасности HTML.

                        Лицензия


                        В наших проектах используются как разрешительные лицензии (MIT, Apache), так и собственная, которая подразумевает бесплатное использование исключительно в некоммерческих целях.


                        Заключение


                        Процесс переезда на GitHub оказался полезным и дал нам опыт в различных областях — в настройке DevOps под Windows и Linux, написании документации, в разработке.


                        Positive Technologies развивает Open Source проекты и планирует расширять эту активность.


                        При конвертации Markdown из формата GitHub в формат Habrahabr использовался HabraMark.

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

                        https://habrahabr.ru/post/327957/


                        Метки:  

                        Поиск сообщений в rss_rss_hh_new
                        Страницы: 1437 ... 1142 1141 [1140] 1139 1138 ..
                        .. 1 Календарь