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

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

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

Всё, что вам нужно знать про Windows Server 2016

Четверг, 22 Июня 2017 г. 10:56 + в цитатник
Всем, привет! У нас накопилось много русскоязычных материалов о Windows Server 2016, которыми хотелось бы с вами поделиться. К тому же, в начале месяца вышла русскоязычная версия книги «Введение в Windows Server 2016». Об этом, а также о других интересных статьях и видео по серверной тематике вы узнаете ниже.



Бесплатная электронная книга «Введение в Windows Server 2016» (pdf)


На русском языке литературы по Windows Server 2016 совсем немного, поэтому выпуск этого перевода пришёлся как нельзя кстати.

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

Предполагается, что читатель обладает базовыми знаниями по Hyper-V, сетям, системам хранения данных, а также по Microsoft Azure.

Скачать можно здесь.

Обзорные видео


Мы периодически проводим встречи для ИТ-специалистов в Москве и Питере, в рамках которых обсуждаем новые продукты, работу с Azure и многое другое. Часть выступлений записывается, а видео выкладывается на Channel 9. Ниже вы найдёте три последних записи по теме Windows Server 2016.
Windows Server 2016: эволюция или революция?



Защита привилегированных учетных записей в Windows Server 2016



Какие технологии Microsoft Azure реализованы в Windows Server 2016



Полезные статьи на Habrahabr


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

  1. Windows Azure Pack. Создание Shielded VM
  2. Настройка программного балансировщика нагрузки программно-определяемой сети в инфраструктуре VMM
  3. Настройка сетевого контроллера программно-определяемой сети в инфраструктуре VMM
  4. Настройка RAS-шлюза программно-конфигурируемой сети в фабрике VMM
  5. Work Folders в Windows Server 2016
  6. Программно-конфигурируемая сеть (SDN) в Windows Server 2016
  7. Развертывание Nano Server c помощью Windows Assessment and Deployment Kit (ADK) RC for Windows 10
  8. Новые возможности сервера DNS в Windows Server
  9. Репликация на уровне хранилища в Windows Server 2016 — Storage Replica
  10. Вложенная виртуализация Hyper-V в Windows Server 2016
  11. ASP.NET Core на Nano Server
  12. Что нового в Windows Server 2016
  13. Хранилище Storage Spaces Direct в Windows Server 2016
  14. Защищенные виртуальные машины в Windows Server 2016
  15. Настройка инфраструктуры SDN в фабрике VMM
  16. RDS в Windows Server 2016
  17. Контейнеры в Windows Server 2016
  18. Руководство по аварийному восстановлению для System Center 2016 — Service Manager
  19. Повышение безопасности Hyper-V 2016 с помощью решений 5nine
  20. Network Controller: программно-определяемые сети в Windows Server 2016. Часть 1: возможности и службы
  21. Облако на Microsoft Hyper-V, часть 3: хранилище Storage Spaces
  22. Windows Server 2016 и службы интеграции Hyper-V
  23. Что нового в Windows Server 2016 Failover Clustering
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330474/


Метки:  

Короткий чеклист по созданию миров

Четверг, 22 Июня 2017 г. 10:51 + в цитатник


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

Направление развития


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

  • Технология (механизмы)
  • Биология
  • Магия
  • Псионика

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

Уровень развития


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

Технология

  • Сплавы
  • Порох
  • Печатный станок
  • Пар
  • Связь (радио)
  • Доступная энергия
  • Перемещение в пространстве
  • Искусственный интеллект
  • Перемещение во времени

Биология

  • Клонирование
  • Управляемые мутации
  • Перенос сознания
  • Слияние сознаний (человек/человек, человек/не человек)
  • Создание видов
  • Коллективный разум (живая планета)

Магия*

  • Свет
  • Алхимия
  • Перемещение в пространстве
  • Перемещение во времени
  • Связь

Псионика**

  • Перемещение во времени
  • Перемещение в пространстве
  • Коллективный разум
  • Трансформация материалов

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


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


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

Возраст цивилизации


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


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


Государственный строй


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

  • Рабство
  • Тирания
  • Монархия
  • Теократия
  • Корпорации
  • Коммунизм
  • Демократия

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

Особенности


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

  • Боги. Играют активную жизнь в мире, их присутствие очевидно.
  • Выход в космос. Цивилизация тем или иным путем вышла в космос. Возможны контакты с другими расами.
  • Мультивселенная. Цивилизация имеет свободный/полусвободный доступ к другим, альтернативным реальностям.
  • Outsiders/Мистика. Существование так называемых малых богов (демоны, домовые, элементалы, и прочее прочее прочее) очевидно.
  • Нарушение базовых законов. Pi = 3.41, G= 5.5, Закон сохранения энергии оказался шуткой… Но помните, что изменение базовых законов требует очень тщательного обдумывания и реализации.
  • Апокалипсис. Комета, вирус, повышение магического фона, снос злыми вогонами.
  • Биологическое бессмертие. Продолжительность жизни не ограничена.
  • Ваша фантазия.

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

Конфликт


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


История и фольклор


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


И последнее


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


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

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

А здесь можно забрать чеклист в эксель формате.
Надеюсь это было/будет для кого-то полезно.
Со всем уважением,

Странное послесловие
Знаете, меня иногда посещает мысль о том, что все эти генераторы миров, чеклисты, гайды, мануалы и прочее приводят к появлению таких игр как X-Com или Doom3 — все по гайдам, все правильно, но… без души. В них нет эмоций, нет настоящего азарта, не сопереживания. Прав ли я? Не знаю...
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331218/


Метки:  

DevOops 2017 Piter: Новая конференция от JUG.ru Group, поговорим про DevOps

Четверг, 22 Июня 2017 г. 10:40 + в цитатник
Известный факт: мы в JUG.ru Group не делаем конференции просто так, обычно за идеей каждого нового проекта лежит какая-то проблема. Такая нашлась и у нас.

Когда мы были молоды и веселы и использовали генераторы статичных сайтов на Node.js (по секрету скажу, что мы продолжаем их использовать), с нами приключилась вот такая история. Мы только переехали на AWS и взяли самый простой EC2-инстанс, наивно полагая, что 10 Gb пространства на десяток статичных сайтов нам хватит. Однако, в один прекрасный день мы начали ловить ошибки от сервера о том, что место на диске… кончилось. 10 сайтов на 10 Gb пространства. Конечно, мы не поверили вражьим сообщениям и достаточно быстро установили, что на самом деле кончились inode.

Беглый поиск выявил мерзкого виновника — это был JavaScript Node.js, а именно папка node_modules. Посчитали inode, и поняли, что их там добрая сотня тысяч. Оокей, подумали мы и прикрутили еще 100 гигов. И сейчас все хорошо: 630k inode занято, зато есть еще 6kk сверху под зависимости Node.js. Надеюсь, нам хватит этого на ближайшие полгода… А к тому времени, когда они начнут заканчиваться, на новой конференции мы узнаем, как элегантно решить эту проблему.

А если серьезно, то 20 октября мы проведем DevOps-конференцию DevOops 2017 Piter. Один день, три трека, все как вы любите. Кто будет выступать, что будем обсуждать и другие подробности — под катом.



Кратко о главном



Конференция будет посвящена исключительно техническим вопросам и традиционно хардкорна. Никаких методик управления, тимбилдигов и софт скиллз. Говорить будем про автоматизацию разработки (Jenkins, TeamCity, Bamboo), мониторинг и отладку приложений (New Relic, BPF, Dynatrace, XRebel, Glimpse и другие), облачные технологии (AWS, Azure, Heroku и другие), админский хардкор (контейнеры, виртуализация, оркестрация, конфигурирование).

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

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

Спикеры


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

Барух jbaruch Садогурский — один из наиболее заметных DevOps-инженеров, говорящих по-русски. Отличный спикер, developer advocate из JFrog, постоянный закадыка подкаста «Разбор Полетов».у него даже твиттер верифицирован!. Иногда косит под Джависта, чтобы попасть на Joker и JPoint, и, следует заметить, делает это очень хорошо! Один из главных организаторов swampUP, крутой DevOps-конференции, проходящей в Долине.




Леонид Игольник — опытный спикер, разработчик из CA Technologies с двадцатилетним бэкграундом, венчурный инвестор. Чтобы понять, насколько Леонид крут, достаточно просто послушать 133 выпуск «Разбора Полетов».





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





Сергей bsideup Егоров – ведущий DevOps-подкаста 2d1o, хардкорщик, каких поискать, и, кстати, первый человек, который смог внятно мне объяснить, что такое DevOps.







Николай Рыжиков – Технический лидер команды «Health Samurai», которая успешно создает медицинскую систему нового поколения для автоматизации деятельности врачей и другого медицинского персонала в США. Активист питерских Ruby & Clojure сообществ и мета-сообщества «PiterUnited». Огненно выступал на Joker и HolyJS. Гуру и человек-оркестр, идеально для DevOps!




Paul Stack – Разработчик из HashiCorp (разработчики Vagrant, Vault, Consul, Terraform, Otto) поделится адским хардкором про разработку инструментов для DevOps-инженеров.







Erno Aapa – девопсер уже 6 лет, активный спикер и независимый консультант, основатель Финского DevOps-коммьюнити.








Прием докладов открыт




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

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

Главное требование: ваш доклад должен быть полезен другим разработчикам. Мы заинтересованы в докладах по следующим темам:
  • Контейнеры, Оркестрация (Docker, Kubernetes, Clusters, etc).
  • Виртуализация, Облачные технологии (AWS, Azure, Heroku и другие).
  • Мониторинг и аудит приложений (Prometeus, OkMeter, DataDog, BPF, Dynatrace, XRebel, Glimpse, Zipkin, OpenTrace и другие).
  • Continuous Delivery (Jenkins, TeamCity, Bamboo).
  • Configuration Management (puppet, chef, ansible).
  • Безопасность (Vault, etc.)
  • Разбор полетов на примерах крупных проектов, внедряющих DevOps: успешных и провальных.


Программный комитет


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

Дискуссионные зоны




Как и на любой нашей конференций, на DevOops будут дискуссионные зоны. Наверняка, вам знакомо чувство, когда вы поднимаете руку, чтобы задать вопрос, а ведущий вдруг объявляет: «Осталось время для одного вопроса», – и конечно, выбор падает не на вас, а в перерыве спикер скрывается за дверьми спикерской комнаты.

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

Регистрация


Программа конференции будет постепенно пополняться, и следить за её самым актуальным состоянием можно на сайте DevOops 2017 Piter. А уже сейчас на этом сайте открыта продажа билетов — до конца июня действует early bird цена. Поэтому за развитием программы лучше следить с билетом в кармане:)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331346/


Метки:  

[Перевод] Как видео может изменить вашу стратегию контент-маркетинга

Четверг, 22 Июня 2017 г. 10:28 + в цитатник

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

Переведено в Alconost

Видео захватывает все большие просторы: сегодня это и просмотр новостей, и общение с друзьями. Чтобы понять, что видео в интернете обосновалось серьезно, достаточно взглянуть на то, как изменилась за последние годы новостная лента сети Facebook. Цифры говорят сами за себя: 1,5 миллиона американцев смотрят видео в интернете, причем средний пользователь за месяц просматривает не менее 16 минут онлайн-видеорекламы. И блогеры, и бизнесмены должны понимать, что сегодня без использования видео в стратегии контент-маркетинга — никуда.

Очевидно, что видео сейчас на пике своей популярности — достаточно полистать ленту любой социальной сети. Взять хотя бы YouTube, где более миллиарда пользователей, или, к примеру, Facebook, где новостная лента была переориентирована на видеоконтент: сеть продвигает свои собственные видеофункции, в том числе Facebook Live и выбор целевой аудитории, и теперь ее алгоритмы предпочтут скорее одноминутное видео, чем статью на 500 слов. Instagram тоже не отстает: недавно было объявлено, что длительность видео в приложении увеличивается до одной минуты.

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

Увеличение трафика


Видео, попросту говоря, увеличивает приходящий на сайт трафик. Отношение количества кликов к числу просмотров электронного письма увеличивается на 200–300%, если в письме есть видео. Также показано, что если на странице есть видео, то обычный трафик от поисковых систем увеличивается на 157%. Неважно, что вы продвигаете — личный блог или собственный бренд, — видео может дать сайту в три раза больше посетителей.

Отличный способ представить свой бренд


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

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

Мотивация


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

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

Запоминаемость


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

Примечание переводчика: мы в Alconost как-то даже сделали ролик на эту тему:





Привлечение внимания


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

Видеороликами легко поделиться


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

Видео продолжает набирать популярность


Видеоконтент какое-то время уже присутствовал в медиапространстве, но сейчас он становится всё интереснее и привлекательнее, поэтому ясно, что в ближайшее время мы от видео никуда не денемся. Согласно прогнозам, к 2019 году 80% всего интернет-трафика будет составлять потоковое видео.

Резюме


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


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией приложений, игр и сайтов на 68 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов, перевод технических текстов.

Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее: https://alconost.com

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

https://habrahabr.ru/post/331386/


[Перевод] 10 базовых принципов визуального дизайна

Четверг, 22 Июня 2017 г. 10:15 + в цитатник
Вчера я слушал подкаст и обратил внимание, как кто-то задавал вопрос и по ходу дела сказал: «Старый фанат, впервые звоню». По какой-то причине это заставило меня подумать о Medium. Я читаю тут статьи давным-давно, но никогда не вставлял свои два цента. Сегодня тот день, когда это изменится.

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

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

Итак, готовы? Всё начинается с…

#1 Точка, линия и форма


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

В геометрии точка — это комбинация координат x и y, добавьте ось z — и вы в трёхмерном пространстве, но ограничимся двумя измерениями в этой статье.


Точка > линия > форма

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

Но для ваших глаз эти формы не существуют, на самом деле, пока не добавите к ним кое-что…

#2 Цвет



Видимый цветовой спектр

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

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

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

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

Теперь, когда вы можете увидеть свой треугольник, как насчёт сделать его более интересным…

#3 Типографика



От треугольника к букве А

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

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

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

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

#4 Пространство


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

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


Настройка негативного пространства между символами (он же кернинг)

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

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

Если научитесь находить правильное соотношение между позитивным и негативным пространством, то сможете создавать…

#5 Баланс, ритм и контраст


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


Настройка визуального веса слов для создания ритма и контраста

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

Кое-что может помочь вашему ритму и балансу, и с этим тоже можно поиграться…

#6 Масштаб



Делаем следующий шаг, настраивая масштаб слов

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

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

Например, взять газетную страницу. Что самое большое на странице?

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

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

#7 Сетка и выравнивания


Это как то странное удовлетворение, когда вы играете в тетрис и складываете последнюю линию, которая исчезает с экрана.


Создание определённой связи между элементами, чтобы они выглядели более сбалансированно и приятно

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

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

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

#8 Фрейминг


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

Где бы вы ни использовали картинку, иллюстрацию или что-то ещё, создайте правильный фрейминг — и увидите разницу.


Рефрейминг композиции, чтобы добавить интерес и дополнительный элемент

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

После всего этого, если вам кажется, что нечто интересное пропущено, то можете поиграться с…

#9 Текстуры и паттерны



Тестируем текстуру с шумом

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

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

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

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

Последнее, но не менее важное, и в реальности что я считаю чашей святого Грааля в визуальном дизайне, это…

#10 Визуальная концепция


Это идея за вашим дизайном. Что вы имеете в виду и каков скрытый смысл за этим поверхностным изображением.


Лампа идей… клише, я знаю :)

Это то, что отличает великолепный дизайн от чего-то, что вы можете скачать из стока.

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

Если ваша концепция сильна, то вы сможете защитить её и продать идею клиенту/боссу или кому вы её будете показывать.

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

Вот теперь у вас есть они, «мои» 10 принципов для создания хорошего дизайна. Даже хотя я считаю #10 самым важным, вам следует уделить внимание всем остальным принципам и убедиться, что вы достигли совершенства в своём искусстве. У вас может быть хорошая идея, но я думаю, что вы также должны знать, как её реализовать (или знать того, кто может это сделать вместо вас).

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

Ладно! Это всё.

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

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

Не стесняйтесь оставлять свои отзывы, я всегда открыт для здоровой дискуссии.

Спасибо за чтение!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331398/


Метки:  

[Перевод] Реализация алгоритма A*

Четверг, 22 Июня 2017 г. 10:00 + в цитатник

Метки:  

[Перевод] Волшебное введение в алгоритмы классификации

Четверг, 22 Июня 2017 г. 09:41 + в цитатник
Перевод статьи Брайна Беренда.

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

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



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




Всё верно! Сегодня мы поговорим о Распределяющей шляпе (Sorting Hat) из мира Гарри Поттера. Возьмём какие-то данные из сети, проанализируем и создадим классификатор, который будет сортировать персонажей по разным факультетам. Должно получиться забавно!

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

Второе примечание:
Идея этого поста навеяна прекрасной презентацией Брайана Ланга на конференции PyData Chicago 2016. Видеозапись здесь, слайды здесь.

Шаг первый: извлекаем данные из сети


На случай, если последние 20 лет вы провели в пещере: Распределяющая шляпа — это волшебная шляпа, которая помещает поступающих студентов по четырём факультетам Хогвартса: Гриффиндор, Слизерин, Хаффлпафф и Рэйвенклоу. У каждого факультета свои характеристики. Когда шляпу надевают на голову студента, она считывает его разум и определяет, какой факультет подходит ему лучше всего. Согласно этому определению, Распределяющая шляпа — это многоклассовый классификатор (multiclass classifier) (сортирует более чем по двум группам), в отличие от бинарного классификатора (сортирует строго по двум группам), которым является спам-фильтр.

Чтобы распределить студентов по факультетам, нам нужно знать о них определенную информацию. К счастью, достаточно данных есть на harrypotter.wikia.com. На этом сайте лежат статьи почти по всем аспектам вселенной Гарри Поттера, включая описания студентов и факультетов. Приятный бонус: компания Fandom, заведующая сайтом, предоставляет простой в использовании API и массу прекрасной документации. Ура!



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

Также нам нужно грамотно пройтись по всем студентам Хогвартса и записать факультеты, по которым они раскиданы Распределяющей шляпой (это будут «реальные данные», с которыми мы будем сравнивать результаты нашей сортировки). На сайте статьи разбиты по категориям, вроде «Студенты Хогвартса» и «Фильмы». API позволяет создавать списки статей в рамках конкретной категории.

Возьмём для примера Рэйвенклоу. Закинем все данные в переменную info и затем положим их во фрейм данных (Data Frame) Pandas.

# Импортирует модули
import pandas as pd
import requests

# Получает статьи из категории Рэйвенклоу
category = 'Ravenclaws'
url = 'http://harrypotter.wikia.com/api/v1/Articles/List?expand=1&limit=1000&category=' + category
requested_url = requests.get(url)
json_results = requested_url.json()
info = json_results['items']
ravenclaw_df = pd.DataFrame(info)

print('Number of articles: {}'.format(len(info)))
print('')
ravenclaw_df.head()

Количество статей: 158


Вы можете проследить полное выполнение анализа с помощью Rodeo!

Примечание:
Если воспользуетесь нашим Python IDE, Rodeo, то просто скопируйте и вставьте вышеприведённый код в Editor или Terminal. Результат вы увидите в окне History или Terminal. Бонус: можно просто перетаскивать окна мышью, меняя их расположение и размер.



На основе этих данных мы узнаем:

  • Первым пунктом в списке идёт «Ravenclaw individual infobox». Поскольку это не студент, нам нужно отфильтровать результаты по колонке «Тип».
  • К сожалению, в ravenclaw_df не указаны содержания статей… только описания. Чтобы получить содержания, придётся воспользоваться другим видом запроса к API и запрашивать данные на основе ID статей.
  • Также мы можем написать цикл, пройтись по всем факультетам и получить один фрейм со всеми необходимыми данными.

# Задаём переменные
houses = ['Gryffindor', 'Hufflepuff', 'Ravenclaw', 'Slytherin']
mydf = pd.DataFrame()

# Получаем ID статей, URL статей и факультеты
for house in houses:
    url = "http://harrypotter.wikia.com/api/v1/Articles/List?expand=1&limit=1000&category=" + house + 's'
    requested_url = requests.get(url)
    json_results = requested_url.json()
    info = json_results['items']

    house_df = pd.DataFrame(info)
    house_df = house_df[house_df['type'] == 'article']
    house_df.reset_index(drop=True, inplace=True)
    house_df.drop(['abstract', 'comments', 'ns', 'original_dimensions', 'revision', 'thumbnail', 'type'], axis=1, inplace=True)
    house_df['house'] = pd.Series([house]*len(house_df))
    mydf = pd.concat([mydf, house_df])

mydf.reset_index(drop=True, inplace=True)

# Выводим результаты
print('Number of student articles: {}'.format(len(mydf)))
print('')
print(mydf.head())
print('')
print(mydf.tail())

Количество статей о студентах: 748


Получение содержаний статей


Имея ID статей, мы можем начать запрашивать содержания. Но некоторые из статей просто ОГРОМНЫ, они содержат невероятное количество подробностей. Вы только взгляните на статьи про Гарри Поттера и Волан-де-Морта!



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

Нижеприведённый код извлекает из каждой статьи раздел «Личность и черты характера» и вычисляет его длину (количество знаков). Затем на основе ID объединяет эти данные с нашим начальным фреймом данных mydf (на это уходит немного времени).

# Циклически проходим по статьям и извлекаем разделы " Личность и черты характера " по каждому студенту
# Если в статье про какого-то студента такого раздела нет, то оставляем пустую строку
# Это займёт несколько минут
text_dict = {}
for iden in mydf['id']:
    url = 'http://harrypotter.wikia.com/api/v1/Articles/AsSimpleJson?id=' + str(iden)
    requested_url = requests.get(url)
    json_results = requested_url.json()
    sections = json_results['sections']
    contents = [sections[i]['content'] for i, x in enumerate(sections) if sections[i]['title'] == 'Personality and traits']

    if contents:
        paragraphs = contents[0]
        texts = [paragraphs[i]['text'] for i, x in enumerate(paragraphs)]
        all_text = ' '.join(texts)
    else:
        all_text = ''
    text_dict[iden] = all_text

# Помещаем данные в DataFrame и вычисляем длину раздела "Личность и черты характера" 
text_df = pd.DataFrame.from_dict(text_dict, orient='index')
text_df.reset_index(inplace=True)
text_df.columns = ['id', 'text']
text_df['text_len'] = text_df['text'].map(lambda x: len(x))

# Снова объединяем текст с информацией о студентах
mydf_all = pd.merge(mydf, text_df, on='id')
mydf_all.sort_values('text_len', ascending=False, inplace=True)

# Создаём новый DataFrame только с теми студентами, про которых есть разделы "Личность и черты характера" 
mydf_relevant = mydf_all[mydf_all['text_len'] > 0]

print('Number of useable articles: {}'.format(len(mydf_relevant)))
print('')
mydf_relevant.head()

Количество подходящих статей: 94



Шаг второй: Получение характеристик факультетов с помощью NLTK


Теперь мы знаем количество студентов, надо распределить их по факультетам. Для этого составим список характеристик каждого факультета. Начнём собирать из с harrypotter.wikia.com.

trait_dict = {}
trait_dict['Gryffindor'] = ['bravery', 'nerve', 'chivalry', 'daring', 'courage']
trait_dict['Slytherin'] = ['resourcefulness', 'cunning', 'ambition', 'determination', 'self-preservation', 'fraternity',
                           'cleverness']
trait_dict['Ravenclaw'] = ['intelligence', 'wit', 'wisdom', 'creativity', 'originality', 'individuality', 'acceptance']
trait_dict['Hufflepuff'] = ['dedication', 'diligence', 'fairness', 'patience', 'kindness', 'tolerance', 'persistence',
                            'loyalty']

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

  • «ambitious» (прилагательное) — можно легко заменить на 'ambition'
  • «hard work», «fair play» и «unafraid of toil» — эти фразы тоже можно легко заменить на однословные существительные:
  • «hard work» --> 'diligence'
  • «fair play» --> 'fairness'
  • «unafraid of toil» --> 'persistence'

Получив список характеристик для каждого факультета, можем просто сканировать колонку «Текст» и подсчитать, сколько раз использовались соответствующие слова в описаниях персонажей. Звучит несложно, верно?



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

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

Благодаря поддержке друзей, которым он был очень предан; вдохновению профессора Римуса Люпина предстать перед лицом своих страхов на третьем году обучения; и тому, что мучители его родителей разгуливают на свободе, Невил стал храбрее, увереннее в себе, и самоотверженным в борьбе против Волан-де-Морта и его Пожирателей Смерти.

(When he was younger, Neville was clumsy, forgetful, shy, and many considered him ill-suited for Gryffindor house because he seemed timid.

With the support of his friends, to whom he was very loyal, the encouragement of Professor Remus Lupin to face his fears in his third year, and the motivation of knowing his parents’ torturers were on the loose, Neville became braver, more self-assured, and dedicated to the fight against Lord Voldemort and his Death Eaters.)

Выделенные слова должны засчитываться в пользу каких-то факультетов, но они не будут засчитаны, потому что являются прилагательными. Также не будут учтены слова вроде «bravely» и «braveness». Чтобы наш алгоритм классификации работал правильно, нужно идентифицировать синонимы, антонимы и другие словоформы.

Синонимы


Исследовать синонимы можно с помощью функции synsets из WordNet, лексической базы данных английского языка, включённой в модуль nltk (NLTK — Natural Language Toolkit). “Synset” — это «synonym set», коллекция синонимов, или «лемм». Функция synsets возвращает наборы синонимов, которые ассоциированы с конкретными словами.

Озадачены? Давайте запустим код, а затем разберём его:

from nltk.corpus import wordnet as wn

# Наборы синонимов из разных слов
foo1 = wn.synsets('bravery')
print("Synonym sets associated with the word 'bravery': {}".format(foo1))

foo2 = wn.synsets('fairness')
print('')
print("Synonym sets associated with the word 'fairness': {}".format(foo2))

foo3 = wn.synsets('wit')
print('')
print("Synonym sets associated with the word 'wit': {}".format(foo3))

foo4 = wn.synsets('cunning')
print('')
print("Synonym sets associated with the word 'cunning': {}".format(foo4))

foo4 = wn.synsets('cunning', pos=wn.NOUN)
print('')
print("Synonym sets associated with the *noun* 'cunning': {}".format(foo4))
print('')

# Выводим синонимы ("леммы"), ассоциированные с каждым synset
foo_list = [foo1, foo2, foo3, foo4]
for foo in foo_list:
    for synset in foo:
        print((synset.name(), synset.lemma_names()))

Synonym sets associated with the word 'bravery': [Synset('courage.n.01'), Synset('fearlessness.n.01')]
Synonym sets associated with the word 'fairness': [Synset('fairness.n.01'), Synset('fairness.n.02'), Synset('paleness.n.02'), Synset('comeliness.n.01')]
Synonym sets associated with the word 'wit': [Synset('wit.n.01'), Synset('brain.n.02'), Synset('wag.n.01')]
Synonym sets associated with the word 'cunning': [Synset('craft.n.05'), Synset('cunning.n.02'), Synset('cunning.s.01'), Synset('crafty.s.01'), Synset('clever.s.03')]
Synonym sets associated with the noun 'cunning': [Synset('craft.n.05'), Synset('cunning.n.02')]
('courage.n.01', ['courage', 'courageousness', 'bravery', 'braveness']) ('fearlessness.n.01', ['fearlessness', 'bravery']) ('fairness.n.01', ['fairness', 'equity']) ('fairness.n.02', ['fairness', 'fair-mindedness', 'candor', 'candour']) ('paleness.n.02', ['paleness', 'blondness', 'fairness']) ('comeliness.n.01', ['comeliness', 'fairness', 'loveliness', 'beauteousness']) ('wit.n.01', ['wit', 'humor', 'humour', 'witticism', 'wittiness']) ('brain.n.02', ['brain', 'brainpower', 'learning_ability', 'mental_capacity', 'mentality', 'wit']) ('wag.n.01', ['wag', 'wit', 'card']) ('craft.n.05', ['craft', 'craftiness', 'cunning', 'foxiness', 'guile', 'slyness', 'wiliness']) ('cunning.n.02', ['cunning'])

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

  • wn.synsets('bravery') связано с двумя наборами синонимов: один для courage.n.01 и один для fearlessness.n.01. Давайте посмотрим, что это означает:
  • Первая часть ('courage' и 'fearlessness') это слово, вокруг которого выстроен весь конкретный набор синонимов. Назовём его «центральным» словом. То есть все синонимы в данном наборе («леммы») аналогичны по смыслу центральному слову.
  • Вторая часть ('n') означает «существительное» («noun»). К примеру, набор, ассоциированный со словом «cunning», включает в себя crafty.s.01 и clever.s.03 (прилагательные). Они появились тут потому, что слово «cunning» может быть и существительным, и прилагательным. Чтобы оставить только существительные, можно задать wn.synsets('cunning', pos=wn.NOUN).
  • Третья часть ('01') ссылается на конкретный смысл центрального слова. Например, 'fairness' может означать как «соответствие правилам и стандартам», так и «вынесение суждений без дискриминации или нечестности».

Как вы могли заметить, функция synset может предоставлять нежелательные наборы синонимов. Например, со словом 'fairness' также ассоциированы наборы paleness.n.02 («иметь от природы светлую кожу») и comeliness.n.01 («хорошо выглядеть и быть привлекательным»). Эти черты явно не ассоциируются с Хаффлпаффом (хотя Невил Лонгботтом и вырос красавчиком), так что придётся вручную исключать такие наборы из нашего анализа.

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



Антонимы и словоформы


После того, как мы собрали все синонимы, нужно позаботиться об антонимах и разных словоформах (например, применительно к «bravery» — «brave», «bravely» и «braver»). Немало тяжёлой работы можно выполнить в nltk, но всё же придётся вручную набивать деепричастия и прилагательные в сравнительной / превосходной степени.

# Выводим разные леммы (синонимы), антонимы и производные словоформы для наборов синонимов к "bravery"
foo1 = wn.synsets('bravery')
for synset in foo1:
    for lemma in synset.lemmas():
        print("Synset: {}; Lemma: {}; Antonyms: {}; Word Forms: {}".format(synset.name(), lemma.name(), lemma.antonyms(),
                                                                           lemma.derivationally_related_forms()))
        print("")

Synset: courage.n.01; Lemma: courage; Antonyms: [Lemma('cowardice.n.01.cowardice')]; Word Forms: [Lemma('brave.a.01.courageous')]
Synset: courage.n.01; Lemma: courageousness; Antonyms: []; Word Forms: [Lemma('brave.a.01.courageous')]
Synset: courage.n.01; Lemma: bravery; Antonyms: []; Word Forms: []
Synset: courage.n.01; Lemma: braveness; Antonyms: []; Word Forms: [Lemma('brave.a.01.brave'), Lemma('audacious.s.01.brave')]
Synset: fearlessness.n.01; Lemma: fearlessness; Antonyms: [Lemma('fear.n.01.fear')]; Word Forms: [Lemma('audacious.s.01.fearless'), Lemma('unafraid.a.01.fearless')]
Synset: fearlessness.n.01; Lemma: bravery; Antonyms: []; Word Forms: []

Собираем всё вместе


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

# Вручную выбираем наборы, которые нам подходят
relevant_synsets = {}
relevant_synsets['Ravenclaw'] = [wn.synset('intelligence.n.01'), wn.synset('wit.n.01'), wn.synset('brain.n.02'),
                                 wn.synset('wisdom.n.01'), wn.synset('wisdom.n.02'), wn.synset('wisdom.n.03'),
                                 wn.synset('wisdom.n.04'), wn.synset('creativity.n.01'), wn.synset('originality.n.01'),
                                 wn.synset('originality.n.02'), wn.synset('individuality.n.01'), wn.synset('credence.n.01'),
                                 wn.synset('acceptance.n.03')]
relevant_synsets['Hufflepuff'] = [wn.synset('dedication.n.01'), wn.synset('commitment.n.04'), wn.synset('commitment.n.02'),
                                  wn.synset('diligence.n.01'), wn.synset('diligence.n.02'), wn.synset('application.n.06'),
                                  wn.synset('fairness.n.01'), wn.synset('fairness.n.01'), wn.synset('patience.n.01'),
                                  wn.synset('kindness.n.01'), wn.synset('forgivingness.n.01'), wn.synset('kindness.n.03'),
                                  wn.synset('tolerance.n.03'), wn.synset('tolerance.n.04'), wn.synset('doggedness.n.01'),
                                  wn.synset('loyalty.n.01'), wn.synset('loyalty.n.02')]
relevant_synsets['Gryffindor'] = [wn.synset('courage.n.01'), wn.synset('fearlessness.n.01'), wn.synset('heart.n.03'),
                                  wn.synset('boldness.n.02'), wn.synset('chivalry.n.01'), wn.synset('boldness.n.01')]
relevant_synsets['Slytherin'] = [wn.synset('resourcefulness.n.01'), wn.synset('resource.n.03'), wn.synset('craft.n.05'),
                                 wn.synset('cunning.n.02'), wn.synset('ambition.n.01'), wn.synset('ambition.n.02'),
                                 wn.synset('determination.n.02'), wn.synset('determination.n.04'),
                                 wn.synset('self-preservation.n.01'), wn.synset('brotherhood.n.02'),
                                 wn.synset('inventiveness.n.01'), wn.synset('brightness.n.02'), wn.synset('ingenuity.n.02')]

# Функция, получающая разные словоформы из леммы
def get_forms(lemma):
    drfs = lemma.derivationally_related_forms()
    output_list = []
    if drfs:
        for drf in drfs:
            drf_pos = str(drf).split(".")[1]
            if drf_pos in ['n', 's', 'a']:
                output_list.append(drf.name().lower())
                if drf_pos in ['s', 'a']:
                    # Наречия + "-ness" существительные + сравнительные & превосходные прилагательные
                    if len(drf.name()) == 3:
                        last_letter = drf.name()[-1:]
                        output_list.append(drf.name().lower() + last_letter + 'er')
                        output_list.append(drf.name().lower() + last_letter + 'est')
                        output_list.append(drf.name().lower()+'ness')
                        output_list.append(drf.name().lower()+'ly')
                    elif drf.name()[-4:] in ['able', 'ible']:
                        output_list.append(drf.name().lower()+'r')
                        output_list.append(drf.name().lower()+'st')
                        output_list.append(drf.name().lower()+'ness')
                        output_list.append(drf.name()[:-1].lower()+'y')
                    elif drf.name()[-1:] == 'e':
                        output_list.append(drf.name().lower()+'r')
                        output_list.append(drf.name().lower()+'st')
                        output_list.append(drf.name().lower()+'ness')
                        output_list.append(drf.name().lower()+'ly')
                    elif drf.name()[-2:] == 'ic':
                        output_list.append(drf.name().lower()+'er')
                        output_list.append(drf.name().lower()+'est')
                        output_list.append(drf.name().lower()+'ness')
                        output_list.append(drf.name().lower()+'ally')
                    elif drf.name()[-1:] == 'y':
                        output_list.append(drf.name()[:-1].lower()+'ier')
                        output_list.append(drf.name()[:-1].lower()+'iest')
                        output_list.append(drf.name()[:-1].lower()+'iness')
                        output_list.append(drf.name()[:-1].lower()+'ily')
                    else:
                        output_list.append(drf.name().lower()+'er')
                        output_list.append(drf.name().lower()+'est')
                        output_list.append(drf.name().lower()+'ness')
                        output_list.append(drf.name().lower()+'ly')
        return output_list
    else:
        return output_list

# Создаём копию словаря черт характера
# Если этого не сделать, то мы сразу же обновим словарь, по которому проходим циклически, что приведёт к бесконечному циклу
import copy
new_trait_dict = copy.deepcopy(trait_dict)
antonym_dict = {}

# Добавляем синонимы и словоформы в (новый) словарь черт характера; также добавляем антонимы (и их словоформы) в словарь антонимов
for house, traits in trait_dict.items():
    antonym_dict[house] = []
    for trait in traits:
        synsets = wn.synsets(trait, pos=wn.NOUN)
        for synset in synsets:
            if synset in relevant_synsets[house]:
                for lemma in synset.lemmas():
                    new_trait_dict[house].append(lemma.name().lower())
                    if get_forms(lemma):
                        new_trait_dict[house].extend(get_forms(lemma))
                    if lemma.antonyms():
                        for ant in lemma.antonyms():
                            antonym_dict[house].append(ant.name().lower())
                            if get_forms(ant):
                                antonym_dict[house].extend(get_forms(ant))
    new_trait_dict[house] = sorted(list(set(new_trait_dict[house])))
    antonym_dict[house] = sorted(list(set(antonym_dict[house])))

# Выводим некоторые результаты
print("Gryffindor traits: {}".format(new_trait_dict['Gryffindor']))
print("")
print("Gryffindor anti-traits: {}".format(antonym_dict['Gryffindor']))
print("")

Характеристики Гриффиндора: ['bold', 'bolder', 'boldest', 'boldly', 'boldness', 'brass', 'brassier', 'brassiest', 'brassily', 'brassiness', 'brassy', 'brave', 'bravely', 'braveness', 'braver', 'bravery', 'bravest', 'cheek', 'cheekier', 'cheekiest', 'cheekily', 'cheekiness', 'cheeky', 'chivalry', 'courage', 'courageous', 'courageouser', 'courageousest', 'courageously', 'courageousness', 'daring', 'face', 'fearless', 'fearlesser', 'fearlessest', 'fearlessly', 'fearlessness', 'gallantry', 'hardihood', 'hardiness', 'heart', 'mettle', 'nerve', 'nervier', 'nerviest', 'nervily', 'nerviness', 'nervy', 'politesse', 'spunk', 'spunkier', 'spunkiest', 'spunkily', 'spunkiness', 'spunky']

Антихарактеристики Гриффиндора: ['cowardice', 'fear', 'timid', 'timider', 'timidest', 'timidity', 'timidly', 'timidness']

# Проверяем, что словарь черт характера и словарь антонимов не содержат повторов внутри факультетов
from itertools import combinations
def test_overlap(dict):
    results = []
    house_combos = combinations(list(dict.keys()), 2)
    for combo in house_combos:
        results.append(set(dict[combo[0]]).isdisjoint(dict[combo[1]]))
    return results

# Выводим результаты теста; должно получиться "False"
print("Any words overlap in trait dictionary? {}".format(sum(test_overlap(new_trait_dict)) != 6))
print("Any words overlap in antonym dictionary? {}".format(sum(test_overlap(antonym_dict)) != 6))

Есть какие-то повторы в словаре черт характера? False

Повторы в словаре антонимов? False



Шаг третий: Распределяем студентов по факультетам


Пришло время распределить студентов по факультетам! Наш алгоритм классификации будет работать следующим образом:

  • Проходит по каждому слову раздела «Личность и черты характера» по каждому студенту.
  • Если какое-то слово есть в списке черт, характерных для конкретного факультета, то к баллам этого факультета добавляется 1.
  • Если какое-то слово есть в списке античерт, характерных для конкретного факультета, то из баллов этого факультета вычитается 1.
  • Студент приписывается к факультету, который наберёт больше всего баллов.
  • Если будет ничья, то просто напишет “Tie!”.

Допустим, в разделе «Личность и черты характера» есть лишь предложение «Алиса была храброй». Тогда Алиса получит 1 балл для Гриффиндора и 0 баллов для остальных факультетов. Соответственно, Алиса попадёт в Гриффиндор.

# Импортируем "word_tokenize", разбивающий предложение на слова и пунктуацию
from nltk import word_tokenize

# Функция, распределяющая студентов
def sort_student(text):
    text_list = word_tokenize(text)
    text_list = [word.lower() for word in text_list]
    score_dict = {}
    houses = ['Gryffindor', 'Hufflepuff', 'Ravenclaw', 'Slytherin']
    for house in houses:
        score_dict[house] = (sum([True for word in text_list if word in new_trait_dict[house]]) -
                                  sum([True for word in text_list if word in antonym_dict[house]]))

    sorted_house = max(score_dict, key=score_dict.get)
    sorted_house_score = score_dict[sorted_house]
    if sum([True for i in score_dict.values() if i==sorted_house_score]) == 1:
        return sorted_house
    else:
        return "Tie!"

# Тестируем функцию
print(sort_student('Alice was brave'))
print(sort_student('Alice was British'))

Gryffindor Tie!

Похоже, функция работает. Применим её к нашим данным и посмотрим, что получится!

# Отключаем предупреждение
pd.options.mode.chained_assignment = None

mydf_relevant['new_house'] = mydf_relevant['text'].map(lambda x: sort_student(x))
mydf_relevant.head(20)




print("Match rate: {}".format(sum(mydf_relevant['house'] == mydf_relevant['new_house']) / len(mydf_relevant)))
print("Percentage of ties: {}".format(sum(mydf_relevant['new_house'] == 'Tie!') / len(mydf_relevant)))

Совпадение: 0.2553191489361702
Доля ничьих: 0.32978723404255317



Хм. Мы ожидали других результатов. Давайте выясним, почему Волан-де-Морт попал в Хаффлпафф.



# Текст о Волан-де-Морте
tom_riddle = word_tokenize(mydf_relevant['text'].values[0])
tom_riddle = [word.lower() for word in tom_riddle]

# Вместо вычисления баллов выведем список слов в тексте, совпадающих со словами из словарей черт характера и антонимов
words_dict = {}
anti_dict = {}
houses = ['Gryffindor', 'Hufflepuff', 'Ravenclaw', 'Slytherin']
for house in houses:
    words_dict[house] = [word for word in tom_riddle if word in new_trait_dict[house]]
    anti_dict[house] = [word for word in tom_riddle if word in antonym_dict[house]]

print(words_dict)
print("")
print(anti_dict)

{'Slytherin': ['ambition'], 'Ravenclaw': ['intelligent', 'intelligent', 'mental', 'individual', 'mental', 'intelligent'], 'Hufflepuff': ['kind', 'loyalty', 'true', 'true', 'true', 'loyalty'], 'Gryffindor': ['brave', 'face', 'bold', 'face', 'bravery', 'brave', 'courageous', 'bravery']}
{'Slytherin': [], 'Ravenclaw': ['common'], 'Hufflepuff': [], 'Gryffindor': ['fear', 'fear', 'fear', 'fear', 'fear', 'fear', 'cowardice', 'fear', 'fear']}

Как видите, Слизерин набрал (1-0) = 1 баллов, Рэйвенклоу — (6-1) = 5, Хаффлпафф — (6-0) = 6, Гриффиндор — (8-9) = -1.

Интересно отметить, что в разделе «Личность и черты характера» Волан-де-Морта, самом длинном среди всех студентов, со словарями совпало лишь 31 слово. Это означает, что по другим студентам, вероятно, было гораздо больше совпадений. То есть мы принимаем решение о классификации на основании слишком небольшого количества данных, что и объясняет высокую долю ошибок и большое количество ничьих.

Выводы


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

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

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

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

https://habrahabr.ru/post/331352/


Метки:  

Как смотреть кино и сериалы с пользой: умные субтитры

Четверг, 22 Июня 2017 г. 08:22 + в цитатник


Школа Skyeng запускает skyeng.tv – совместный образовательный проект с кинокомпанией Disney. В этом проекте «Дисней» предоставляет видео-контент, а мы — технологию умных субтитров, которая также используется нами в некоторых других сервисах. Сегодня мы расскажем, как они устроены, как работают, какие проблемы нам пришлось решать при их разработке.


Что такое «умные субтитры»?


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

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



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

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

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


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



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

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

Такие умные субтитры готовятся в живом режиме, процесс занимает 4-6 секунд при запуске проигрывания и практически не заметен пользователю. Готовые субтитры остаются в нашей базе и при дальнейших просмотрах той же единицы контента берутся оттуда (впрочем, эти базы мы регулярно чистим, когда выкатываем новую, «более лучшую» версию парсера). Теоретически мы можем масштабировать сервер с парсером, но пока это не требуется: сейчас мы можем справиться с десятком запросов в минуту, пока на пике их оказывается три (такие результаты были в декабре, когда мы запустили проект с «Амедиатекой»), и нагрузка быстро падает, поскольку новым пользователям выдаются уже готовые титры из базы.

Узкие места


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



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

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

Что дальше?


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

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



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

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

https://habrahabr.ru/post/331322/


Метки:  

Настройка сервера для проекта (Nginx, PHP-FPM, Elasticsearch, RabbitMQ)

Четверг, 22 Июня 2017 г. 07:25 + в цитатник
Порой начиная новый проект мы примерно заранее знаем какие инструменты нам могут понадобиться.

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

В качестве системы виртуализации я выбрать VMware Workstation.

Подготовка сервера



1. ОС: CentOS 7
2. Сервер для анализа и поиска данных: Elasticsearch
3. Сервер очередей: RabbitMQ
4. Веб сервер: Nginx + PHP7 FPM



Установка ОС CentOS 7



Скачиваем ОС с официального сайта www.centos.org

Устанавливаем систему с минимальным набором программ и настраиваем сеть.

Добавляем репозиторий Remi.
В папку /etc/yum.repos.d/ добавляем файл с настройками репозитария:

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority


После добавляем ключ Remi:
root# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi


Обновляем систему и устанавливаем сопутствующий набор программ:

root# yum install epel-release -y
root# yum update -y
root# yum groupinstall 'Development tools' -y
root# yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git wget wxBase.x86_64


Установка Java JDK:

root# yum install java-1.8.0-openjdk -y


На этом подготовка ОС завершена.

### Установка Elasticsearch

Проверяем установлена ли Java:

root# java -version
root# echo $JAVA_HOME


Скачиваем и устанавливаем ключ:

root# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch


В папку /etc/yum.repos.d/ добавляем файл с настройками репозитария:

[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md


Установка Elasticsearch:

root# yum install elasticsearch -y


Настраиваем Firewall, открываем порты для Elasticsearch

root# firewall-cmd --permanent --add-port=9200/tcp
root# firewall-cmd --permanent --add-port=9300/tcp
root# firewall-cmd --reload


Запускаем Elasticsearch и добавляем в автозагрузку

root# systemctl start elasticsearch
root# systemctl enable elasticsearch
root# systemctl status elasticsearch


### Установка RabbitMQ

Установка Erlang

root# wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
root# rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
root# yum update
root# yum install erlang


Установка RabbitMQ

root# wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
root# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
root# yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm


Настраиваем Firewall, открываем порты для RabbitMQ

root# firewall-cmd --permanent --add-port=4369/tcp
root# firewall-cmd --permanent --add-port=25672/tcp
root# firewall-cmd --permanent --add-port=5671-5672/tcp
root# firewall-cmd --permanent --add-port=15672/tcp
root# firewall-cmd --permanent --add-port=61613-61614/tcp
root# firewall-cmd --permanent --add-port=8883/tcp
root# firewall-cmd --reload


Запускаем RabbitMQ и добавляем в автозагрузку

root# systemctl start rabbitmq-server
root# systemctl enable rabbitmq-server
root# rabbitmqctl status


Активация консоли управления RabbitMQ

root# rabbitmq-plugins enable rabbitmq_management
root# chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/


После этого консоль управления RabbitMQ становиться доступным по адресу:

http://ip-address:15672/


Добавляем пользователя

root# rabbitmqctl add_user mqadmin mqadmin
root# rabbitmqctl set_user_tags mqadmin administrator
root# rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*"


### Установка Веб сервера: Nginx + PHP7 FPM

Установка Nginx:

root# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
root# rpm -Uvh nginx-release-centos-7-0.el7.ngx.noarch.rpm
root# yum install nginx -y
root# systemctl enable nginx


Установка PHP-FPM

root# yum install php70-php php70-php-cli php70-php-fpm php70-php-bcmath php70-php-devel php70-php-gd php70-php-json php70-php-mbstring php70-php-mcrypt php70-php-opcache php70-php-pecl-amqp php70-php-pecl-event -y


Запускаем PHP-FPM
systemctl enable php70-php-fpm


Отключаем SELinux:

В файле /etc/selinux/config ставим параметр SELINUX=disabled, после выполняес команду:

root# setenforce 0


Настраиваем Nginx и PHP-FPM для совместной работы

PHP-FPM:

Редактируем файл /etc/opt/remi/php70/php-fpm.d/www.conf *(не забудьте создать пользователя и группу www-data)*


listen = 127.0.0.1:9000

user = www-data
group = www-data


Создаем файл /etc/nginx/conf.d/php-fpm.conf


upstream php-fpm {
server 127.0.0.1:9000;
#server unix:/var/run/php-fpm/www.sock;
}


Создаем файл для проекта /etc/nginx/conf.d/project.conf


server {
listen 80 default_server;

root /home/project;
index index.php index.html index.htm;

server_name _;

location / {
index index.php index.html index.htm;
try_files $uri $uri/ =404;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}


Создаем папку с проектом /home/project

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

В папке проекта создадит файл index.php для теста





Перезапускам Nginx и PHP-FPM

root# systemctl restart nginx
root# systemctl restart php70-php-fpm


Проверяем работу Nginx:
http://ip-address/


На этом подготовка сервера завершена и можно приступать к разработке проекта.
Но это уже совсем другая история.

P.S. Видео процесса настройки сервера с пробами о шибками youtu.be/EwjRg0i6GkI
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331396/


Метки:  

Законы и проекты, которые изменят лицо российского IT. Часть II

Четверг, 22 Июня 2017 г. 06:59 + в цитатник


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

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

Криптоактивы: всё новое — хорошо забытое старое?

На сегодня ЦБ идёт в направлении «криптовалюты — цифровой товар» (чем грозит — можно почитать на Гигтаймсе). Мне ближе позиция имущественного права. Ещё в 2014 Минфин и ЦБ считали bitcoin и собратьев денежным суррогатом. Впрочем, единства в мире нет до сих пор. Даже после Японии, которая всех к этому единству призвала.

Но проблема скрывается совсем в иной плоскости: настоящая проблема. Недавно уважаемая мной Роскомсвобода начала важную кампанию «Право на Bitcoin», тезисы которой звучат так:
  1. Экспертное заключение, что цифровые деньги — не денежный суррогат
  2. Обжалование в апелляционных/кассационных и в высших судах субъектов незаконных решений в этой области (а таких хватает)
  3. И даже обжалование в Верховном суде

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

Второй вывод из этого же посыла заключается в том, что эксперты (начиная с О. Скоробогатовой из ЦБ и Э. Сидоренко из группы по разработке закона о криптовалютах, заканчивая теми, кто им противостоит) считают, что нужен некий общий закон, который всё расскажет о блокчейн-активах. Но зачем?

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

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

На самом деле мне вообще не понятна любовь к так называемому императивному методу: когда всё предписано, расписано и делать можно только то, что чётко обозначено. Почему не понятна? Да потому как есть ещё метод диспозитивный (ст. 1 ГК РФ) и на его основе созданы, и я это подчёркиваю, лучшие достижения в науке, технике, искусстве и во многих иных областях. Потому как такой метод даёт с одной стороны нужную степень свободы, а с другой — устанавливает необходимые рамки в виде общегражданской ответственности (вполне конкретной, кстати).

Так, например, электронные деньги с 1998 по 2012 г. жили вне рамок ФЗ №161 и ситуация была ничем не хуже, чем сейчас. При этом уровень защищённости клиентов отнюдь не изменился: напротив, сейчас есть дела, где люди идут, например, высуживать у ВМ деньги и только в суде узнают, что ВМ — это не электронные деньги. Или, напротив, идут с иском против Киви или Яндекс.Денег и понимают, что существует особый порядок, который не соблюден, который нужен якобы для защиты же интересов банков, НКО и самих пользователей. Последних, лично я бы, вычеркнул.

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

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

Отдельно несколькими строками скажу о майнинге.

Во-первых, благодарю биткоин-майнера №1 в Иркутской области — Юрия Дромашко (facebook & youtube) за предоставление для анализа договора на услуги майнинга. Во-вторых, по этому поводу будет отдельная статья, но позже.

Теперь главное: давайте процитирую (цитата — длинная, но важная):

У нас сейчас сложилось представление, что майнер – тот кто сидит на своей криптоферме, дома или в своей конторе ночью и майнит, на самом деле это ещё и товарищи, которые обеспечивают консенсус, которые занимаются администрированием сетей.Взаимодействие между различными типами систем, тоже важный вопрос. Как юристы будут заниматься этим? Мы должны найти некий переходничок, как и приезжая в другую страну мы понимаем – не факт, что наш телефон будет заряжаться от их сети, идём в магазин и покупаем переходник.Такая же система должна быть и здесь, этот переходник должен быть найден, но не в ближайшем магазине, а в ближайшем ЦБ.

Намёк, думаю, прозрачен и ясен. Только вот, анализируя деятельность ЦБ, как-то не могу сказать, что деятельность эта хоть сколько-нибудь эффективна. Или я ошибаюсь?

IoT, умные контракты и ИИ

И вот мы (в смысле в России) подошли к сфере, которая вообще никак не регулируется правом. А меж тем на прилавках онлайн-витрин уже валяются новые токены с говорящим именем IOTA (в ТОП-6 между прочим).

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

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

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

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

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

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

Стать первыми в этой области — это вновь выйти в Космос. Первыми. Не меньше.

Что ещё?

Какие ещё сферы будут зарегулированы в РФ после 2018 года (надеюсь, причины этой «даты» пояснять не нужно?)? Во-первых, фриланс. На него уже накинулись, создав никому не нужную категорию «самозанятых граждан» и поставив ребром вопрос об онлайн-кассах, но, поверьте, на этом никто не остановится.

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

Дальше — как раз всё, что связано с шифрованием. VPN и ТОР уже договариваются с главой Роскомнадзора (по его, правда, же словам). Но ведь шифруется в Рунете не только трафик через VPN, не так ли?

Ещё одна сфера, за которую «срочно и плотно» возьмутся (и уже взялись) — это ecommerce: закон о товарных агрегаторах это только цветочки. Ягодки начнутся, когда ГОСТы для ИМ станут «нормой», а сами ИМ приравняют к рознице (сейчас этому противостоит только Минэкономразвития). Стандартизация? Нужна и полезна, но только там, где рынок уже насыщен и перенасыщен. А я вот что-то не вижу русского Амазона (даже после массовой скупки: e96 сотоварищи, Техносилы, Эльдорадо и М.Видео).

В заключение скажу следующее: прекрасно понимаю, что утерянные в жгучем 2008 средства нужно компенсировать. Заморозкой пенсий, введение дополнительных поборов (ака Платон, капремонт и т.д.), жёсткой регламентацией (ака онлайн-кассы, мессенджеры) и другими методами. Для государства это нормально. Другой вопрос на сколько это нормально для граждан, которые покупают за доллары, которые (валюта т.е.) стоят почти в 2 раза больше, чем в 2014 году при уровне цен в два и более раза выше, чем в том же году, но при средней зарплате на уровне 2014 года — это вопрос уже вне рамок Хабра. Но, что в рамках данного ресурса — так это получение адекватного фидбэка от сообщества с последующими попытками хоть как-то повлиять на этот процесс.

Например, сегодня мы (я и команда) получили рекомендацию написать открытое письмо по криптовалютам, обращённое к тем, кто разрабатывает под них закон. Почему бы и нет? К тому же в 2017-2018 гг. мы планируем запросы в КС по ряду важных для it-сферы законов. Но здесь уже нужна поддержка. Посмотрим, как реализуются наши и инициативы Роскомсвободы и будем действовать по обстоятельствам.

Пока всё. Третья часть — скоро.

P.S. Анонс по статьям этой темы:
  1. Правовой статус майнинга
  2. ICO в России
  3. Игровые деньги, бонусы и криптовалюты — что общего?
  4. Фриланс по закону. Версия власти.
  5. IoT, смарт-контракты + ИИ: объект становится субъектом?
  6. История русского e-commerce: что не так?

Также жду предложений по анализу конкретных актов и проектов. Теперь — точно всё :)
Нужны ли специальные законы для новых сфер?

Проголосовало 4 человека. Воздержалось 2 человека.

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

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

https://habrahabr.ru/post/331356/


Организация коммутационного поля СКС высокой плотности

Четверг, 22 Июня 2017 г. 04:48 + в цитатник
Объем и плотность коммутационного поля СКС прямо пропорциональны хаосу на нем и обратно пропорциональны возможности его устранения. Проблематика проектирования и построения новой СКС сводится к расстановке рабочих мест, кабельных трасс и коммутационных узлов. Никто не задумывается о технических решениях, призванных обеспечить эффективное эксплуатирование системы после ее сдачи.





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



Через 2-3 годя все изменится. Как вы думаете, принял бы заказчик вот такой треш?



А он неизбежен. Шкаф шириной всего 600мм, все организаторы горизонтальные. Без шансов.
Кто-то будет утверждать, что виной всему ленивые администраторы, которые не следят за порядком. Это справедливо, но только отчасти. Если у людей нет нормального инструментария, если они загнаны в рамки, когда невозможно обеспечить эффективную организацию кабелей, то тут любой опустит руки.
Чтобы избежать этого, нужно соблюдать всего 3 простых принципа:

Принцип №1
Минимальная ширина коммутационного шкафа — 750мм. Минимальное расстояние между стойками при рядном расположении — 200 мм.

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

Минимальное расстояние между стойками при рядном расположении — 200 мм.



Минимальная ширина коммутационного шкафа — 750мм.



Принцип №2
Используйте вертикальные кабельные организаторы. Прекратите использовать горизонтальные организаторы. Вообще.

Введение: горизонтальные организаторы – это анохронизм, унаследованный по инерции от 110 кросс-панелей. Напомню, что 110 кросс-панель – это предок нынешних патч-панелей, где на фронтальной стороне вместо привычного разъемного соединителя RJ45 (8P8C) использовались соединители 110 типа. Коммутационные шнуры были тонкие и легкие (неэкранированные, не выше категории 5/5е).



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

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



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



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

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

Пример №1 Кабельные организаторы AMP NETCONNECT NEW Hi-D



Пример с медью, при плотности 48 портов на 1U:



Пример с оптикой, при плотности 48xLC Duplex на 1U:



Они же в связке с специализированным решением AMP NETCONNECT Netpodium:





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

Вот вариант организаторов от APC в шкафу APC:



Вот еще примеры организаторов от других производителей (к сожалению, не идентифицированных):





На последней картинке есть горизонтальные организаторы, но поверьте, они не нужны. Вы поймете это ознакомившись с принципом №3.
Некоторые решения (те же Hi-D от AMP Netconnect) позволяю обеспечить организацию только в выделенных юнитах. Все зависит от модели: для 1U, 2U, 4U и т.д. Т.е. нет необходимости переплачивать за 42U комплект.



Раз уж мы затронули тему специализированных коммутационных стоек, то стоит сказать несколько слов о них. Я уже привел пример конструктива– AMP NETCONNECT Netpodium. Это решение было разработано с нуля и специально для узлов коммутации высокой плотности портов.

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

Решение от Systimax:





Решение от Panduit:



Решение от Chatsworth:



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

Принцип №3

Жгутируйте и укладывайте патч-корды при помощи матерчатых стяжек-липучек Velcro. Это обеспечит прекрасный внешний вид и читабельность маркировки коммутационной панели. А также защитит шнуры от переплетения в пучке.







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

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

1. Шкаф шириной от 750мм. В случае со стойками –расстояние между ними минимум 200мм.
2. Приоритетное использование вертикальных кабельных организаторов. В идеальном варианте в сочетании с открытыми стойками или специализированными конструктивами, такими как Netpodium от AMP NETCONNECT.
3. Активное использование для организации коммутационных шнуров матерчатых стяжек-липучек Velcro.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331394/


Метки:  

Перевод книги Appium Essentials. Глава 2

Среда, 21 Июня 2017 г. 23:31 + в цитатник
Привет. Продолжаем перевод книги по Appium. Впереди, на мой взгляд, самая нудная, но все же, необходимая глава — в ней рассказывается о том, как развернуть на своей машине все необходимое окружение. От установки JDK до создания JAVA-проекта в IDE.
Поехали


Сегодня, в мире мобильной разработки происходит очень много вещей и нам необходимо тестирование, чтобы удовлетворить ожидания пользователей. Прогресс в мобильной разработке способствует прогрессу в автоматизации тестирования мобильных приложений. Dan Cuellar пришел с гениальной идеей интеграции инструментов с Selenium. После, он создал Appium. Appium — хороший и широко используемый инструмент для автоматизации мобильных приложений. Самое приятное — это open source проект.
В этой главе:



Appium – за и против


Appium — проект с открытым исходным кодом для автоматизации мобильных приложений: нативных, web-приложений и гибридных, разработанных для Android,iOS и Firefox OS.
Прежде, чем говорить о преимуществах Appium, давайте посмотрим на его недостатки:
  • Нет реализации работы с Android Alert: обработка всплывающих диалоговых окон в нативных приложениях еще не реализована через Alert API, но есть альтернативный способ работы с алертами, который мы рассмотрим в главе 7 (Расширенные пользовательские действия). Надеемся, работа с диалоговыми окнами будет реализована в скором времени.
  • Ограниченная поддержка Androidверсий: Appium напрямую поддерживает версии Android 17 и выше, но если мы хотим работать с версиями старше, нам нужно использовать интегрированныйSelendroid.
  • Нет распознавания изображений: нет возможности локализовать картинки на странице; для того, чтобы работать с изображениями, нам придется работать с координатами на экране, что является не лучшей практикой, но в планах развития у инструмента стоит возможность работы с изображениями.
  • Поддержка жестов: поддержка некоторых жестов еще не реализована, например в java-библиотеке не double-click, но есть в других библиотеках. По-прежнему, надеемся, что в ближайшее время будет реализовано.

Теперь, давайте обсудим преимущества Appium, на основе его философии. Философия Appium отличается от философии конкурентов. Официально, философия следующая:
  • Не нужно рекомпилировать или дополнять свое приложение, чтобы автоматизировать его
  • Пользователь не должен быть привязан к конкретному языку программирования для написания тестов
  • Пользователь не должен изобретать колесо, когда речь заходит о фреймворке [видимо, имеются в виду практики работы с Selenium]
  • Решение должно быть open source как духом, так и на практике

Appium использует существующую инфраструктуру, которую предоставляет поставщик [iOS, Android], что удовлетворяет первому требованию, так что нам не нужно встраивать в тестируемое приложение сторонний код. Это позволяет тестировать нам то же самое приложение [даже ту же самую сборку], которую мы разместим в маркетплейсе.
Если говорить о втором требовании, Appium расширяет клиентские библиотеки WebDriver, которые уже написаны на популярных языках программирования. Так что мы свободны в выборе языка для разработки тестов.
Appium расширяет существующий WebDriver JSONWP с дополнительными методами API, которые подходят для мобильной автоматизации. Так что у Appium тот же стандарт, что и у WebDriver и нет необходимости пересматривать подход к автоматизации, что, в свою очередь, соответствует третьему требованию.
Последнее в списке, но не по значению, Appium — open source проект.
Инструмент предоставляет кросс-платформенное решение для нативных и гибридных приложений. Это значит, что одни и те же тест-кейсы будут работать на нескольких платформах. Если вы уже знакомы с Selenium WebDriver, то Appium вам покажется знакомым, иначе, рекомендуется сначала изучить WebDriver для лучшего понимания. Appium использует те же сценарии, что и WebDriver. Также, доступно тестирование в облаке; можно запускать свои тесты в облачных сервисах, таких как Sauce Labs и Testdroid. Они предоставляют сервисы для прогона тестов на реальных девайсах и симуляторах.
Все эти преимущества делают Appium превосходным, по сравнению с другими средствами автоматизации. Следующая таблица показывает преимущества Appium над конкурентами, опираясь на описанную выше философию:
Инструмент Т1 Т2 Т3 Т4
Calabash - - - +
iOS Driver + + + -
Robotium - - + -
Selendroid - + + -
Appium + + + +



Системные требования для Android/iOS


Мы прочитали про Appium; пришло время узнать системные требования для Android/iOS.

Требования для тестирования Android на Windows и Mac


  • Java (версии 7 и выше)
  • Android SDK API (версии 17 и выше)
  • Android Virtual Device (AVD) [эмулятор, как минимум, доступен после установки Android Studio] или реальное устройство


Требования для iOS:


  • Mac OS X 10.7 и выше
  • Xcode (4.6.3 и выше; рекомендуется 5.1) с command-line инструментами сборки
  • Java (версии 7 и выше)
  • Homebrew
  • NodeJS и npm

В следующем разделе мы посмотрим, как устанавливать разное ПО, указанное выше.


Установка разного ПО


Для начала работы с Appium, нам нужно установить некоторое ПО.

Установка Appium для работы с Android


Требования следующие:
  • JDK (Java development kit)
  • Android SDK (Software development kit)
  • Appium под разные операционные системы


Установка JDK на Windows


Для установки JDK, нужно перейти по ссылке. После установки JDK, нужно установить переменные окружения:
[Далее в книге рассказывается, как прописать JAVA_HOME].
Также необходимо добавить в переменную PATH значение "%JAVA_HOME%\bin". [Проверить, что все получилось, можно, написав в cmd команду
echo %JAVA_HOME% //выведется добавленное содержимое

echo %PATH% //значение должно будет содержать текст из %JAVA_HOME% + "\bin"
]

Установка Android SDK


Android SDK можно скачать на официальном сайте под свою ОС.
[Переменная ANDROID_HOME устанавливается так же, как и JAVA_HOME. В качестве значения, передается путь до директории, куда установили Android SDK. В переменную PATH нужно добавить значения "%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools". Дальше необходимо будет запустить Android Studio. В меню перейти Tools -> Android -> SDk Manager. Загрузить интересующие платформы (вкладка SDK Platforms) и инструменты (вкладка SDK Tools)
]


Установка переменных окружения для Mac


[Подозреваю, что пользовательского опыта с Mac у читателей меньше, чем с Windows. Как у меня, например. Поэтому здесь, пожалуй, опишу подробно].
Если вы устанавливаете переменные первый раз, вам нужно создать
.bash_profile
файл:
  1. Откройте терминал
  2. Напишите
    touch ~/.bash_profile
    и нажмите Enter.
  3. Напишите
    open ~/.bash_profile
    и нажмите Enter. Откроется файл .bash_profile

Теперь, у нас есть файл bash_profile. Чтобы указать пути к Java и Android SDK, нужно задать переменные JAVA_HOME и ANDROID_HOME и bash_profile. В файл пишем:
  • export JAVA_HOME=path/to/the/java/home
  • export ANDROID_HOME=path/to/the/android/sdk
  • export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

Содержимое файла нужно сохранить.
После того, как эти шаги будут выполнены, можно в терминале написать
java –version
, чтобы проверить установку пути до Java.

Appium для iOS


Нам потребуются:
  • Xcode
  • Homebrew
  • Node и npm


Устанавливаем Xcode


  1. Идем на сайт. Кликаем на кнопку «View in Mac App Store».
  2. Система запустит App Store автоматически на вашем Mac и откроет страницу Xcode.
  3. Кликнуть на кнопку «Free», а затем — на кнопку «Install App».

Чтобы запустить Xcode, вы можете перейти в папку Applications и затем сделать double-click по иконке Xcode.

Устанавливаем Homebrew


Homebrew — это менеджер пакетов для Mac, который используется для установки разных пакетов, которые не поставил Apple. C Homebrew, вы можете установить множеств open source инструментов. Для установки Homebrew, делаем следующее:
  1. Открываем терминал и пишем: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. Далее следуем инструкциям, отображаемым в терминале.
  3. После установки Homebrew, выполняем команду
    brew doctor
    . Должны получить сообщение «Your system is ready to brew»; если нет — пробуйте устранять проблемы, на которые указывает brew doctor.


Node и npm


npm — менеджер пакетов Node.js, онлайн-репозиторий open source Node.js проектов. Утилита командной строки для установки пакетов. Appium-сервер написан на NodeJS; вот почему нам нужен npm — чтобы скачать Appium. Есть и другие способы скачать Appium, о которых поговорим позже.
Давайте поставим Node, используя команды brew:
brew install node

Appium для Windows


Вы можете скачать Appium с официального сайта, или выгрузить из репозитория: github.com/appium/appium.git.
Чтобы убедиться, что все установлено и настроено корректно, выполните в командной строке: node Appium-doctor [если чего-то будет не хватать, утилита об этом сообщит и даст советы, как исправить ситуацию].
Вам даже не нужно скачивать NodeJS — он идет в пакете с Appium. Если команда node не распознается, установите в переменную PATH путь до директории NodeJS (например, C:\AppiumForWindows\node_modules\appium\bin).

Appium для Mac


Можно скачать с сайта, а можно — используя npm. Выполните в терминале команду:
npm install –g appium
После установки, запустите [там же, в терминале] appium-doctor, чтобы убедиться, что все настроено корректно.

Скачиваем необходимые JAR-файлы


Нужно скачать некоторые библиотеки для работы с Appium:

Создание эмуляторов и симуляторов


Теперь посмотрим, как создаются эмуляторы и симуляторы. Начнем с iOS-симулятора, а потом перейдем к эмулятору Android.

Симулятор iOS


На Mac нам не нужно создавать симулятор: мы уже поставили его, установив Xcode. Когда вы запустите Appium-сервер впервые, он предложит вам авторизовать использование инструментов. Или, если вы запускаете через npm, выполните
sudo authorize_ios
для работы с симулятором.

Эмулятор Android


Виртуальное устройство [далее AVD] можно создать двумя способами:
  • Через командную строку;
  • Используя AVD Manager.

Давайте создадим AVD через командную строку:
  1. Откройте командную строку и напишите
    android list targets
    . Выведется список доступных платформ
  2. Следующая команда
    android create avd –n  -t  --abi 
    .

Вы можете кастомизировать AVD, используя разные параметры командной строки; больше информации на сайте. Ссылка может устареть. Если устареет, гуглите «avds command line».
Теперь давайте попробуем создать AVD средствами AVD Manager (его можно найти в папке Android SDK):
  1. Дабл-клик по AVD Manager. нажать кнопку New {написать, как через Android Studio}
  2. Указать имя эмулятора [произвольное] и задать необходимые параметры
  3. Нажать Ok

Завершив эти шаги, вы увидите свой эмулятор в списке доступных.


Настройка Java-проекта в Eclipse


Для написания тестовых сценариев, нам потребуется IDE. Сегодня на рынке достаточно много open source IDE, таких как Eclipse, NetBeans, IntelliJ IDEA и другие. Мы будем использовать Eclipse IDE [ну вот еще! Ниже опишу настройку проекта в IntelliJ IDEA]. Если вы скачивали Android ADT, то Eclipse у вас уже есть. Если что, всегда можно скачать с сайта.
Запустите IDE дважды кликнув на иконку eclipse.exe. После этого, для настройки Java-проекта, нужно будет выполнить следующие шаги:
  1. При запуске, IDE спросит у вас, где будет располагаться рабочая папка [Workspace location]. Указываем удобный путь и жмем Ok
  2. На welcome-скрине кликнуть иконку Workbench [в правом верхнем углу].
  3. Создайте новый проект. Это можно сделать через меню File | New | Project
  4. В открывшемся окне, выбрать в папке Java тип проекта Java Project и нажать Next
  5. Указать имя проекта [Project name], кликнуть на Use a project specific JRE и нажать Finish
  6. Вы создали проект. Теперь создайте пакет: правой кнопкой по папке src [в обозревателе проекта], в контекстном меню — New | Package. Указать имя пакета. Например, «com.example.appium». Затем нажать Finish.
  7. В созданном пакете создаем класс: правой кнопкой по пакету com.example.appium. В контекстном меню — New | Class и указать имя класса, например, FirstScript. Затем нажать Finish.
  8. В созданном пакете создаем класс: правой кнопкой по пакету com.example.appium. В контекстном меню — New | Class и указать имя класса, например, FirstScript. Затем нажать Finish.
  9. Перед тем, как писать тест, нужно добавить несколько JAR-файлов. Правой кнопкой по проекту. В контекстном меню — Build Path | Configure Build Path. Eclipse откроет диалоговое окно. Выберите вкладку Libraries и нажмите Add External JARs...
  10. Выберите JAR-файлы, показанные на скриншоте и нажмите Ok


Мы создали проект и добавили все необходимые JAR-файлы. Еще мы будем использовать TestNG. Нам нужно поставить TestNG-плагин для Eclipse:
  1. Нажмите на вкладку Help, затем на Install New Software
  2. В поле Work укажите адрес beust.com/eclipse. Ниже появится TestNG; выберите TestNG и нажмите Next. Далее следуйте инструкциям инсталлятора, чтобы поставить плагин TestNG.
  3. TestNG плагин будет отображаться в разделе Preferences вкладки Window

Теперь мы готовы писать первый Appium-тест.


Вот на этой позитивной ноте, автор завершает главу.

P.S.:

Как создать Java-проект, если вы работаете с IntelliJ IDEA


  1. Запустить IntelliJ IDEA
  2. В открывшемся диалоговом окне нажать Create New Project
  3. Тип проекта — Java. Убедиться, что в поле Project SDK указана JDK. Если нет, указать путь через кнопку New...
  4. Нажать Next. В следующем окне — тоже Next
  5. Указать Project name. Нажать Finish
  6. Создастся проект. Добавлять пакеты и классы так же, как в Eclipse (правой кнопкой по паке src и т.д.)
  7. Чтобы добавить JAR-файлы, нужно перейти File | Project Structure
  8. В левой панели выбрать раздел Modules
  9. Выбрать вкладку Dependencies
  10. Нажать "+" и выбрать нужные JAR-файлы
  11. Нажать Ok



В следующей главе, мы рассмотрим Appium GUI.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331248/


Метки:  

Особенности организации ИТ-инфраструктуры для видеонаблюдения

Среда, 21 Июня 2017 г. 22:18 + в цитатник


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

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

Когда дело касается сотен и даже тысяч видеокамер одним сервером или готовым решением из коробки обойтись не получится, особенно если необходимы дополнительные функции, связанные с видеоаналитикой (обнаружение, слежение, распознавание), интеграцией с кассовыми решениями, интеграцией в комплексные системы безопасности (СКУД, ОПС). В таком случае оптимальным решением является использование специализированного ПО для видеонаблюдения – VMS (Video Management Software), которое предусматривает возможность масштабирования и поддержки большого количества IP-камер, а также все необходимые для проекта функции и возможности.

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

  • локальные носители серверов;
  • Direct Attached Storage (DAS) — дисковые полки, подключаемые к серверам напрямую;
  • и/или выделенные СХД с файловым или блочным доступом.

Естественно, под серверами мы понимаем серверы, на которые установлено ПО видеонаблюдения (VMS), условно будем их называть — видеосерверы.
Обработка большого количества видеопотоков с высокими характеристиками требует серьёзных вычислительных мощностей. В первую очередь это касается процессорных ресурсов, в плане оперативки видеосерверы, как правило, не прожорливы, обычно хватает 8-16ГБ ОЗУ на сервер, но конечно встречаются исключения.

Требования к видеосерверу на 100 потоков


Попробуем оценить требования к вычислительным ресурсам и, самое главное, к подсистеме хранения, которые предъявляются в серьезных проектах по видеонаблюдению. Будем исходить из того, что видеосерверы осуществляют прием, обработку и запись видеопотоков в архив, а также другой необходимый функционал VMS, без упора на видеоаналитику, которая в разы увеличивает требования к вычислительным ресурсам. Отображение картинки с IP-камер для мониторинга в реальном времени и воспроизведение видео из архива должно осуществляться с выделенных УРМ (Удаленных Рабочих Мест), что позволяет снять с видеосерверов значительную часть вычислительной нагрузки (до половины). УРМ видеонаблюдения представляют собой довольно мощные ПК уровня графический станций со специальным клиентским ПО для подключения к VMS и возможностью вывода множества картинок на большие экраны.

За основу возьмем поток с одной IP-камеры по протоколам ONVIF (открытый стандарт взаимодействия IP-камер и VMS), с разрешением Full-HD (1920x1080), базовым кодеком H.264 и частотой 25 кадров в секунду, при условии высокой активности в кадре. Согласно онлайн-калькулятору ITV|AxxonSoft, одного из лидеров рынка VMS, такой видеопоток генерирует трафик 6,86 Мбит/с.

Вычислительные ресурсы, необходимые для обработки 100 видео-потоков с запасом могут быть обеспечены 4х-ядерным процессором Intel Xeon E3-1225 V3. По текущим меркам проц довольно слабый, на ОЗУ достаточно выделить 8-16ГБ. В итоге в плане мощности можем обойтись недорогим 1U серваком или даже хорошим настольным ПК. Однако с хранилищем под архив видеозаписей дела обстоят сложнее.

Для хранения видеоархива глубиной 1 месяц (стандартное требование) на 100 потоков при условии круглосуточной записи потребуется хранилище с полезной ёмкостью порядка 212ТБ, что можно подтвердить чудовищно сложными расчетами:

(6,86Мбит/с * 3600с * 24ч * 30д *100камер) / (8*1024*1024) = 211,97 ТБ, поскольку 1ТБ = 8*1024*1024 Мбит

Такой объем хранилища достигается за счет использования большого количества дисков высокой ёмкости (4-6-8-10 ТБ). Они могут использоваться независимо, каждый сам по себе, тогда VMS будет писать на них данные последовательно либо распределять их по всем дискам сразу, в зависимости от производителя. Минусы такого подхода:

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


Использование RAID-массивов


Решение проблемы — объединение дисков в RAID-массивы (RAID-группы). Для локальных и напрямую подключенных к серверам дисков — с помощью выделенных аппаратных RAID-контроллеров.

Технология RAID имеет несколько уровней (методов реализации), основные из них: 0, 1, 10, 5, 6, 50, 60. RAID-0 — страйпинг, данные параллельно пишутся на все диски массива. RAID-1 и RAID-10 — зеркалирование, запись данных дублируется на пары дисков. Уровни 5, 6, 50, 60 – контроль четности, осуществляют вычисление контрольных суммы, которые распределяются по всем дискам при этом утилизируют эквивалент ёмкости одного или двух дисков массива (дисковой группы).

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

RAID-1 — не подходит поскольку, поскольку рассчитан только на 2 диска.

RAID-10 (RAID-0 из множества зеркальных пар RAID-1) — не подходит, поскольку накладные расходы слишком велики, из общей сырой ёмкости полезной будет только половина. На последовательных операциях будет уступать по скорости записи уровням 5, 6, 50, 60.

RAID-5 и RAID-50 (RAID-0 из нескольких одинаковых групп RAID-5) — имеют чуть меньше накладных расходов, чем RAID-6 и RAID-60 (один диск на избыточность в дисковой группе вместо двух) и работают быстрее, но позволяют пережить отказ только одного диска. В случае перестроения таких массивов нагрузка на них многократно возрастает и вероятность выхода еще одного диска резко повышается, это особенно актуально для видеонаблюдения, где используются диски больших объемов, которые, соответственно, и перестраиваются дольше. Если до завершения перестроения вылетит ещё один диск, то хана данным на всём массиве, они будут потеряны. Поэтому использовать RAID-5 и RAID-50 для видеонаблюдения нежелательно.


Для видеонаблюдения оптимальными являются уровни 6 и 60 (RAID-0 из нескольких одинаковых групп RAID-6), поскольку они дают максимальную надежность и позволяют пережить одновременный отказ любых двух дисков.


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

Для видеонаблюдения данные уровни RAID особенно актуальны, поскольку показывают отличную производительность на последовательном доступе, характерном для видеопотока. В такой ситуации RAID-6 или RAID-60 предпочтительнее RAID-10 поскольку:

  • скорость последовательно записи выше — в RAID-6/60 больше полезных шпинделей, чем в RAID-10;
  • накладных расходов меньше — всего два диска под избыточность на всю дисковую группу в RAID-6/60, вместо половины дисков в RAID-10;
  • отказоустойчивость выше — RAID-6/60 позволяет отработать одновременный отказ любых двух дисков, RAID-10 гарантирует сохранность данных при отказе только одного диска.

Следует отметить важный недостаток RAID-6 и RAID-60 по сравнению с RAID-10 – значительная просадка производительности в деградированном состоянии, когда вылетает один и тем более два диска, с RAID 5 и 50 ситуация та же. RAID-10 контрольные суммы не считает, что практически исключает просадку производительности. Однако, учитывая, что половина ёмкости в RAID-10 уходит под зеркало, для видеонаблюдения, в котором нужны очень большие объёмы, его применять не рационально. Если использовать производительные аппаратные RAID-контроллеры или СХД, правильно планировать массив и систему в целом, деградация массива RAID-6/60 не вызовет катастрофы, при этом ёмкость дисков будет использоваться эффективно.

Планирование хранилища видеосервера на 100 потоков


Возвращаемся из теоретического экскурса в RAID-технологии и вспоминаем, что нам нужен массив на 212ТБ. Для организации хранилища такого объема при условии использования RAID-6 или RAID-60 нам понадобится 26-30 HDD по 10ТБ:

  • 1 группа RAID-6 из 26 дисков: 24 диска — полезный объём, 2 диска — контрольные суммы;
  • 2 отдельные дисковые группы RAID-6 по 14 дисков или аналогичный RAID-60;
  • 3 отдельные дисковые группы RAID-6 по 10 дисков или аналогичный RAID-60.

Такое количество дисков можно разместить только в специальной стоечной серверной платформе 4U, либо использовать внешнюю дисковую полку в комплекте с 1U-сервером, на котором будет выполняться обработка потоков. В любом случае будет необходимо использование хорошего выделенного (не встроенного в материнку) аппаратного RAID-контроллера с поддержкой RAID-6/60, который сможет вытянуть такое количество дисков и обеспечить нормальную работу массива в случае деградации — отказа 1-2 дисков.

Требования к видеосерверу на 500 потоков


Рассмотрим требования к системе на 500 IP-камер. В этом случае нам потребуется два процессора Intel Xeon E5-2630 V3 (8 ядер по 2,4ГГц), а лучше два Intel Xeon E5-2680 V3 (12 ядер по 2,5ГГц). Стало быть, серверная платформа должна быть двух-процессорной и мы по-прежнему можем обойтись одним серваком.

Полезная ёмкость видео-архива в данном случае переваливает за 1ПБ, а если точно – составляет
1 059,84 ТБ, это 117 дисков по 10ТБ, для кратности и с запасом лучше взять 120 дисков. Накладные расходы на размещение контрольных сумм в RAID-массиве потребуют еще 10-20-30 таких дисков, например, 5-10-15 дисковых групп RAID-6/60 по 26-14-10 дисков. Такое количество дисков не войдет ни в одну стандартную серверную платформу (максимум 24-36 HDD 3,5’’ на сервер 4U), понадобятся внешние дисковые полки. В данном случае одним из вариантов решения будет 2х-сокетный сервер 1U и две 4U дисковые полки (90+60 HDD), подключенные каскадом. Правильный RAID-контроллер сможет вытянуть нужное нам количество дисков, двумя кабелями Mini-SAS HD подключаем его к первой корзине (дисковой полке), а вторую корзину двумя такими же кабелями цепляем к первой.



Распределение нагрузки и лирическое отступление


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

В плане вычислительной мощности и производительности дисковой подсистемы подход работает, один сервер всё вывозит. Значения в 100 и 500 потоков довольно условны, определяется особенностями проекта, сложностью нагрузки и выбранной VMS. На практике реальными цифрами скорее будут 50-100-200 потоков на сервер. Ведь если задача предполагает серьёзную видеоаналитику, либо осуществляется постоянный многопоточный просмотр данных из архива, мы можем упереться в производительность очень крутых процессоров и дисковой подсистемы уже на 50-100 потоках. Соответственно, если камер сотни и даже тысячи, необходимо разворачивать ферму (множество) видеосерверов, каждый из которых возьмет свою долю потоков: 50, 100 или 200 в зависимости от нагрузки и аппаратной конфигурации. Распределение нагрузки по множеству идентичных видеосерверов, каждый из которых хранит данные на дисках подключенных напрямую (DAS), для видеонаблюдения стандартная практика.
В более простых ситуациях, когда от системы требуется просто стабильная качественная запись видео без дополнительной нагрузки на аналитику, а просмотр из архива осуществляется по одной камере (время от времени, а можно и постоянно) — 500 IP-камер на сервер уже более реально. Если поставить 18-ядерные процы, несколько RAID-контроллеров и кучу дисковых корзин, то на один сервак теоретически можно повесить и 1000+ потоков. В принципе большие системы можно строить из нескольких серверов на 500+ камер, следуя указанной выше концепции набора DAS-серверов.

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

Необходимость резервирования


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

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

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

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

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

Подход с использованием СХД


Альтернативный подход, на наш взгляд более правильный, надежный и технологичный — разделение вычислительных ресурсов и ресурсов хранения. В таком случае мы делаем отказоустойчивый кластер из нескольких серверов 1-2U на которых устанавливается VMS и происходит обработка видеопотоков, а данные храним на одной или нескольких отказоустойчивых двух-контроллерных внешних системах хранения данных (СХД). Масштабировать эти два набора ресурсов можно независимо, увеличивая количество серверов кластера, производительность и дисковые ресурсы СХД.

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

Если СХД является единым решением, то все её элементы дублируются или обеспечивается их избыточность. Основным элементом СХД является контроллер (storage processor), он осуществляет обработку ввода/вывода, объединение дисков в RAID-группы и создание на них логических разделов или томов, которые предоставляются конечным устройствам (видеосерверам — узлам кластера), хранящим данные на СХД. Правильная СХД имеет два контроллера. В нормальном режиме оба контроллера делят нагрузку пополам, если один из них сдох (отказал), то второй без остановки автоматически возьмёт на себя всю нагрузку, это будет прозрачно и незаметно для конечных узлов (видеосерверов). RAID-группы в которые объединяются диски СХД позволяют пережить отказ одного или нескольких дисков. Сетевые интерфейсы и блоки питания дублируются. Это значит, что в СХД нет ни одной единой точки отказа, не дублируется в ней только пассивная печатная плата, которая теоретически сломаться не может. Вывести из строя такую СХД, можно только топором или ведром воды, а на этот случай можно «завести проездной» и для полного счастья реплицировать данные на вторую такую же СХД. Да дорого, но, если задача настолько критична, то никаких денег не жалко, главное, что такая техническая возможность есть.

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

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

Организация сети хранения данных


Подключение видеосерверов к СХД осуществляется по протоколам файлового (NAS, например, NFS или SMB) или блочного (SAN, например, iSCSI, FC, iSER) доступа и в идеале требует создание выделенной сети хранения данных. Для этого каждый видеосервер должен быть оборудован соответствующими физическими адаптерами, желательно выделенными и задублированными. Ядром сети хранения будет выступать пара выделенных коммутаторов, соединяющих множество видеосерверов с СХД. Физическое выделение сети хранения из остальных сетей передачи данных, использование для её организации отдельного оборудования с дублированием (коммутаторы и адаптеры) будет гарантировать её простоту и прозрачность, безопасность и изоляцию, заданную пропускную способность и отказоустойчивость.



В простейшем случае для организации сети хранения достаточно пары производительных коммутаторов 10GbE (Ethernet, 10Гбит/с) и пары выделенных портов 1-10GbE на каждый видеосервер, при этом в качестве транспорта можно использовать файловый NFS или блочный iSCSI. Теоретически в ситуациях требующих большей производительности (очень крупные проекты) могут понадобиться конвергентные адаптеры Ethernet или Infiniband (IB) с поддержкой RDMA (SRP, iSER, RoCE) и соответствующие коммутаторы, причем на серверах скорее всего с избытком хватит портов 10Гбит/с, а на коммутаторах и СХД понадобится не менее 40Гбит/с. Также может быть полезен старый добрый Fibre Chanel (FC, 16Гбит/с), если хватит пропускной способности.

Преимущества использования СХД для видеонаблюдения


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

  • Уход от необходимости организации и сопровождения локальных или DAS дисковых массивов на серверах. Практически все данные систем видеонаблюдения хранятся централизованно на СХД, локальные диски на серверах нужны только для создания загрузочных разделов с ОС и установленной VMS. Для их организации хватит пары небольших бюджетных носителей объединённых в RAID-1 на базе встроенного в материнку контроллера.
  • Для организации видеосерверов оптимальным вариантом платформы будет компактный и производительный 1U-сервер. Необходимость использования громоздких 2-4U серверных платформ или DAS-полок отпадает. Вместе с этим уходит необходимость установки дорогостоящих аппаратных RAID-контроллеров в каждый сервер.
  • Создание и сопровождение дисковых групп и томов, мониторинг и разграничение доступа к ним, вообще все операции, касаемые хранения данных, теперь осуществляются централизованно на СХД из единой консоли. Средства управления СХД значительно превосходят любой локальный дисковый контроллер с токи зрения гибкости, мощи и удобства.

И напоследок, неоспоримый аргумент в пользу использования СХД в серьёзных проектах для видеонаблюдения. Он работает независимо от количества VMS-серверов, даже в случае если кластер включает только два видеосервера — основной и резервный. СХД является общим хранилищем и всегда доступно всем узлам кластера видеонаблюдения. Поэтому при падении одного из основных узлов резервный узел подхватит все его видеопотоки и продолжит их писать в архив на тот же том, поскольку он находится на СХД. Фактически произойдет переезд сущности VMS-сервера с отказавшей основной железки на резервную со всеми настройками. Можно будет прозрачно работать с видеоархивом данного сервера на всё его глубину. Конечно такая возможность должна поддерживаться на уровне ПО видеонаблюдения (VMS).

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

Резюме


В этой статье мы постарались разобраться в особенностях организации ИТ-инфраструктуры и подсистемы хранения данных для видеонаблюдения. Рассмотрели преимущества и недостатки подходов использования серверов с локальными (DAS) хранилищами и СХД. Пришли к выводу, что для крупных проектов, не допускающих простоев, отказов и деградации функциональности, использование СХД для хранения видеоархивов является оптимальным решением, несмотря на некоторую сложность.
В следующей статье будут рассмотрены критерии выбора СХД для видеонаблюдения. На десерт — описание крупного проекта по видеонаблюдению на 2000 камер с реализацией хранилища на базе RAIDIX.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331370/


[Перевод] Российские студенты доминируют на олимпиадах по программированию и американские студенты этому не удивлены

Среда, 21 Июня 2017 г. 20:28 + в цитатник


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

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

Иверсон ныне старший научный сотрудник, преподает информатику в одной из высших школ Южной Дакоты (SDSMT), он также принимал участие в «Олимпийских играх по компьютерному программированию среди университетов мира».

«Это было ужасно», — сказал он. «По сути, я придумал метод, который выполнял задачи лучше, чем тот, которому меня учили и за это я был наказан».

По мнению Иверсона, этот опыт есть прекрасным примером проблемы с математикой и информатикой в Америке, эта проблема отчетливо дала о себе знать 24 мая, когда в Рапид-Сити состоялся 41-й ежегодный международный чемпионат мира по программированию среди университетов.

Примерно с 9:00 до 23:00, почти 400 лучших молодых программистов мира, состоящих из 133 команд, в каждой по три человека, из 44 стран, соревновались между собой. Каждая из присутствовавших команд уже проходила через региональные соревнования, в которых участвовало 46 381 студентов из 103 стран мира.

Приблизительно через 5 часов, стали известны результаты.

Первое место заняла российская команда из Санкт-Петербургского Национального Исследовательского Университета Информационных Технологий, решив 10 задач в кратчайшие сроки. Это четвертая победа российской школы с 2012 года.

Четыре другие команды из Варшавского Университета, Сеульского Национального Университета, Санкт-Петербургского Государственного Университета и Московского Физико-технического Института также решили 10 задач. В целом, российские и китайские команды заняли 9 из 14 высших позиций. Университет Центральной Флориды занял 13-е место, Массачусетский Технологический Институт занял 20-е место.

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

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

20-летний Мэтью Шалленкамп, младший научный сотрудник по информационным технологиям SDSMT и товарищ по команде Иверсона, сказал, что его первое знакомство с компьютерным программированием произошло, когда он наткнулся на учебник по программированию в библиотеке своей средней школы в Южной Дакоте.

«У нас действительно не было хороших обучающих программ по информатике», — сказал Шалленкамп.

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

Ларри Пайитт, профессор математики и информатики в школе технологий Южной Дакоты и тренер команды SDSMT, утверждает, что это не всегда так.

«Многие из этих программ были сокращены, тогда как в 80-х годах у меня было компьютерное программирование в старшей школе в течение двух лет и позже, когда я поступил в колледж, это стало для меня огромным преимуществом», — сказал Ларри, который занял третье место в ICPC World Finals в 1989 году.

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

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

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

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

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

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

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

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

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

«У нас пытаются отбить охоту к учебе, к поиску нового интересного способа сделать что то, к выяснению того, как использовать его эффективно, а затем применить на практике», — сказал он. «Я думаю, что если бы это поощрялось и вознаграждалось, ученикам было бы интересно учиться».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331364/


Метки:  

История разработки приложения для чтения статей Forbes

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

Хочу поделиться историей разработки своего приложения. Идея приложения возникла 1,5 года назад, начало разработки было положено в феврале 2017 года и завершено всё в июне 2017 года.


Идея


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

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


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

Разработка сайта


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

Эти три проблемы были решены вот так:
  1. Статьи скачиваются и парсятся на своем хостинге и хранятся в БД. В приложение отдаются в JSON формате.
  2. Из статьи убраны все лишние данные (реклама и прочий мусор), в БД хранится только название и текст статьи, ссылки на картинки, а также информация об авторе, категории и дате публикации статьи.
  3. При изменении разметки (у основного сайта Forbes) достаточно изменить скрипты для парсинга на своем хостинге, приложение при этом не сломается.

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

И в качестве дополнения сделал на сайте страницу с курсами валют на текущую дату. Фронтенд был написан с использованием фреймворка Yii 2.

Вообще статьи Forbes удобны для скачивания и парсинга в том плане, что:
  • Сам текст статьи почти не меняется. Бывают очень уж редкие случаи, когда статья меняется или дополняется.
  • У статей нет комментариев.

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

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

У каждой статьи Forbes есть ссылки к «рекомендованным статьям». В связи с этим был получен приятный бонус, что на каждую скачанную статью я получил еще ссылки на 10 других статей (которых у меня в БД нет), и сохранял ссылки на эти статьи. Далее при сохранении и парсинге следующей статьи опять получены еще 10 других статей и т.д. В итоге на сегодняшний день в БД имеется более 14000 статей, и надо сказать, что это видимо определенный предел для Forbes, потому что новых статей из списка «рекомендованных» почти не бывает.

По времени разработка и запуск сайта заняли период с февраля по апрель 2017 года. В результате получился вот такой сайт.
Скриншоты
image
image
image
image


Разработка приложения


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

Надо сказать, что сырое работоспособное приложение (просмотр и чтение статей) было сделано за пару недель. Всё остальное время заняло допиливание, исправление косяков и добавление функционала (поиск, шаринг и др.). Из косяков было то, что при запуске приложения, SplashScreen висел неприлично долго. Еще пришлось делать видимой вертикальную полосу прокрутки, которой почему-то не было «из коробки».

По времени разработка приложения заняла период с мая по июнь 2017 года. В июне Андроид-версия приложения была опубликована. Результатом стало вот такое приложение.
Скриншоты
image image image image image


Заключение


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

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

https://habrahabr.ru/post/331362/


Метки:  

Полезные функции Google Таблиц, которых нет в Excel

Среда, 21 Июня 2017 г. 20:00 + в цитатник
Cтатья написана в соавторстве с Ренатом Шагабутдиновым.

image

В этой статье речь пойдет о нескольких очень полезных функциях Google Таблиц, которых нет в Excel (SORT, объединение массивов, FILTER, IMPORTRANGE, IMAGE, GOOGLETRANSLATE, DETECTLANGUAGE)

Очень много букв, но есть разборы интересных кейсов, все примеры, кстати, можно рассмотреть поближе в Google Документе goo.gl/cOQAd9 (файл-> создать копию, чтобы скопировать файл себе на Google Диск и иметь возможность редактирования).


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

SORT


Поможет отсортировать диапазон данных по одному или нескольким столбцам и сразу вывести результат.

Синтаксис функции:
=SORT(сортируемые данные; столбец_для_сортировки; по_возрастанию; [столбец_для_сортировки_2, по_возрастанию_2; ...])

Пример на скриншоте ниже, мы ввели формулу только в ячейку D2 и сортируем данные по первому столбцу (вместо ИСТИНА/ЛОЖЬ можно вводить TRUE/FALSE).
(здесь и далее — примеры для российских региональных настроек таблицы, рег. настройки меняются в меню файл-> настройки таблицы)

image

Как в SORT добавить заголовки таблицы?
С помощью фигурных скобок {} создаем массив из двух элементов, шапки таблицы A1:B1 и функции SORT, элементы отделяем друг-от-друга с помощью точки с запятой.
image

Как объединить несколько диапазонов данных и отсортировать (и не только)?
Давайте рассмотрим, как можно объединять диапазоны для использования в функциях. Это касается не только SORT, этим приемом можно пользоваться в любых функциях, где это возможно, например в ВПР или ПОИСКПОЗ.
Кто читал предыдущий пример уже догадался, что делать: открываем фигурную скобку и собираем массивы для объединения, отделяя их друг-от-друга точкой с запятой и закрываем фигурную скобку.
image

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

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

image

Ну а теперь вернемся к горизонтальному массиву и вставим его в функцию SORT. Будем сортировать данные по первому столбцу, по убыванию.
image

Объединение можно использовать в любых функциях, главное — соблюдать одинаковое количество столбцов для вертикального или строк для горизонтального объединения.
Все разобранные примеры можно рассмотреть поближе в Google Документе goo.gl/cOQAd9.

FILTER


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

Синтаксис функции:
FILTER(диапазон; условие_1; [условие_2; ...])

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

Введем в ячейку E3 вот такую формулу:
=FILTER(A3:C7;B3:B7=«Наталья Чистякова»)

Обратите внимание, синтаксис немного отличается от привычных формул, вроде СУММЕСЛИН, там диапазон условия и само условие отделялось бы при помощи точки с запятой.
image

Введенная в одну ячейку формула возвращает нам массив из 9-ти ячеек с данными, но после примеров с функцией SORT мы этому уже не удивляемся.
Помимо знака равенства (=) в условиях можно использовать еще >, >=, <> (не равно), <, <=. Для текстовых условий подходят только = и <>, а для чисел или дат можно использовать все эти знаки.

Два условия и работа с датой
Давайте усложним формулу и добавим в нее еще одно условие, по дате продаж, оставим все продажи начиная с 01.02.17

Так будет выглядеть формула, если вводить аргументы условия сразу в нее, обратите внимание на конвертацию текстовой записи даты при помощи ДАТАЗНАЧ:
=FILTER(A3:C7;B3:B7=«Наталья Чистякова»;A3:A7>=ДАТАЗНАЧ(«01.02.17»))

Или вот так, если ссылаться на ячейки с аргументами:
=FILTER(A3:C7;B3:B7=I6;A3:A7>=J6)

image

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

Выпадающий список. Наш график будет меняться в зависимости от выбранного сотрудника в выпадающем списке, список делаем так:
  • выделяем ячейку Е2;
  • меню Данные -> Проверка данных;
  • правила: Значение из диапазона и в диапазоне выбираем столбец с сотрудниками из исходных данных, не переживайте, что фамилии повторяются, в выпадающем списке останутся лишь уникальные значения;

image

Нажимаем «Сохранить» и получаем выпадающий список в выбранной ячейке:
image

Ячейка с выпадающим список станет условием для формулы FILTER, напишем ее.
=FILTER(C3:C7;B3:B7=E2)

И вставим эту формулу в функцию SPARKLINE, которая на основе полученных данных будет рисовать в ячейке график.
=sparkline(FILTER(C3:C7;B3:B7=E2))

image

Так это выглядит в динамике:
gif

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


IMPORTRANGE


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

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

Эта формула позволяет получить копию диапазона из другой Google Таблицы. Форматирование при этом не переносится — только данные (как быть с форматированием — мы расскажем чуть ниже).

Синтаксис формулы следующий:
IMPORTRANGE(spreadsheet key; range string)
IMPORTRANGE(ключ; диапазон)

spreadsheet_key (ключ) — последовательность символов атрибута «key=» (ключа) в ссылке на таблицу (после «spreadsheets/…/»).

Пример формулы с ключом:
=IMPORTRANGE(«abcd123abcd123»; «sheet1!A1:C10»)

Вместо ключа таблицы вы можете использовать полную ссылку на документ:
=IMPORTRANGE(«docs.google.com/a/company_site.ru/spreadsheet/ccc?key=0A601pBdE1zIzHRxcGZFVT3hyVyWc»; «Лист1!A1:CM500»)

В вашем файле будет отображаться диапазон A1:CM500 с Листа1 из файла, который находится по соответствующей ссылке.


Если в исходном файле может меняться количество столбцов или строк, вводите во втором аргументе функции открытый диапазон (см. также подраздел «Диапазоны вида A2:A»), например:
Лист1!A1:CM (если будут добавляться строки)
Лист1!A1:1000 (если будут добавляться столбцы)


! Имейте в виду, что если вы загружаете открытый диапазон (например, A1:D), то вы не сможете вставить никакие данные вручную в столбцы A:D в файле, где находится формула IMPORTRANGE (то есть в конечном, куда загружаются данные). Они как бы “зарезервируются” под весь открытый диапазон — ведь его размерность неизвестна заранее.

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

Так, если в ячейку A1 вы введете ссылку на документ (без кавычек), из которого нужно загрузить данные, а в ячейку B1 — ссылку на лист и диапазон (тоже без кавычек), то импортировать данные можно будет с помощью следующей формулы:

=IMPORTRANGE(A1;B1)



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

Импорт форматирования из исходной таблицы


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

После нажатия кнопки Копировать в… выберите книгу, в которую будете импортировать данные. Обычно нужная таблица есть на вкладке Недавние (если вы действительно недавно работали с ней).

После копирования листа выделите все данные (нажав на левый верхний угол):
image

И нажмите Delete. Все данные исчезнут, а форматирование останется. Теперь можно ввести функцию IMPORTRANGE и получить полное соответствие исходного листа — как в части данных, так и в части формата:
image

IMPORTRANGE как аргумент другой функции
IMPORTRANGE может быть аргументом другой функции, если диапазон, который вы импортируете, подходит на эту роль.
Рассмотрим простой пример — среднее значение по продажам из диапазона, находящегося в другом документе.
Это исходный документ. Пусть данные будут добавляться и нам нужно среднее по продажам 2016 (то есть от ячейки D2 и до упора вниз)
image

Сначала импортируем этот диапазон:
IMPORTRANGE(«docs.google.com/spreadsheets/d/16aKQAIGtLKwQFjWyUGraKAVPQe6cJucYAHoIc-AEEc4»;«Книги!D2:D»)

А потом используем это как аргумент функции СРЗНАЧ (AVERAGE):
=СРЗНАЧ(IMPORTRANGE(«docs.google.com/spreadsheets/d/16aKQAIGtLKwQFjWyUGraKAVPQe6cJucYAHoIc-AEEc4»;«Книги!D2:D»))
=AVERAGE(IMPORTRANGE(«docs.google.com/spreadsheets/d/16aKQAIGtLKwQFjWyUGraKAVPQe6cJucYAHoIc-AEEc4»;«Книги!D2:D»))

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

IMAGE: добавляем изображения в ячейки


Функция IMAGE позволяет добавлять в ячейки Google Таблиц изображения.

У функции следующий синтаксис:
IMAGE(URL, [mode], [height], [width])

URL – единственный обязательный аргумент. Это ссылка на изображение. Ссылку можно указать напрямую в формуле, взяв в кавычки:
=IMAGE(“http://shagabutdinov.ru/wp-content/uploads/2015/12/Run-or-Die.jpg”)

image

Или же поставить ссылку на ячейку, в которой ссылка хранится:
= IMAGE(B1)

image

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

На практике бывает, что ссылки на изображения хранятся на отдельном листе, и вы достаете их с помощью функции ВПР (VLOOKUP) или как-то иначе.
image

Аргумент mode может принимать четыре значения (если его пропустить, по умолчанию будет первое):
  1. изображение растягивается до размеров ячейки с сохранением соотношения сторон;
  2. изображение растягивается без сохранения соотношения сторон, целиком заполняя
  3. изображение вставляется с оригинальным размером;
  4. вы указываете размеры изображения в третьем и четвертом аргументам функции [height] и [width]. [height], [width], соответственно, нужны только при значении аргумента mode = 4. Они задаются в пикселях.

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

Четвертый режим может быть удобен, если вам нужно подбирать точный размер изображения в пикселях, меняя параметры height (высота) и width (ширина). Картинка будет сразу обновляться.
Обратите внимание, что при всех режимах, кроме второго, могут оставаться незаполненные области в ячейке, и их можно залить цветом:
image

GOOGLETRANSLATE и DETECTLANGUAGE: переводим текст в ячейках


В Google Таблицах есть занятная функция GOOGLETRANSLATE, позволяющая переводить текст прямо в ячейках:


Синтаксис функции следующий:
GOOGLETRANSLATE (text,[source_language], [target_language])

text – это текст, который нужно переводить. Можно взять текст в кавычки и записать прямо в формулу, но удобнее сослаться на ячейку, в которой текст записан.
[source_language] – язык, с которого мы переводим;
[target_language] – язык, на который мы переводим.


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


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


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

Евгений Намоконов и Ренат Шагабутдинов, а еще мы ведем канал в телеграмме, где разбираем разные кейсы с Google Таблицами, если вам интересно — заглядывайте в гости, ссылку можно найти в моем профиле.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331360/


Метки:  

Настройка веб-интерфейса TheOnionBox для мониторинга relay-ноды Tor'а

Среда, 21 Июня 2017 г. 19:37 + в цитатник

The Onion Box — опенсорсный веб-интерфейс для мониторинга relay-нод, написанный на питоне.


Он умеет отображать показатели загрузки диска, памяти, сети, а также статистику ноды, в том числе, получаемую через Onionoo (протокол для мониторинга статуса в сети Tor), и строить красивые графики.


Выглядит как-то так:


pic-1


Под катом описание настройки.


Ещё пара примеров интерфейса

pic-2
pic-3


Сравнивая Tor-ноду и I2P-ноду (i2pd), в дружелюбности к неискушённому пользователю, на мой взгляд, Tor проигрывает, по крайней мере с точки зрения quick start. У i2pd есть хотя минимальный интерфейс для мониторинга и выполнения простейших команд, в то время как у Tor-ноды никакого интерфейса нет.


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


Настройка Tor


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


Для установки пароля получим его хеш. Переходим в папку с бинарником Tor'а, открываем cmd и выполняем:


tor --hash-password SUPER-PASSWORD > hash.txt

В той же папке должен появиться файл hast.txt с примерно таким содержимым:


Jun 21 18:26:33.023 [notice] Tor v0.2.4.24 (git-a8a38e5dd1fbb67a) running on Windows 7 with Libevent 2.0.21-stable and OpenSSL 1.0.1i.
Jun 21 18:26:33.025 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
16:5DC1FEEC60D990AB6081B9319FD29D850CBE07545B94055C1B5490EA80

Из этого нам понадобится последняя строчка, представляющая собой хеш нашего пароля: 16:5DC1FEEC60D990AB6081B9319FD29D850CBE07545B94055C1B5490EA80.


Затем открываем torrc-файл (обычно он лежит в /usr/local/etc/torrc или %appData%\Roaming\tor\torrc) и дописываем следующие строчки:


СontrolPort 9051
HashedControlPassword 16:5DC1FEEC60D990AB6081B9319FD29D850CBE07545B94055C1B5490EA80
CookieAuthentication 1

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


Установка и настройка OnionBox'а


Установка питона

Для запуска OnionBox'а нужен питон. Любая версия (работает как с 2.7, так и с 3.х).
Под линуксом всё тривиально, а под Windows после установки нужно сделать logoff-login (или выполнить скрипт), чтобы изменения в PATH применились.


Проверим, что питон готов, открываем cmd и пишем: python -V
Должна отобразиться установленная версия.


Если не сработало, нужно добавить в PATH путь, куда установлен питон, например, C:\Python3.6 и C:\Python3.6\Scripts.


Скачиваем последний релиз с гитхаба, на момент написания статьи это 3.2.1. Распаковываем в папку, например, C:\Tor\UI.


Если вы установили в конфиге ноды Tor'а другой порт управления (не 9051), откройте конфиг (config\theonionbox.cfg), найти там строчку tor_control_port = 9051 и напишите тот же порт, что и в конфиге Tor'а.


После этого нужно установить необходимые зависимости для OnionBox'а.


Открываем cmd и первым делом ставим pip (пакетный менеджер для питона), если он ещё не установлен.


Установка pip

Далее ставим необходимые модули:


pip install psutil stem bottle apscheduler requests

Для питона 2.7 нужно дополнительно поставить модуль configparser.


И запускаем сам сервис:


python theonionbox.py

Если всё в порядке, можно открыть в браузере админку (http://127.0.0.1:8080) и наслаждаться.


Tips & Tricks


Также, для удобства, можно демонизировать этот сервис. Под Windows, в частности, это можно сделать через NSSM. Для этого переходим в папку с бинарником nssm, запускаем cmd, выполняем:


nssm install TorUI "path-to-python\python.exe" "path-to-onionbox\theonionbox.py"

Запускаем сервис и готово!


Ссылки


Хабрастатья по настройке relay-ноды
Официальный ман Tor'а
TheOnionBox на гитхабе

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

https://habrahabr.ru/post/331358/


Метки:  

Магия SSH

Среда, 21 Июня 2017 г. 18:03 + в цитатник
С SSH многие знакомы давно, но, как и я, не все подозревают о том, какие возможности таятся за этими магическими тремя буквами. Хотел бы поделиться своим небольшим опытом использования SSH для решения различных административных задач.

Оглавление:
1) Local TCP forwarding
2) Remote TCP forwarding
3) TCP forwarding chain через несколько узлов
4) TCP forwarding ssh-соединения
5) SSH VPN Tunnel
6) Коротко о беспарольном доступе
7) Спасибо (ссылки)


1) Local TCP forwarding


Начнем с простого — local TCP forwarding:

image

Имеем удаленный сервер «host2» с неким приложением, допустим, PostgreSQL server, которое принимает TCP-соединения на порту 5432. При этом вполне логично, что на этом сервере стоит файрвол, который прямых соединений извне на порт 5432 не разрешает, но при этом есть доступ по SSH (по-умолчанию порт 22, рекомендую его изменить). Требуется подключиться с нашего рабочего места «host1» клиентским приложением к серверу PostgreSQL на «host2».

Для этого на «host1» в консоли набираем:
host1# ssh -L 9999:localhost:5432 host2
Теперь на «host1» мы можем соединяться с PostgreSQL сервером через локальный порт 9999:
host1# psql -h localhost -p 9999 -U postgres
Если на «host1» Windows
Например, в PuTTy это делается так:
Идем по дереву настроек: Connection -> SSH -> Tunnels.
Далее в поле «Source port» вбиваем 9999, в «Destination» — localhost:5432, и нажимаем Add.
Не забываем после этого сохранить настройки сессии, если требуется.
image

Как это работает
После успешного подключения к SSH-серверу на «host2», на «host1» SSH-клиент начинает слушать порт 9999. При подключении к порту 9999 на «host1», SSH-сервер на «host2» устанавливает соединение с localhost (коим и является для себя самого «host2») на порт 5432 и передает по этому соединению данные, принятые ssh-клиентом на «host1» на порт 9999.
ВАЖНО! Все указанные на схемах стрелками соединения являются отдельными TCP-соединениями (сессиями).

Настройка SSH-сервера
Port forwarding, как правило, уже включен в настройках sshd по-умолчанию.
/etc/ssh/sshd_config:
AllowTcpForwarding yes


Мы также можем соединяться с приложением не на самом «host2», а на любой доступной ему машине:

image

Для этого при пробросе портов вместо «localhost» указываем имя хоста, например «host3»:
host1# ssh -L 9999:host3:5432 host2
Тут важно заметить, что «host3» должен быть известен (если это имя, а не IP-адрес) и доступен для машины «host2».

Также можно через «host1» предоставить доступ любому другому узлу (назовем его «host1A») к сервису на «host3»:

image

Для этого нужно вставить в команду соединения ssh IP-адрес интерфейса, на котором будет поднят локальный порт 9999:
ssh -L 0.0.0.0:9999:host3:5432 host2
В данном примере порт 9999 будет открыт на всех доступных на «host1» IPv4 интерфейсах.

2) Remote TCP forwarding


Но что делать, если, например, «host2» не имеет белого IP-адреса, находится за NAT или вообще все входящие соединения к нему закрыты? Или, например, на «host2» стоит Windows и нет возможности поставить SSH-сервер?

Для этого случая есть Remote TCP forwarding:

image

Теперь нужно устанавливать ssh-соединение в обратном направлении — от «host2» к «host1». Т.е. наша административная рабочая станция будет SSH-сервером и будет доступна по SSH с «host2», а на «host2» нужно будет выполнить подключение SSH-клиентом:
ssh -R 9999:localhost:5432 host1

Если на «host2» Windows
Например, в PuTTy это делается так:
Идем по дереву настроек: Connection -> SSH -> Tunnels.
Далее в поле «Source port» вбиваем 9999, в «Destination» — localhost:5432, а ниже выбираем «Remote», и нажимаем Add.
Не забываем после этого сохранить настройки сессии, если требуется.
image

Как это работает
После успешного подключения, на «host1» SSH-сервер начинает слушать порт 9999. При подключении к порту 9999 на «host1», SSH-клиент на «host2» устанавливает соединение с localhost (коим и является для себя самого «host2») на порт 5432 и передает по этому соединению данные, принятые ssh-сервером на «host1» на порт 9999.

Также у вас возникнут дополнительные сложности с обеспечением безопасности на «host1», если вы не доверяете узлу «host2». Однако это выходит за рамки данной статьи.
И, конечно, вы каким-то образом (сами или с посторонней помощью) должны инициировать ssh-соединение со стороны «host2» вводом приведенной выше команды, а «host1» должен иметь белый IP-адрес и открытый порт SSH.

После установки ssh-соединения все работает аналогично предыдущей главе.

3) TCP forwarding chain через несколько узлов


В закрытых сетях часто бывает, что нужный нам узел напрямую недоступен. Т.е. мы можем зайти на нужный хост только по цепочке, например host1 -> host2 -> host3 -> host4:
host1# ssh host2
host2# ssh host3
host3# ssh host4
host4# echo hello host4


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

В таком случае мы также можем делать TCP forwarding по цепочке:

image

Здесь порты 9991, 9992, 9993 выбраны для наглядности, на практике можно использовать один и тот же порт (например, 9999), если он свободен на всех узлах.

Итого нужно выполнить следующую цепочку команд:
host1# ssh -L 9991:localhost:9992 host2
host2# ssh -L 9992:localhost:9993 host3
host3# ssh -L 9993:localhost:5432 host4


Как это работает
После успешного выполнения перечисленных выше команд, на узлах выполняется следующее:
  • на «host1»: открывается порт 9991, при подключении к которому данные перенаправляются по ssh-соединению на порт 9992 на «host2»;
  • на «host2»: открывается порт 9992, при подключении к которому данные перенаправляются по ssh-соединению на порт 9993 на «host3»;
  • на «host3»: открывается порт 9993, при подключении к которому данные перенаправляются по ssh-соединению на порт 5432 на «host4»;

Таким образом, при соединении на порт 9991 на «host1», данные перенаправляются по цепочке на «host4» на порт 5432.
ВАЖНО! Все указанные на схемах стрелками соединения являются отдельными TCP-соединениями (сессиями).


4) TCP forwarding ssh-соединения


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

image

host1# ssh -L 2222:localhost:2222 host2
host2# ssh -L 2222:host4:22 host3


Таким образом, на порту 2222 на «host1» у нас теперь есть форвардинг на порт SSH (22) на «host4». Можем соединиться:

host1# ssh -p 2222 localhost
host4# echo hello host4


Казалось бы, зачем это нужно? Например, вот зачем:

# копируем файл на host4
host1# scp -P 2222 /local/path/to/some/file localhost:/path/on/host4
# копируем файл с host4
host1# scp -P 2222 localhost:/path/on/host4 /local/path/to/some/file
# делаем еще один замечательный TCP forwarding на host4
host1# ssh -p 2222 -L 9999:localhost:5432 localhost
host1# psql -h localhost -p 9999 -U postgres
# обратите внимание, что порт для команды ssh задается ключем -p в нижнем регистре,
# а для команды scp -P в верхнем регистре


Ну и вообще, здорово что теперь «host4» так близко :)

Вывод: можно делать TCP forwarding большого уровня вложенности.

Замечания про RSA fingerprint
В некоторых случаях scp не отработает, пока не зайдете сначала через ssh -p 2222 localhost и не примете RSA fingerprint удаленного сервера.
Если пользуетесь одним и тем же портом (2222) для доступа к разным удаленным серверам, то будут ошибки RSA fingerprint, который остался от предыдущего сервера. Его нужно будет удалить из ~/.ssh/known_hosts.


5) SSH VPN Tunnel


TCP port forwarding — это отличная возможность. Но что если нам нужно больше? Доступ по UDP, доступ к множеству портов и хостов, доступ к динамическим портам? Ответ очевиден — VPN. И всемогущий SSH начиная с версии 4.3 и здесь придет нам на помощь.

Забегая вперед скажу: этот функционал SSH хорошо работает если вам нужно временное решение для каких-то административных задач. Для построения постоянных VPN этот вариант далеко не самый подходящий, т. к. он предполагает TCP-over-TCP, что плохо скажется на скорости соединения.
Еще про TCP forwarding
А вот TCP port forwarding с помощью SSH, если его достаточно, во многих случаях выиграет по производительности у VPN, т. к. при TCP port forwarding передаются только данные приложения, а не исходные пакеты целиком вместе с заголовками, см. ссылку: http://blog.backslasher.net/ssh-openvpn-tunneling.html


Настройка SSH-сервера:
PermitTunnel в настройках sshd по-умолчанию выключен, его нужно включить в /etc/ssh/sshd_config:
PermitTunnel yes
или
PermitTunnel point-to-point

ВАЖНО: для поднятия нового сетевого интерфейса туннеля и на ssh-клиенте, и на ssh-сервере необходимы права суперпользователя. Можно долго спорить о том, насколько это небезопасно, но в большинстве случаев на ssh-сервере достаточно настройки:
PermitRootLogin without-password
Таким образом вы запрещаете вход root по паролю, а разрешаете только другими средствами, например, по ключу RSA, что гораздо безопаснее.

Перезапускаем sshd:
sudo service sshd restart # centos
или
/etc/init.d/ssh restart # (debian/ubuntu)

Туннель поднимается при использовании магического ключа -w:

host1# sudo ssh -w 5:5 root@host2

Где 5:5 — номер интерфейса на локальной машине и на удаленной соответственно.
Здесь вас может смутить, что ifconfig не выдаст в списке интерфейса «tun5». Это потому что он в состоянии «down», а вот если вызвать «ifconfig -a» или «ifconfig tun5», то интерфейс будет виден:

host1# ifconfig tun5
tun5 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
POINTOPOINT NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)


Назначаем интерфейсам IP-адреса и поднимаем их:
host1# sudo ifconfig tun5 192.168.150.101/24 pointopoint 192.168.150.102
host2# sudo ifconfig tun5 192.168.150.102/24 pointopoint 192.168.150.101


Если есть файрвол, не забываем разрешить соединения с интерфейса tun5:
host1# # сохраняем исходные правила файрвола
host1# sudo iptables-save > /tmp/iptables.rules.orig
host1# sudo iptables -I INPUT 1 -i tun5 -j ACCEPT
host2# # сохраняем исходные правила файрвола
host2# sudo iptables-save > /tmp/iptables.rules.orig
host2# sudo iptables -I INPUT 1 -i tun5 -j ACCEPT

На host1 это делать необязательно, здесь это сделано лишь для того чтобы ping работал в обе стороны.

Наслаждаемся пингом:
host1# ping 192.168.150.102
host2# ping 192.168.150.101


Если рассмотреть более ранний пример с PostgreSQL, то теперь схема будет такая:

image

А команда для подключения к серверу PostgreSQL будет выглядеть так:

host1# psql -h 192.168.150.102 -U postgres

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

host2# # разрешаем IP forwarding
host2# sudo sysctl -w net.ipv4.ip_forward=1
host2# # разрешаем IP forwarding с host1
host2# sudo iptables -I FORWARD 1 -s 192.168.150.101 -j ACCEPT
host2# # разрешаем IP forwarding на host1
host2# sudo iptables -I FORWARD 1 -d 192.168.150.101 -j ACCEPT
host2# # маскируем IP адрес host1
host2# sudo iptables -t nat -A POSTROUTING -s 192.168.150.101 -j MASQUERADE


host1# # Предположим, у host2 есть доступ к сети 192.168.2.x, куда нам нужно попасть с host1
host1# # Прописываем host2 как шлюз в сеть 192.168.2.x
host1# sudo ip route add 192.168.2.0/24 via 192.168.150.2
host1# # Наслаждаемся доступом в сеть с host1
host1# ping 192.168.2.1


После окончания работы не забываем вернуть net.ipv4.ip_forward и файрвол в исходное состояние.
host1# sudo iptables-restore < /tmp/iptables.rules.orig
host2# sudo iptables-restore < /tmp/iptables.rules.orig


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

Допустим, есть доступ по ssh с вашей рабочей машины host1 на сервер host2, с него — на host3, а уже оттуда — на нужный вам host4. Тогда делаем TCP forwarding для ssh (если с host1 вы сразу можете соединиться с host4, пропустите этот шаг):

host1# ssh -L 2222:localhost:2222 host2
host2# ssh -L 2222:host4:22 host3


Далее, соединяемся с host4 и поднимаем интерфейс tun5:

host1# sudo ssh -p 2222 -w 5:5 root@localhost
host1# # или если host4 доступен сразу: sudo ssh -w 5:5 root@host4
host1# sudo ifconfig tun5 192.168.150.101/24 pointopoint 192.168.150.102
host4# sudo ifconfig tun5 192.168.150.102/24 pointopoint 192.168.150.101


Смотрим таблицу маршрутизации на host4, допустим видим следующее:
host4# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 tun5
192.168.56.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
0.0.0.0 192.168.56.254 0.0.0.0 UG 0 0 0 eth0


ВАЖНО! Далее нам скорее всего захочется сделать маршрутом по-умолчанию интерфейс tun5 со шлюзом 192.168.150.101, через который будет доступен Интернет. Поэтому на данном этапе важно точно знать, какие маршруты нужно дописать, чтобы заменить маршрут по-умолчанию. Это важно, поскольку довольно часто маршруты на отдельные сети не прописывают отдельно, а просто задают маршрут по-умолчанию (0.0.0.0/0) со шлюзом, через который и идет весь межсетевой трафик. Более того, вполне вероятно что ваше ssh-соединение с сервером также использует исходный шлюз по-умолчанию.

Для простоты в данном примере предположим, что никаких маршрутов кроме 192.168.56.0/24 серверу для нормального функционирования не нужно и что предыдущий ssh-хост host3 имеет IP-адрес из этой же сети.

Запоминаем и записываем куда-нибудь исходную маршрутную таблицу со шлюзом по-умолчанию:
host4# route -n > routes.orig

Настраиваем наш host1 для работы в качестве шлюза в Интернет для host4:

host1# # разрешаем IP forwarding
host1# sudo sysctl -w net.ipv4.ip_forward=1
host1# # сохраняем исходные правила файрвола
host1# sudo iptables-save > /tmp/iptables.rules.orig
host1# # разрешаем IP forwarding с host4
host1# sudo iptables -I FORWARD 1 -s 192.168.150.102 -j ACCEPT
host1# # разрешаем IP forwarding на host4
host1# sudo iptables -I FORWARD 1 -d 192.168.150.102 -j ACCEPT
host1# # маскируем IP адрес host4
host1# sudo iptables -t nat -A POSTROUTING -s 192.168.150.102 -j MASQUERADE


Изменяем маршрут по-умолчанию на host4 (ОСТОРОЖНО, см. предупреждение выше!):

host4# sudo ip route replace default via 192.168.150.101
host4# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 tun5
192.168.56.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
0.0.0.0 192.168.150.101 0.0.0.0 UG 0 0 0 tun5


Проверяем, что есть Интернет:

host4# ping 8.8.8.8

Отлично. Осталось настроить DNS. Есть множество способов это сделать, проще всего отредактировать файл /etc/resolv.conf и добавить туда строчки:

nameserver 8.8.8.8
nameserver 8.8.4.4


После этого Интернет должен быть полностью доступен:

host4# ping ya.ru

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

host1# # восстанавливаем правила файрвола на host1
host1# sudo iptables-restore < /tmp/iptables.rules.orig
host1# # не забудьте восстановить также значение net.ipv4.ip_forward


host2# # восстановите маршрут по-умолчанию на host4:
host2# sudo ip route replace default via 192.168.56.254
host2# # и уберите добавленные ранее DNS-сервера из /etc/resolv.conf



6) Коротко о беспарольном доступе


Думаю, все уже знают что авторизация по паролю это не про нас. Но на всякий случай впихну сюда краткую инструкцию по настройке аутентификации по ключу RSA:

1. На клиентских машинах генерируем пользователю свой ключ RSA:
client1# ssh-keygen -t rsa
По-умолчанию приватный ключ сохраняется в ~/.ssh/id_rsa, а открытый — в ~/.ssh/id_rsa.pub. Приватный ключ храните как зеницу ока и никому не давайте, никуда не копируйте.
При создании ключа можно задать пароль (passphrase), которым ключ будет зашифрован.

2. Клиентские открытые ключи нужно сохранить на ssh-сервере в файле ~/.ssh/authorized_keys (~ это домашняя директория того пользователя, которым будете логиниться), каждый на отдельной строке. Для того чтобы это не делать вручную, на каждом клиенте можно воспользоваться командой:
ssh-copy-id user@sshserver
Где user — имя пользователя на сервере, sshserver — имя или IP-адрес ssh-сервера.

3. Проверьте, что можете зайти на сервер по ключу, без ввода пароля (не путать с passphrase):
ssh user@sshserver
Рекомендую не закрывать хотя бы одну активную ssh-сессию с сервером до тех пор, пока окончательно не закончите настройку и не убедитесь что все работает.

4. Отключите на SSH-сервере возможность входа по паролю в файле /etc/ssh/sshd_config:
PasswordAuthentication no
Возможность входа по открытому ключу обычно уже включена по-умолчанию:
PubkeyAuthentication yes
Я обычно также отключаю две следующие опции:
GSSAPIAuthentication no
UseDNS no

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

5. Перезапустите sshd:
service sshd restart>
или
/etc/init.d/ssh restart


7) Спасибо (ссылки)


help.ubuntu.com/community/SSH_VPN
habrahabr.ru/post/87197
blog.backslasher.net/ssh-openvpn-tunneling.html
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331348/


Метки:  

Как грамотно развернуть Wi-Fi в отеле: типовые вопросы и решения

Среда, 21 Июня 2017 г. 17:39 + в цитатник
Интернет теперь — настолько важная часть жизни человека, что отсутствие доступа к сети в ресторане или гостинице вполне может стать поводом для отказа от услуг соответствующих организаций. Поговорим об особенностях развертывания Wi-Fi-сетей в здании отелей, важных параметрах, а также об аппаратной составляющей.
 



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

Планирование


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


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

Выбор оборудования


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

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

При выборе новых устройств нельзя не учитывать специфику гостиничного «гостевого» доступа — как с технической, так и с эстетической точки зрения.  
 
Хорошая точка доступа для гостиниц должна быть двухдиапазонной. Устройство должно обеспечивать балансировку нагрузки, в том числе за счет функции Band Steering, позволяющей переключать в диапазон 5 ГГц клиентов с поддерживающими его устройствами, освобождая полосу в диапазоне 2,4 ГГц (для устройств, не поддерживающих второй диапазон).
 

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


Стоит отметить и технологию, уже ставшую обязательной в сетях уровня Enterprise: Airtime Fairness, обеспечивающую защиту от «медленного клиента», который теперь не сможет монополизировать ресурсы точки доступа и не ухудшит общую производительность сети.
 
Кроме того, точка должна вписываться в интерьер гостиницы. Конечно, ее можно убрать и за фальшпотолок, но это может сказаться на дальности распространения сигнала, поэтому рекомендуется все же оставлять устройства на виду.
 
Точки доступа, предназначенные для монтажа в номерах, часто выпускаются в виде обычных розеток, чтобы не выделяться. Точки доступа для коридоров и иных помещений выпускаются в различных корпусах, имеют функцию отключения сетевых индикаторов. Дополнительно они защищены от краж, например, с помощью замка кенсингтон.
 
Для минимизации числа проводов, подходящих к точкам доступа, в современных устройствах реализуется питание по стандарту PoE (Power over Ethernet).
 
Такие факторы, как легкость настройки, особенности доступа к устройству через web-интерфейс и прочее, учитываются во вторую очередь, ведь предполагается, что решение нужно настроить один раз, после чего оно будет функционировать без дополнительных вмешательств. Хотя у отелей бывают собственные дополнительные пожелания относительно мониторинга и настройки закупаемого оборудования.
 

Проектирование и затраты


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


Приблизительные затраты на оборудование для такой сети — около шести тыс. долларов США.
 
Наименование 
Описание 
Количество 
Стоимость за единицу, у.е. 
Общая цена, у.е. 
Шлюз 
 
 
 
TL-ER6020
SafeStream гигабитный VPN-маршрутизатор с 2мя WAN-портами
1
147
147
Коммутаторы 
 
 
 
T2600G-28TS
JetStream 24-портовый гигабитный управляемый коммутатор 2 уровня с 4 SFP-слотами
1
270
270
T1600G-28PS
JetStream 24-портовый гигабитный Smart коммутатор PoE+ с 4 SFP-слотами
2
400
800
Точки доступа
 
 
 
 
CAP1750
AC1750 Wi-Fi двухдиапазонная гигабитная потолочная точка доступа
30
153
4590
AC50
Wi-Fi контроллер точек доступа
1
48
48
Итого
 
 
 
5855

 

Программные компоненты


Вместе с оборудованием для предоставления беспроводного доступа нередко внедряется и удобная система авторизации, поскольку пароль, печатающийся на чеке или написанный на одной из страниц папки с приветственной информацией в номере, — это такой же пережиток прошлого, как медленное соединение или постоянные обрывы связи.
 
Авторизация при помощи SMS или страницы в социальных сетях дает отелю некоторую информацию о госте, которая при анализе в массе позволяет изменить параметры предложения под целевую аудиторию. Технологии дают не только имиджевые плюсы, но и вполне монетизируемые маркетинговые данные.
 
Дополнительно можно использовать приложения для мобильных телефонов или аналогичные сервисы, которые часто предоставляются совместно с IT-партнерами с целью экономии на разработке.
 
Аналогичным образом в партнерстве с ведущими легальными OTT-сервисами постояльцам можно предложить потоковое видео в качестве альтернативы гостиничному телевидению.

Пример из жизни


Один из последних примеров реализации комплексного проекта по организации беспроводного доступа — Wi-Fi в четырехзвездочном City Seasons Дубай.

Отель относится к сети одного из лидеров гостиничного бизнеса ОАЭ — City Seasons Group. Четырехзвездочные гостиницы группы помимо Дубая расположены в Абу Даби, Аль-Айне и Маскате.
 

 
Ранее в City Seasons Дубай уже была развернута сеть Wi-Fi для предоставления гостевого доступа на базе оборудования другого поставщика. Однако она не решала всех задач гостиницы, в частности, у сотрудников не было возможности централизованно управлять сетью и осуществлять ее мониторинг. Потребность в этих инструментах появилась в ходе развития предложения для гостей — в первую очередь для предоставления дополнительных услуг на базе беспроводной сети. Кроме того, необходимо было расширить покрытие беспроводного сигнала и обеспечить бесшовный роуминг между точками доступа во всех зонах отеля.
 
В рамках разработанного проекта в номерах гостиницы были установлены точки доступа EAP115-Wall, а в остальных зонах — EAP320.
 

EAP115-Wall N300 настенная точка доступа Wi-Fi, поддержка PoE, линейка Auranet
 
По словам нашего партнера, Wi-Fi провайдера и системного интегратора, компании Connectum, специализирующегося на подобных проектах индустрии гостеприимства в России, «EAP115-Wall — это как раз то полезное устройство из практики, вошедшей в новые редакции IT-стандартов отелей ведущих мировых брендов. Речь идет о размещении таких настенных точек доступа непосредственно в номерах, а не в коридоре, как это было принято раньше. Это обеспечивает уверенный и стабильный прием, высокую скорость передачи, распределение нагрузки от постояльцев, которые, возвращаясь в отель, вдруг начинают качать фильмы и пользоваться видеосвязью с планшетов.

В точке доступа предусмотрен и проводной порт RJ-45/Ethernet, который можно использовать для доставки видео контента на телевизор или подключения IP-телефона».
 




EAP320 AC1200 гигабитная двухдиапазонная потолочная точка доступа Wi-Fi линейки Auranet
поддержка 802.11ac, MIMO, TurboQAM, Airtime Fairness, Beamforming, Band Steering, PoE

 
Дополнительно был внедрен программный EAP-контроллер для управления и мониторинга сети. IT-департамент гостиницы рассматривал и другие предложения (от других вендоров), однако комплект нашего оборудования оказался оптимальным по соотношению цены и качества.
 
По мнению компании Treolink, которая проектирует, инсталлирует и обслуживает вычислительные сети для клиентов сегмента HoReCa, «точки доступа WiFi TP-Link семейства Auranet обеспечивают беспроводной доступ к сети на скоростях до 1300 Мбит/с. На базе программного или аппаратного контроллера они объединяются в бесшовную сеть, в которой гибко разграничиваются права доступа, настраивается резервирование и ограничение полосы пропускания, авторизация клиентов по SMS, профилям социальных сетей, временным ваучерам доступа. При этом в гостевых сетях Wi-Fi клиентские устройства полностью изолированы как друг от друга, так и от ресурсов корпоративной сети, что гарантирует соблюдение политик информационной безопасности предприятия».
 
Кроме того, не стоит забывать про проводную часть сети. Наши партнеры из компании Treolink комментируют: «На базе коммутаторов TP-Link серии JetStream строятся высокопроизводительные проводные сети и обеспечивается питание для устройств, поддерживающих PoE — точек доступа Wi-Fi, камер видеонаблюдения, телефонных аппаратов. Коммутаторы позволяют разделить сети на логические, изолированные друг от друга сегменты, настроить списки контроля доступа, авторизацию. Они очень стабильно работают, поддерживают стекирование и агрегацию портов, что очень часто выручает в сложных сценариях при создании ядра крупных (свыше 1000 хостов) сетей».

Вместо заключения


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


 


Эта тенденция наиболее заметна в сегменте luxury, где для данного явления уже даже появился отдельный термин — low-touch luxury (или «бесконтактная роскошь» или бесконтактный комфорт) — т.е. премиум-сервис, который можно получить при минимальном соприкосновении с персоналом.
 
Есть еще один интересный сервис для зарубежных постояльцев, по словам компании Connectum: «Иностранным гостям полезно предлагать Wi-Fi „с собой“. Получив мобильный LTE-роутер на стойке в лобби, гость остается с гостиничным Wi-Fi в любой точке города, что выводит искусство гостеприимства на новый уровень».
 
У нас они, кстати, тоже есть, например, M7350.
 
Не все из перечисленных сервисов необходимы дешевому пансионату, но потребность в качественном беспроводном доступе практически не зависит от звездности и целевой аудитории отеля. Лучше всего это на текущий момент понимают в Молдове, Украине и Белоруссии — в этих странах, согласно недавнему исследованию HomeToGo, 90 и более процентов объектов «отпускного» размещения имеют Wi-Fi. В десятку стран с максимальной «интернетизацией» временного жилья входит и Россия. В этих условиях обновление инфраструктуры — это уже вопрос не конкуренции с ближайшими соседями по рынку, а выживания среди множества гостиниц, уже расширивших спектр своих цифровых услуг.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331342/


Об ИТ простыми словами — проект Интеллекции

Среда, 21 Июня 2017 г. 17:14 + в цитатник
Добрый день, уважаемые читатели!
Не так давно в Екатеринбурге появился интересный оффлайн проект под названием Интеллекции, представляющий лекции о современных технологиях в нашей жизни. Для проведения лекций приглашаются ученые и эксперты из различных областей. Как заявляют сами организаторы Интеллекций с телеканала Malina.am, это проект о месте человека в меняющемся мире. Мне удалось побывать лично на одном таком мероприятии и я бы хотел рассказать о нем поподробнее. Если вас заинтересовала эта тема, прошу под кат.

Лекции проводятся в конференц-центре Ельцин центра. Участие бесплатное, но необходима регистрация. Подробнее можно прочитать о проекте на сайте malina.am: malina.am/rubrics/intellecture.

image

8 июня я посетил лекцию под названием Спортивное программирование. В качестве лектора был приглашен многократный победитель чемпионатов мира по спортивному программированию и тренер команды УрФУ Михаил Рубинчик. Лекция состояла из двух частей.

В первой части Михаил провел семинар по теме спортивного программирования в формате презентации. В рамках семинара Михаил Рубинчик простым языком объяснил идею, заложенную в спортивном программировании, представил статистику и факты о чемпионатах ACM-ICPC. Так же Михаил рассказал о процессе подготовки участников к чемпионатам и о возможности участия в чемпионатах для всех желающих. Интересным моментом стал выход команды УрФУ, бронзовых призеров чемпионата мира этого года. Ребята рассказали свои истории успеха и поделились дальнейшими планами.

image

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

image

В целом лекция о спортивном программировании оставила у меня приятное впечатление, дала ясное представление об этом интересном направлении в сфере ИТ и проявила интерес к спортивному программированию.

Доступна полная версия лекции:





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

https://habrahabr.ru/post/331018/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1017 1016 [1015] 1014 1013 ..
.. 1 Календарь