...

суббота, 31 марта 2018 г.

Network-дайджест: 20 материалов о сетях, протоколах и битве за Net Neutrality

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


/ Flickr / Yohanes Sanjaya / CC

Протоколы


Тотальное истощение, или есть ли жизнь после IPv4
  • В этом материале речь пойдет об исчерпании адресов IPv4: почему так получилось и как обстоят дела с количеством IPv4 в мире. Расскажем о способах решения проблемы (IPv6, IPv9, перепродажа IPv4, обратные прокси-серверы) и о том, почему компании не спешат отказываться от IPv4.
Немного о VPN: протоколы для удаленного доступа
  • О двух способах организации VPN-соединений в корпоративной сети: remote access и site-to-site. Помимо этого, говорим о плюсах, минусах и особенностях протоколов PPTP, L2TP/IPsec, SSTP и OpenVPN.
Анонс WPA3: Wi-Fi Alliance представил обновление безопасности
  • Обзор основных нововведений протокола безопасности для беспроводных сетей WPA3: брутфорс-защита, настройка с помощью сторонних устройств, персонализированное шифрование данных и новый пакет безопасности. Дополнительно внутри вы найдете подборку материалов по теме: официальный релиз с детальным описанием новых функций, посты о будущем беспроводных сетей, способах их защиты и приоритизации трафика.
Новое поколение сетей: представлена первая спецификация 5G
  • Еще один новостной пост расскажет об особенностях спецификации для пятого поколения мобильных сетей. Релиз спецификации решили ускорить по требованию операторов и из-за высокого спроса на мобильный интернет. Подробности этого решения, описание параметров 5G-сети и достижений Англии, России, Японии и Финляндии в «5G-гонке» ищите под катом.

Сети и работа провайдера


Как доставить интернет в отдаленные уголки планеты: проекты GCI, Google и Facebook
  • Здесь мы поговорим о том, как General Communication обеспечили жителей Аляски широкополосным интернетом за счет радиорелейной сети, и расскажем об альтернативных способах доставки интернета на удаленные территории: атмосферных оптических линиях связи от Google и дронах Facebook.
Интернет в деревню — строим радиорелейную Wi-Fi-сеть
  • Еще одна статья на тему доставки интернета в отдаленные регионы. На этот раз речь пойдет о российском проекте. Внутри вы найдете описание технической стороны строительства радиорелейной Wi-Fi-сети по схемам точка-точка и точка-многоточка. Также мы привели пошаговую инструкцию, которая поможет получить разрешение государства на строительство таких сетей.
Биллинг — сердце сети интернет-провайдера
  • Небольшой ликбез и исторический экскурс на тему биллинга: что он собой представляет, откуда взялся и как развивался. Дополнительно на примерах посмотрим, как реализуют сервер биллинга и какие биллинг-решения предлагают на рынке.
Интеграция сетевых сервисов СКАТ DPI и LANBilling
  • Продолжаем тему биллинга, но уже с практической точки зрения. Рассмотрим пример внедрения сервера СКАТ DPI и биллинговой системы LANBilling в сетевую инфраструктуру провайдера с клиентской базой 2 тыс. человек.
Способы эффективного распределения полосы пропускания
  • Статья предлагает советы по оптимизации скорости доступа в интернет: от чего зависит пропускная способность сети и как сократить трафик в пять раз (кеширование, сжатие данных, CDN- и Flow-технологии и др.).
Как построена сеть интернет-провайдера
  • Описываем четыре уровня сети: уровень доступа, уровень агрегации, уровень ядра сети, серверный уровень. Рассказываем об оборудовании, которое используют провайдеры для реализации работы каждого из них.
Основные сервисы в сетях интернет-провайдера
  • В продолжение предыдущего материала в этой статье речь пойдет об особенностях серверного уровня. Как выглядит стандартный набор сервисов провайдера? В чем суть работы этих сервисов? Ответы на эти и другие вопросы вы найдете внутри.


/ Flickr / Yohanes Sanjaya / CC

Законодательство


Предоставление бесплатного Wi-Fi согласно законодательству
  • Ознакомительный материал о том, как организовать доступ в интернет с помощью технологии Hotspot и не нарушить российских законов. В качестве примера посмотрим, как работает Wi-Fi-авторизация на Скат DPI в компании «Домашние компьютерные сети».
Что делать интернет-провайдеру после запрета Google Global Cache
  • Речь пойдет о последствиях запрета Google Global Cache в России для пользователей и сетевых операторов. Подскажем, как провайдерам справиться с законодательными сложностями в сложившейся ситуации.
Блокировки интернет-контента: ситуация на мировой арене
  • Предлагаем вам узнать больше о странах, жители которых часто сталкиваются с блокировками контента в интернете. Причины блокировок и технические особенности реализации «политик запрета» — об этом в статье.
Блокировки интернет-контента: о мессенджерах и социальных сетях
  • Здесь поговорим о нашумевших запретах, связанных с соцсетями и мессенджерами. Вы узнаете, почему Twitter заблокирован в Китае, а LinkedIn — в России. Дополнительно обсудим минусы модерации контента в социальных медиа и ситуацию с запретами Е2Е-шифрования.

Цикл статей «Битва за сетевой нейтралитет»


Битва за сетевой нейтралитет: история вопроса
  • Эта статья открывает наш многосерийный цикл публикаций о Net Neutrality и начинается с определения сути и истоков концепции. Говорим о возникновении термина, роли частных и государственных телекоммуникационных компаний в формировании принципов сетевого нейтралитета, а также об основных исторических этапах развития этих принципов.
Битва за сетевой нейтралитет: войны с операторами и первые суды
  • Продолжаем углубляться в историю. В этом материале речь пойдет о противостоянии Федеральной комиссии по связи (FCC) и американских провайдеров. Расскажем о самых громких судебных разбирательствах и основных этапах модификации правил сетевого нейтралитета, происходивших до 2010 года.
Битва за сетевой нейтралитет: судебные войны и общественные протесты
  • В этом материале опишем ход «войны» между FCC и операторами-гигантами (Verizon, Google, AT&T) в период с 2010 по 2017 год. Вы узнаете, почему президент США решил поддержать сторонников сетевого нейтралитета, а 60 технологических компаний выступили против них.
Битва за сетевой нейтралитет: два с половиной года Net Neutrality
  • Мы предлагаем подробнее остановиться на периоде с 2015 по 2017 год, когда Америка жила по принципу Net Neutrality. Ответим на вопросы: почему в Комиссии решили отменить нейтралитет, и как на это отреагировали граждане США, телекоммуникационные компании и СМИ.
Битва за сетевой нейтралитет: война штатов
  • В финальной статье нашего цикла обсуждаем инициативу отдельных штатов по сохранению сетевого нейтралитета: возможно ли это, и каковы их шансы на успех. Помимо этого, материал расскажет, как обстоят дела с Net Neutrality в Европе, России, Индии и других странах.



Наши предыдущие дайджесты:

Let's block ads! (Why?)

Знакомство с облаком: как работают статические методы распределения трафика

Распределение нагрузки в облаке IaaS-провайдера помогает эффективно использовать ресурсы виртуальных машин. Существует множество методов распределения нагрузки, но в сегодняшнем материале мы подробно остановимся на одних из самых популярных статических методах: round-robin, CMA и threshold algorithm. Под катом поговорим о том, как они устроены, в чем их характерные особенности и где они используются.


/ Flickr / woodleywonderworks / CC

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


Статическое распределение — привязка к одной машине

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

Round-robin


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

Одной из реализаций этого алгоритма является round-robin DNS. В этом случае DNS отвечает на запросы не одним IP-адресом, а списком из нескольких адресов. Когда пользователь делает запрос на разрешение имени для сайта, DNS-сервер назначает новое соединение первому серверу в списке. Это постоянно перераспределяет нагрузку на серверную группу.

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


Представим, что у нас развернуты две среды с высокодоступными серверами приложений Tomcat 7 и балансировщиками nginx. DNS-серверы «привязывают» к доменному имени несколько IP-адресов, добавляя внешние адреса балансировщиков в ресурсную запись типа А. Далее DNS-сервер пересылает список IP-адресов доступных серверов, а клиент «пробует» их по порядку и устанавливает соединение с первым ответившим.

Отметим, что такой подход не лишен недостатков. Например, DNS не проверяет серверы на наличие ошибок и не исключает из списка IP-адресов идентификаторы отключённых ВМ. Поэтому, если один из серверов оказывается недоступным, могут возникать задержки в обработке запросов (порядка 10–30 секунд).

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

Central Manager Algorithm


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

Подобный подход используется IBM в решении Guardium. Приложение собирает и постоянно обновляет информацию обо всех управляемых модулях и создает на её основе так называемую нагрузочную карту. С её помощью и выполняется управление потоками данных. Балансировщик принимает HTTPS-запросы от S-TAP — инструмента мониторинга трафика — прослушивая порт 8443 и используя Transport Layer Security (TLS).


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

Threshold Algorithm


Процессы назначаются хостам сразу при их создании. При этом сервер может находиться в одном из трех состояний, определяемых двумя пороговыми величинами — t_upper и t_under.
  • Не загружен: нагрузка < t_under
  • Сбалансирован: t_under ≤ нагрузка ≤ t_upper
  • Перегружен: нагрузка > t_upper

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

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

UnderLoaded()
{
// validating request made by node
int status = Load_Balancing_Request(Ni);
if (status = = 0 )
{
// checking for non executable jobs from load matrix
int job_status = Load_Matrix_Nxj (No);
if (job_status = =1)
{
// checking suitable node from capability matrix
int node_status=Check_CM();
if (node_status = = 1)
{
// calling load balancer for balancing load
Load_Balancer()
}
} } }


Во втором случае центральный сервер может забрать у узла те задачи, которые тот еще не начал выполнять, и по возможности передать их другому серверу. Для запуска процесса миграции ученые использовали следующую функцию:
OverLoaded()
{
// validating request made by node
int status = Load_Balancing_Request(No);
if (status = = 1)
{
// checking load matrix for non executing jobs
int job_status = Load_Matrix_Nxj (No);
if (job_status = =1)
int node_status=Check_CM();
if (node_status = = 1)
{
// calling load balancer to balance load
Load_Balancer()
}
} } }

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

Еще материалы из корпоративного блога 1cloud:

Let's block ads! (Why?)

Google закрывает goo.gl. На смену приходит Firebase Dynamic Links

Начиная с 30 марта 2018 года, мы отказываемся от поддержки сокращения URL-адресов goo.gl. С 13 апреля 2018 года только существующие пользователи смогут создавать короткие ссылки в консоли goo.gl. Вы сможете просматривать аналитику и загружать информацию о короткой ссылке в формате CSV на срок до одного года, до 30 марта 2019 года, когда мы полностью прекратим работу goo.gl. Ранее созданные ссылки будут продолжать перенаправляться к месту назначения.
Мы запустили Google URL Shortener еще в 2009 году, чтобы помочь людям более легко обмениваться ссылками и измерять трафик онлайн. С тех пор появилось много популярных сервисов по сокращению URL-адресов, а также резко изменились способы как люди находят контент в Интернете: от настольных веб-страниц до приложений, мобильных устройств, домашних помощников и т.д.

Чтобы переориентировать наши усилия, мы отказываемся от поддержки goo.gl в ближайшие недели и заменяем его на Firebase Dynamic Links (FDL). FDL — это интеллектуальные URL-адреса, которые позволяют отправлять существующих и потенциальных пользователей в любое место в iOS, Android или веб-приложение. Мы рады росту и улучшению продукта в будущем. Хотя большинство функций goo.gl в конечном итоге закроются, все существующие ссылки будут продолжать перенаправляться к предполагаемому месту назначения.

Для пользователей

Начиная с 13 апреля 2018 года анонимные пользователи и пользователи, которые никогда не создавали короткие ссылки до сегодняшнего дня, не смогут создавать новые короткие ссылки через консоль goo.gl. Если вы хотите создать новые короткие ссылки, мы рекомендуем использовать Firebase Dynamic Links или использовать популярные сервисы, такие как Bitly и Ow.ly в качестве альтернативы.

Если у вас есть короткие ссылки goo.gl, вы можете продолжать использовать все функции консоли goo.glв течение одного года, до 30 марта 2019 года, после этого мы закроем консоль. Вы можете управлять всеми вашими короткими ссылками и их аналитикой через консоль goo.gl в течение этого периода.

После 30 марта 2019 года все ссылки будут продолжать перенаправляться к назначенному месту. Ваши существующие короткие ссылки не будут перенесены в консоль Firebase, однако вы сможете экспортировать свою информацию о ссылках с консоли goo.gl в формате CSV.

Для разработчиков

Начиная с 30 мая 2018 года, только проекты, которые получили доступ к URL Shortener APIs Shortener до сегодняшнего дня, могут создавать короткие ссылки. Чтобы создать новые короткие ссылки, мы рекомендуем FDL APIs. Короткие ссылки FDL автоматически обнаруживают платформу пользователя и отправляют пользователя либо в Интернет, либо в ваше приложение, если это необходимо.

Если вы уже используете URL Shortener APIs для управления прямыми ссылками goo.gl, вы можете продолжать использовать их в течение одного года, до 30 марта 2019 года, когда мы прекратим использование API.

Как и для потребителей, все ссылки будут продолжать перенаправляться в предполагаемый пункт назначения после 30 марта 2019 года. Однако существующие короткие ссылки не будут перенесены в консоль/API Firebase.

URL Shortener был отличным инструментом и мы гордимся тем, что создали его. Поскольку мы смотрим в будущее, мы нацелены на возможности Firebase Dynamic Links, особенно когда речь идет о динамическом обнаружении платформы и ссылках, которые выходят из процесса установки приложения. Мы надеемся, что вы тоже!

via developers.googleblog.com

Let's block ads! (Why?)

CLOUD Aсt: новый законопроект США открывает доступ к персональным данным за рубежом

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

Подробнее об акте и о том, как к нему отнеслось сообщество и ИТ-компании, расскажем ниже.


/ фото angela n.CC

Что такое CLOUD Aсt


Clarifying Lawful Overseas Use of Data Act был впервые предложен 6 февраля 2018 года. Законопроект является поправкой к Stored Communications Act (SCA) — акту от 1986 года, регулирующему предоставление доступа правительства США к данным, находящимся в распоряжении интернет-провайдеров. CLOUD Act вошел в состав 2232-страничного документа, утверждающего государственный бюджет, поэтому отдельных дебатов касательно его содержания не проводилось, как, впрочем, и отдельного слушания в Конгрессе.

В акте есть два ключевых пункта, облегчающих доступ правоохранительным органам США к ПД.

1. Запрос ПД пользователей у ИТ-компаний

Во-первых, отныне правоохранительные органы (от полицейских до агентов федеральной миграционной службы) имеют право запрашивать у ИТ-компаний доступ к данным вне зависимости от того, где эта информация хранится. Другими словами, полиция США может обязать Google или Facebook предоставить ПД пользователей, даже если они хранятся, например в Европе.

Учитывая, что многие глобальные ИТ-компании находятся в юрисдикции США, власти получают доступ к переписке, метаданным и учетным записям пользователей по всему миру. Теперь компании не смогут отказать в предоставлении данных, даже если это запрещено законодательством другого государства (как это было в случае с делом «Microsoft Ireland»).

2. Предоставление информации другим государствам

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

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

Поддержка акта


ИТ-гиганты Microsoft, Google, Facebook, Apple и Oath (раньше Yahoo) составили письмо, в котором одобрили законопроект, назвав его «заметным прогрессом в сфере защиты прав потребителей». Они также указали, что CLOUD Act позволит «лучше защитить пользователей, благодаря интернациональным соглашениям».

Когда акт был утвержден, директор по правовым вопросам Microsoft Брэд Смит (Brad Smith) в своем твиттере сказал, что «это важный день для международных отношений и защиты личных данных во всем мире». Он также отметил, что акт позволит повысить доверие к технологиям, которыми мы пользуемся каждый день. Однако твит был встречен явной критикой пользователей сети.


/ фото Alexandre BCC

Критика акта


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

Также акт подвергли критике многие американские общественные организации по защите прав человека. Более двадцати организаций, включая EFF (Electronic Frontier Foundation — Фонд электронных рубежей) и ACLU (American Civil Liberties Union — Американский союз защиты гражданских свобод), составили открытое письмо к Конгрессу, в котором указали на явные нарушения прав человека в CLOUD Act.

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

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

Альтернатива: Договор о взаимном оказании правовой помощи


До принятия CLOUD Act правовые аспекты получения доступа к информации за рубежом регулировались с помощью MLAT (Mutual Legal Assistance Treaties — Договор о взаимном оказании правовой помощи). Этот договор был составлен в 2001 году при активном участии США и стран Европы (Россия решение Конвенции не признала). Он позволяет правоохранительным органам разных стран получить доступ к данным, хранящимся за рубежом, при содействии государства, в котором они хранятся.

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



P.S. Еще материалы из Первого блога о корпоративном IaaS:

Let's block ads! (Why?)

Тренды безопасности: почему злоумышленники атакуют нефинансовые учетные записи для кражи денег

Хакеры становятся всё более изобретательными в попытках завладеть чужой финансовой информацией. Согласно последнему исследованию компании Javelin Strategy & Research около 16,7 миллионов человек подверглось мошенническим атакам и краже личной информации с целью финансовых махинаций в 2017 году, а общая сумма похищенного составила более $16,8 миллиардов.

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

Изменения в действиях хакеров


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

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

image

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


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

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

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

В результате все чаще для атак типа new account fraud используются учетные записи на ресурсах вроде Amazon или PayPal.

image

Как защититься


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

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

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

Другие материалы по теме финансов и фондового рынка от ITI Capital:


Let's block ads! (Why?)

[Из песочницы] Вечный фотоархив для дома

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

image


Теория

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


Задача

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

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

В итоге закупил в известном китайском магазине набор Raspberry Pi 3b(малинка) — 2000р, алюминиевую коробочку usb-sata 2.5" — 500р, в обычном магазине SSD 240G 4100р. SD карточка на 64gb и тюбик древней КПТ-8 нашлись в ящике стола.

Неведомо почему, но у нас диск SSD убранный в коробочку usb-sata стоит на 80% дороже чем по отдельности.


Сборка миникомпьютера Raspberry Pi

Увлекательный конструктор, требует внимания и немного места на столе. Обязательный инструмент только крестовая отвёртка. Скачал Ubuntu MATE и Win32 Disk Imager с сайта Raspberry, записал на SD карточку образ системы. Ничего увлекательного, только кнопку Ок нажимать. Немного доработал радиаторы которые шли в комплекте с малинкой. Срезал скальпелем часть двустороннего скотча и намазал КПТ-8, затем аккуратно снял пинцетом защитную бумагу с оставшегося двухстороннего скотча и приклеил на свои места.

Подключил к телевизору, стал ставить систему и смотреть какой ток потребляет Raspberry Pi.
Потребление тока Raspberry Pi 3b не больше 0.8A.

Потребление коробочки usb-sata c SSD диском внутри в покое 0.1А в работе не больше 0.36А
После установки Ubuntu MATE, попробовал запустить на Raspberry видео. Быстро понял что жизнь не удалась. И вообще система в сборе была похожа на уличную кошку, к хвосту которой какие-то хулиганы привязали консервную банку.

Открыл на малинке SSH и отнёс всю конструкцию на антресоль.

sudo apt install openssh-server
sudo systemctl enable sshd
sudo ufw allow 22
ssh -X пользователь@ip_адрес_ Raspberry_Pi

Порт SSH открыть сразу не получилось. Управление фаерволом через программу gui не сработало, по этому использовал UFW.

Подключил всю систему к роутеру MTS RV6699. Питание по USB, данные по проводной сети. До этого мерил ток который RV6699 отдаёт на USB порт. USB на RV6699 спокойно отдаёт 1.5A и вся система завелась без проблем. Но на всякий случай выключил на малинке интерфейс Wifi.

ifconfig wlan0 down

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

создал нового пользователя с именем user

adduser user

сделал папку Photo для подключения диска в домашней папке нового пользователя /home/user/

mkdir Photo

Посмотрел UUID раздела на usb диске.

sudo blkid

Смонтировал раздел в папку /home/user/Photo/, дописав в конец файла /etc/fstab строчку

UUID="7C26EDB626ED7216" /home/user/Photo/ ntfs rw,nls=utf8,gid=plugdev,umask=0000 0 0

На маршрутизаторе от МГТС RV6699 зафиксировал ip адрес малинки.

Настройка > LAN > Основные параметры 

Перезагрузил систему, проверил что всё запускается как надо.


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

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

В итоге выбрал Cloud Commander. Быстрый, можно смотреть фотки в броузере, написан на node.js.


Установка

Просто Node.js поставить мало, у неё есть свой инсталятор для программ, который нужно поставить дополнительно.
Сначала ставим Node.js

sudo apt-get install nodejs

и установщик программ для неё

sudo apt-get install npm

Затем запускаем установку самого Cloud commander c помощью инсталятора npm. Установка тоже просит root прав.

sudo npm i cloudcmd -g

Запускаем Cloud commander

cloudcmd

Фиг там, не работает. Гуглим где проблема. В итоге:

sudo ln -s /usr/bin/nodejs /usr/bin/node

и снова..

$ cloudcmd
url: http://localhost:8000/

Ура работает!

Правим конфиг Cloud commander в папке /usr/local/lib/node_modules/cloudcmd/json/config.json
меняем параметр root, для того чтобы сразу открывался USB диск приделанный к папке /home/user/Photo/

"root": "/home/user/Photo/" 

Осталось открыть порт для доступа и настроить автозапуск.

Открываем порт для доступа.

sudo ufw allow 8000

Настраиваем автозапуск.

Создаём текстовый файл cloudcmdstart в /usr/sbin/local, чтобы использовать его для запуска Cloud commander.

  > cloudcmdstart

mcedit cloudcmdstart

Пишем текст в cloudcmdstart

#!/bin/sh

sudo -u user cloudcmd --root /home/user/Photo 

Копируем в /usr/sbin

sudo cp cloudcmdstart /usr/sbin/

сообщаем системе что файл cloudcmdstart можно запускать.

sudo chmod +x /usr/sbin/cloudcmdstart

После этого добавляем его в автозапуск при старте. Открываем файл /etc/rc.local

sudo mcedit /etc/rc.local

добавляем предпоследнюю строку.

/usr/sbin/cloudcmdwin

Сохраняем F2, выходим из редактора F10, перезагружаемся .

sudo reboot

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

http://ip_вашей_RaspberryPi:8000

Залил фоток с компа для проверки, скорость копирования файлов около 4мб (32мбит) в секунду, узкое место коробочка usb-sata.


Возможные проблемы в процессе


  1. USB диск только для чтения — проверьте маску в записи диска в файле fstab, должны быть все нули.
  2. apt-get install пишет ошибки — обновите систему из командной строки (примерно 1.5. часа) и не забудьте перед командой писать sudo
  3. утомляют древние тестовые радакторы — подключитесь ssh -X user@малинка, затем вызовите sudo gedit путь_к_файлу.
  4. Веб интерфейс не всегда удобен — https://winscp.net

Если доступ к архиву нужен только из дома, то на этом всё.

Если хочется пользоваться архивом везде, то читайте дальше — будет немного BDSM.

В Cloud commander нет возможности включить доступ по HTTPS по этому начинаем готовить костыли.

Первым делом создаём самодельный сертификат и ставим веб сервер Nginx.

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

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

С самодельным сертификатом броузер будет ругаться и краснеть, но соединение зашифрует.

image

Всё необходимое для создания самодельного сертификата в Ubuntu MATE уже установлено.

sudo apt-get install nginx

Nginx устанавливается /etc/nginx, нам надо отредактировать его конфиг nginx.conf для включения запроса пароля при доступе к Cloud Commander.

sudo gedit /etc/nginx/nginx.conf 

В разделе http{ } добавляем строчки для включения проверки пароля и показываем путь к файлу с паролями htpasswd

http {
      .......................

        auth_basic           "closed site";
        auth_basic_user_file /home/user/htpasswd;

          }

Создадим файл с паролями для входа через Nginx

> htpasswd

Генерируем пароли с помощью формы на сайте http://seriyps.ru/crypt/htpasswd/ копируем в файл каждый аккаунт с новой строки.

Создаём файл с конфигурацией нашего нового сайта для защищенного доступа к Cloud commander и кладём его в папку /etc/nginx/sites-available

> cloudcmdsite.conf
gedit cloudcmdsite.conf
sudo cp  cloudcmdsite.conf /etc/nginx/sites-enabled

содержимое файла cloudcmdsite.conf

server {
    listen 443;
    client_max_body_size 712m;
    ssl                  on;
    ssl_certificate      /home/user/ssl/server.crt;
    ssl_certificate_key  /home/user/ssl/server.pem;
    server_name malinka.io;
    access_log /var/log/nginx/malinka.access.log;
    location / {

        proxy_pass    http://127.0.0.1:8000;

    }

}

В этом конфиге:
ssl_certificate /home/user/ssl/server.crt; -ваш публичный файлик сертификата
ssl_certificate_key /home/user/ssl/server.pem;- ваш секретный ключ от сертификата

проверяем что всё получилось.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Теперь надо настроить Cloud commander т.к. он из коробки работает от пользователя root.

 gedit /usr/local/lib/node_modules/cloudcmd/json/config.json

В файле меняем значение в строках:

"username": "user"
 "password": "шифр пароля пользователя user созданный в http://md5decrypt.net/en/Sha512/"
 "console": false

сохраняем.

открываем порт 443 на фаерволе.

sudo ufw allow 443

перезагружаем малинку

 sudo reboot

Пробрасываем порт на роутере RV6699

 > Настройка > NAT > Port Mapping

затем с телефона подключенного к Wifi заходим на https://ваш_внешний_ip: порт

Должен быть запрошен логин и пароль из файла htpasswd.

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


Почему это лучше чем готовый NAS?

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

Что ещё можно сделать?

Прикрутить авторизацию на Nginx c использованием сертификатов, но пока не понял зачем.

Let's block ads! (Why?)

Планы на JPoint 2018

Уже скоро в Москве пройдет международная Java-конференция JPoint, поэтому пора определиться с докладами, на которые стоит сходить. Рассказ пойдет о докладах, на которые пойду лично я и почему.

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

На JPoint 4 потока, и выбор наиболее актуальных тем не так прост. Вот к чему я пришел:

День 1


День 2



Доклады "Идиоматичный Kotlin: от форматирования до DSL", "Kotlin DSL: теория и практика"

По правде говоря, еще даже не "трогал" Kotlin. В аннотациях к докладам говорят, что на Kotlin легко создавать новые DSL. А наличие interop-а Kotlin и Java дает массу возможностей для решения задач с применением DSL-подхода: вместо старой доброй Java в больших количествах будут изящные конструкции на выдуманном вами прекрасном языке.

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


Доклад "Как сделать встроенный в JVM профайлер, который не боится AOT-компиляции?"

Использую Excelsior JET уже несколько лет, еще с версии 8.0. Радует то, что продукт постоянно развивается, например в 11 версии здорово улучшился процесс сборки с появлением плагина для Maven. Предположу, что в докладе будет идти речь о Profile-Guided Optimization, появившейся в 12 версии в Enterprise и Embedded изданиях. Так или иначе, очень интересен вопрос, как эффективно использовать имеющиеся в Excelsior JET инструменты для повышения производительности приложений. Насколько важен тот же test run, например.


Доклад "Анализ программ: как понять, что ты хороший программист"

Хардкорный доклад по алгоритмам и инструментам анализа кода. К тому же от великолепного докладчика Алексея Кудрявцева. Что может быть лучше?


Доклад "Boot yourself, Spring is coming"

Использую Spring и Spring Boot не так давно. До сих пор большая часть проектов на Java EE. Spring Boot — это про улучшение кода, и есть решительная потребность во всем разобраться. А здесь еще двойной доклад от экспертов Spring. Иду!


Доклад "Designing for modularity with Java modules"

Я все еще на Java 8, а значит модули и другие плюшки еще не освоены. В докладе пойдет речь о модулях Java 9 и как с ними код становится лучше. Будет очень полезно для погружения в технологию. Думаю, стоит сходить.


Доклады "Graal, Value Types, Loom и прочие ништяки: что это и зачем оно нужно простому смертному", "Spring Framework 5: feature highlights and hidden gems"

Глядя на быстро сменяющиеся цифры — вышла Java 10, на подходе Spring 5.1 — думаешь, что Java технологии очень быстро развиваются. Так и есть. Хотя запуск в продуктив еще нескоро, изучать нужно уже сейчас.


Что в перерывах?

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

Для меня эта конференция JPoint будет уже 4-ая. Надеюсь, организаторы и докладчики будут на высоте, как и всегда!

P.S.: Пост написан под впечатлением от программы конференции JPoint в помошь участникам и организаторам и при поддержке JUG.ru.

Let's block ads! (Why?)

Порхающие* велосипеды. Что делать с сохранением состояния во Flutter?

пятница, 30 марта 2018 г.

Выпуск#16: ITренировка — актуальные вопросы и задачи от ведущих компаний

Представьте, что у Вас есть специальная клавиатура со следующим клавишами:
        A
        Ctrl+A
        Ctrl+C
        Ctrl+V 

где CTRL+A, CTRL+C, CTRL+V работают как «Выбрать всё», «Скопировать», «Вставить» соответственно.
Вы можете нажать на клавиатуру N раз (только на указанные клавиши). Напишите программу, дающую максимальное количество «A» с помощью этих операций. Если возможно, выведите также последовательность нажатий. Иначе говоря, вход — N (количество нажатий), вывод — M (количество «А», которые можно получить).
Примеры:
Вход: N = 3
Выход: 3
Можем получить максимум 3 A следующей последовательностью нажатий: A, A, A

Вход: N = 7
Выход: 9
Максимум — 9 А, последовательность: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

Вход: N = 11
Выход: 27
Максимум — 27 А, последовательность: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V, Ctrl A, Ctrl C, Ctrl V, Ctrl V

Let's block ads! (Why?)

Настраиваем Mozilla Thunderbird в корпоративной среде Windows

#Ищем полное имя пользователя (Фамилия Имя Отчество)
$UserName = $env:username
$Filter = "(&(objectCategory=User)(samAccountName=$UserName))"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.Filter = $Filter
$ADUserPath = $Searcher.FindOne()
$ADUser = $ADUserPath.GetDirectoryEntry()
$ADDisplayName = $ADUser.DisplayName

############################################################################################################################

$domain="mail.ru" #Почтовый домен
$imap="imap.mail.ru" #imap сервер
$dc="dc1.domain.cn" #Контролер домена
$bdn="CN=Users,DC=domain,DC=cn" #Base DN

$file="$env:appdata\Thunderbird\Profiles\$env:username.default\prefs.js"
echo '#######################' | out-file $file -encoding UTF8
echo 'user_pref("ldap_2.autoComplete.directoryServer", "ldap_2.servers.company");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.autoComplete.useDirectory", true);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.servers.company.auth.dn", "");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.servers.company.auth.saslmech", "GSSAPI");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.servers.company.description", "company");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.servers.company.filename", "ldap.mab");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("ldap_2.servers.company.maxHits", 100);' | out-file $file -encoding UTF8 -Append
$id1 = echo 'user_pref("ldap_2.servers.company.uri", "ldap://'
$id2 = echo $dc/$bdn'??sub?(objectclass=*)");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.ab_remote_content.migrated", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.account.account1.identities", "id1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.account.account1.server", "server1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.account.account2.server", "server2");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.account.lastKey", 2);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.accountmanager.accounts", "account1,account2");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.accountmanager.defaultaccount", "account1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.accountmanager.localfoldersserver", "server2");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.append_preconfig_smtpservers.version", 2);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.attachment.store.version", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.default_charsets.migrated", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.folder.views.version", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.font.windows.version", 2);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.draft_folder", "imap://' 
$id2 = echo $env:username%40$domain@$imap/Drafts'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.attach_signature", true);' | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.drafts_folder_picker_mode", "0");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.fcc_folder", "imap://'
$id2 = echo $env:username%40$domain@$imap/Sent'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.fcc_folder_picker_mode", "0");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.fullName", "'
$id2 = echo $ADDisplayName'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.htmlSigFormat", true);'  | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.identity.id1.reply_on_top", 1);'  | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.sig_file", "C:\\Users\\'
$id2 = echo $env:username\\AppData\\Roaming\\Thunderbird\\Profiles\\$env:username.default\\signature.htm'");'

echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.sig_file-rel", "[ProfD]signature.htm");' | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.sign_mail", false);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.identity.id1.smtpServer", "smtp1");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.stationery_folder", "imap://'
$id2 = echo $env:username%40$domain@$imap/Templates'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.tmpl_folder_picker_mode", "0");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.identity.id1.useremail", "'
$id2 = echo $env:username@$domain'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.identity.id1.valid", true);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.openMessageBehavior.version", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.rights.version", 1);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.root.imap", "C:\\Users\\'
$id2 = echo $env:username\\AppData\\Roaming\\Thunderbird\\Profiles\\$env:username.default\\ImapMail'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.root.imap-rel", "[ProfD]ImapMail");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.root.none", "C:\\Users\\'
$id2 = echo $env:username\\AppData\\Roaming\\Thunderbird\\Profiles\\$env:username.default\\Mail'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.root.none-rel", "[ProfD]Mail");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.cacheCapa.acl", false);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.cacheCapa.quota", false);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.canChangeStoreType", true);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.check_new_mail", true);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.directory", "C:\\Users\\'
$id2 = echo $env:username\\AppData\\Roaming\\Thunderbird\\Profiles\\$env:username.default\\ImapMail\\$imap'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.directory-rel", "[ProfD]ImapMail/'
$id2 = echo $imap'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.hostname", "'
$id2 = echo $imap'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.server.server1.login_at_startup", true);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.max_cached_connections", 5);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.name", "'
$id2 = echo $env:username@$domain'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.server.server1.port", 993);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.socketType", 3);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.spamActionTargetAccount", "imap://'
$id2 = echo $env:username%40$domain@$imap'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.server.server1.storeContractID", "@mozilla.org/msgstore/berkeleystore;1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server1.type", "imap");' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server1.userName", "'
$id2 = echo $env:username@$domain'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.server.server2.directory", "C:\\Users\\'
$id2 = echo $env:username\\AppData\\Roaming\\Thunderbird\\Profiles\\$env:username.default\\Mail\\Local Folders'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.server.server2.directory-rel", "[ProfD]Mail/Local Folders");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server2.hostname", "Local Folders");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server2.name", "Локальные папки");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server2.storeContractID", "@mozilla.org/msgstore/berkeleystore;1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server2.type", "none");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.server.server2.userName", "nobody");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.smtpserver.smtp1.authMethod", 3);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.smtpserver.smtp1.description", "mail.ru");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.smtpserver.smtp1.hostname", "smtp.mail.ru");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.smtpserver.smtp1.port", 465);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.smtpserver.smtp1.try_ssl", 3);' | out-file $file -encoding UTF8 -Append

$id1 = echo 'user_pref("mail.smtpserver.smtp1.username", "'
$id2 = echo $env:username@$domain'");'
echo $id1$id2 | out-file $file -encoding UTF8 -Append

echo 'user_pref("mail.smtpservers", "smtp1");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.spam.version", 1);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.taskbar.lastgroupid", "8216C80C92C4E828");' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.ui-rdf.version", 15);' | out-file $file -encoding UTF8 -Append
echo 'user_pref("mail.winsearch.firstRunDone", true);' | out-file $file -encoding UTF8 -Append

Let's block ads! (Why?)

3 распространенные ошибки в дизайне, которые легко исправить

О рубрике #logomachine_help


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

1. Emoreco: добавляем индивидуальность


image
Исходный логотип и описание проекта

image
Пример использования

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


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

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


Расшифровка концепции


Примеры использования нового стиля

Итог


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

2. Device: добавляем узнаваемость



Исходный логотип

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

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


До / после

Кроме того мы облегчили графику за счет тонкого шрифта и строчных букв, а знак сделали более аккуратным.


Примеры оформления носителей

Итог


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

3. RocketExpress: упрощаем графику




Исходный логотип и описание проекта (шакалы не наши, так и было, честно)

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


До / после

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


Примеры фирменных носителей


Здоровенный шикарный Камаз

Итог


С упрощенной графикой логотип стало гораздо проще использовать.

На этом всё!


Если хотите стать участником рубрики #logomachine_help — оставляйте в комментах описание своего проекта и текущий логотип. Мы выберем интересные проекты и поможем им с логотипом как в этом выпуске.

Статью подготовил Даня из Логомашины

Let's block ads! (Why?)

Java Puzzlers NG S02: всё чудесатее и чудесатее

Снижение доверия к Symantec PKI: рекомендации владельцам сайтов

image

Привет Хабр, ранее, в своем блоге по безопасности, мы объявили о планах по снижению доверия Chrome к сертификатам Symantec (включая принадлежащие Symantec бренды, такие как Thawte, VeriSign, Equifax, GeoTrust и RapidSSL). В этом посте описывается, как владельцы сайтов могут определить, повлияет ли на них снижение доверия к сертификатам Symantec, и если да, то что нужно сделать и когда. Отказ от замены этих сертификатов приведет к поломке сайта в будущих версиях основных браузеров, включая Chrome и Firefox.


Chrome 66

Если ваш сайт использует сертификат SSL / TLS от Symantec, который был выпущен до 1 июня 2016 года, он перестанет нормально функционировать уже в Chrome 66, что в свою очередь может повлиять на ваших пользователей.

Если вы не уверены в том, использует ли ваш сайт такой сертификат, вы можете уже сейчас проверить находится ли ваш сайт в зоне риска с помощью Chrome Canary. Если при переходе на ваш сайт отображается ошибка сертификата или предупреждение в DevTools, как показано ниже, вам нужно будет заменить сертификат. Вы можете получить новый сертификат от любого доверенного ЦС, включая Digicert, который недавно приобрел бизнес CA Symantec.

image
Пример ошибки сертификата, которую пользователи Chrome 66 могут увидеть, если вы используете сертификат Legacy Symantec SSL / TLS, который был выпущен до 1 июня 2016 года

image
В сообщении DevTools вы увидите, нужно ли заменить сертификат до выхода Chrome 66

Chrome 66 уже доступен в каналах дистрибуции Canary и Dev, что означает, что затронутые сайты уже сейчас показывают ошибки пользователям этих версий Chrome. Более того, если затронутые сайты не заменят свои сертификаты до 15 марта 2018 года, то в скором времени и пользователи Chrome Beta также начнут испытывать неудобства. Мы настоятельно рекомендуем и просим владельцев сайтов как можно скорее заменить сертификаты если на вашем сайте показывается ошибка при просмотре с помощью Chrome Canary.

Chrome 70

Начиная с Chrome 70 все остальные сертификаты Symantec SSL / TLS перестанут работать, что приведет к ошибке сертификата, аналогичной показанной в КДПВ. Чтобы проверить, не находится ли ваш сертификат в зоне риска, зайдите на свой сайт с помощью Chrome и откройте DevTools. В консоли должно появится сообщение о необходимости замены сертификата.

image
В сообщении DevTools вы увидите, нужно ли заменить сертификат до выхода Chrome 70

Если вы увидели такое сообщение в DevTools, мы рекомендуем заменить сертификат как можно скорее. Если сертификат не будет заменен, пользователи начнут видеть ошибки сертификата на вашем сайте начиная с 20 июля 2018 года включительно. Первая версия бета-версии Chrome 70 будет доступно около 13 сентября 2018 года.


Временная шкала выпусков Chrome

В приведенной ниже таблице показаны первая версия Canary, First Beta и Stable Release для Chrome 66 и 70. Первое влияние данной версии будет совпадать с первой канарейкой, которая будет постоянно расширяться, поскольку релиз попадает на бета-версию, а затем в конечном итоге на Stable. Операторам сайта настоятельно рекомендуется внести необходимые изменения на свои сайты перед выпуском First Canary для Chrome 66 и 70 и не позднее соответствующих дат выпуска бета-версии.

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

Для того чтобы удовлетворить потребности корпоративных пользователей, в Сhrome будет добавлена корпоративная политика (Enterprise Policy), которая позволит отключить недоверие к Legacy Symantec PKI, начиная с Chrome 66. Это политика перестанет быть доступна после 1 января 2019 года, соответственно сертификаты от Legacy Symantec PKI перестанут быть доверенными для всех пользователей.


Особое упоминание: Chrome 65

Как отмечено в предыдущем объявлении, сертификаты SSL / TLS от Legacy Symantec PKI, выпущенные после 1 декабря 2017 года, больше не являются доверенными. Это не должно затронуть большинство владельцев сайта, т.к. для получения таких сертификатов требуется специальное соглашение с DigiCert. Доступ к сайтам использующим такой сертификат завершится неудачно, запрос будет заблокирован для Chrome 65. Чт

Let's block ads! (Why?)

Анализ результатов президентских выборов 2018 года. На федеральном и региональном уровне

logo

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

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

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

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


(На этой картинке и на последующих точка — УИК).

Также можно вспомнить множествоматематическихисследований, показывающих достаточно необычное распределение участков в зависимости от явки на них. Вместо нормального или логнормального распределения мы видим интересную кривую, с очень странными пиками на круглых значениях (70%, 75%, 80% и т.д.), возрастающую на около-100% явке и уходящей далеко вверх на 100%. Вот результаты президентских выборов 2012 года:

На выборах 2018 года кривая выглядит ещё более странно. Значительно возросло количество участков с явкой более 80%, а пики на круглых значениях ещё сильнее возросли.

Примечательно, что высокая явка наблюдается не только на мелких избирательных участках: нередки случаи, когда 90%-100% явки приходится на участки, к которым приписано 1500-2000 человек. Вот результаты выборов 2012 года:

а вот итоги выборов 2018 года:

Как видно, уменьшилось количество участков с 100% явкой, но теперь они распределились на отрезке явки 70%-100%. Также здесь можно увидеть более проявившееся распределение УИКов на круглых числах, таких как 80%, 85% и т. д.

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


Анализ выборов на региональном уровне

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

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

Можно было бы подумать, что это связано с различием в голосовании города и деревни, однако в Чувашии ситуация ещё показательнее, потому что там пропадают участки с явкой 77%, зато второе скопление УИКов, с около-100% явкой, в 2 раза больше, чем с естественной явкой.

Что касается Чечни, где традиционно рисовались 100%-ные результаты, на президентских выборах 2018 года появились много артефактов с необычной, не 100% явкой. Скорее всего, конечно, это результат работы независимых наблюдателей со всей страны, которые поехали в Чечню для наблюдения за голосованием. На каких-то участках заметны снижения явки до, примерно, 40%, на каких-то явка упала до 90%. Всё это в лишний раз показывает масштаб фальсификаций в республике.

Также нельзя пройти мимо возле результатов выборов в Кемеровской области, где в 2012 году наблюдалось значительное количество участков с ровно 80% долей за основного кандидата, а теперь УИКи разделились на два типа:
Первый тип (таких участков мало) — это участки с низкой явкой.
Второй тип (а таких очень много) — это участки с явкой от 75% до 100% и равно сниженной долей голосов за других кандидатов, кроме основного.

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


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

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

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

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

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

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

Так как пока что на выборах кандидаты меняются, для упрощения работы с данными было решено использовать NoSQL базу, а конкретно — MongoDB, как самую находящуюся на слуху. Раньше я с ней не работал, о чём и пожалел, так как Mongo очень сильно понравилась, хоть и пришлось некоторое время адаптироваться после традиционных SQL и приведения данных к третьей нормальной форме.

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

Мой сервис позволяет посмотреть результаты на участках любой территории для любых (пока доступны 4) выборов, формируются 4 наиболее важных графика зависимости различных параметров от явки, даже показываются адреса УИКов, при выделении группы точек можно увидеть, где расположены эти участки. Адреса УИКов я не сам парсил, а воспользовался готовой базой данных, которую выкачали ребята с GIS-Lab.

Посмотреть сервис в онлайне можно по адресу cikinfo.modos189.ru
Также можно запустить на своем компьютере, исходники размещены на GitLab.

Let's block ads! (Why?)

[Перевод] Как стать фронтенд-разработчиком в 2018 году

Камран Ахмед, автор материала, перевод которого мы сегодня публикуем, говорит, что занимается фуллстек-разработкой уже 5 лет и в настоящее время работает на должности ведущего инженера в компании tajawal. Там ему приходится заниматься многими вещами. Ему, по долгу службы, надо быть в курсе того, что происходит в мире веб-разработки, кроме того, одна из его задач заключается в том, чтобы поддерживать знания и навыки других разработчиков в хорошем состоянии. По его словам, наблюдение за развитием технологий — это не только его работа, но и хобби. Ему приходилось видеть сложности, с которыми сталкиваются начинающие программисты (и опытные — тоже), когда речь заходит об оперативном освоении новшеств. Камрану, в прошлом году, часто приходилось отвечать на вопросы о том, в чём нужно ориентироваться для того, чтобы оставаться современным и востребованным программистом. В результате он, для того, чтобы помочь себе и другим, решил подготовить схемы, ссылки на которые отвечали бы на большинство вопросов, которые ему обычно задают.
image

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

Обзор


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

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


План развития фронтенд-разработчика

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


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

Изучение основ HTML


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

▍Задание


После того, как вы освоите основы HTML, создайте как минимум 5 HTML-страниц. Я порекомендовал бы выбрать любой веб-сайт — например, страницу профиля на GitHub, или страницу входа в Twitter, и воссоздать её, обращая особое внимание на структурирование элементов страницы. То, что получится, будет не таким уж и красивым, но беспокоиться пока об этом не стоит. Самое главное сейчас — структура.

Изучение основ CSS


Теперь, после того, как вы узнали правила создания скелетов страниц, пришло время обтянуть эти скелеты кожей, украсить их. Технология CSS, или каскадные таблицы стилей, используется для придания страницам привлекательного вида. Вот на что стоит обратить внимание, знакомясь с CSS:
  • Синтаксис и свойства CSS.
  • Блоковая модель, разработка макетов с использованием технологий Grid и Flexbox.
  • Разработка отзывчивых сайтов с использованием медиа-запросов.

▍Задание


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

Изучение основ JavaScript


JavaScript — это технология, которая позволяет сделать HTML-страницы интерактивными. Например, средствами JavaScript создают все те слайдеры, всплывающие окна, уведомления, которые вы видите на веб-сайтах. JS даёт возможность перезагрузки частей страниц без необходимости перезагрузки страниц целиком. На данном шаге вам нужно освоить основы JavaScript и приготовиться к самому интересному. Изучая JS, обратите внимание на следующее:
  • Изучите синтаксис и базовые конструкции языка.
  • Освойте методики работы с DOM средствами JS, то есть, например, разберитесь с тем, как добавлять элементы на страницу и удалять их с неё, как работать с классами элементов, как применять CSS-стили.
  • После освоения основ разберитесь с более продвинутыми вещами, такими, как области видимости, замыкания, поднятие функций, всплытие событий, и так далее.
  • Разберитесь с тем, как выполнять HTTP-запросы из JS-кода с использованием технологий XHR или Ajax. Именно Ajax позволяет выполнять какие-либо действия, обычно требующие перезагрузки страниц, не перезагружая их целиком.
  • Далее — уделите время изучению новых возможностей языка, того, что появилось в ES6+. ES6 — это версия JavaScript, в которой имеется множество интересных обновлений, таких, как классы, различные способы объявления переменных. Тут появились новые методы массивов, средства для конкатенации строк, и так далее. Большинство материалов по ES6, которые вам попадутся, будут использовать Babel в процессе разъяснения особенностей новых возможностей языка. Babel — это транспилятор, он конвертирует, условно говоря, «новый» JavaScript-код в «старый». Нужно это для того, чтобы новый код работал в старых браузерах. Пока, однако, не обращайте внимания на Babel. Ваша задача — понять основы JS и научиться пользоваться этим языком в современных браузерах. Ниже мы ещё поговорим о ES6.

На данном этапе освоения веб-технологий вы уже должны почувствовать, что кое-что знаете и начинаете ощущать вкус современного фронтенда. Кроме того, тут вы можете себя поздравить, так как HTML, CSS и JavaScript — это очень важно, это — база, на которой строится всё остальное, и вы освоили эту базу и готовы двигаться дальше.

Стоит ли изучать jQuery?


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

Практика


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

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

После того, как вы достаточно попрактикуетесь, придёт время заняться настоящими делами. Загляните на github.com, найдите подходящий опенсорсный проект и постарайтесь внести в него посильный вклад, создав несколько пулл-реквестов. Вот несколько идей, касающихся вклада в опенсорс:

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

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

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

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

Менеджеры пакетов


До этого момента, если вы пользовались какими-нибудь внешними библиотеками, например, плагинами или виджетами, вам приходилось самостоятельно загружать JS и CSS-файлы и добавлять их в проект. Когда у того, чем вы пользовались, выходила новая версия, вам, опять же, самостоятельно, приходилось эту новую версию загружать. Это — довольно скучная и утомительная задача. Менеджеры пакетов способны вас от этого избавить. Они помогают включать в проекты внешние библиотеки и плагины, делая это таким образом, что разработчику не приходится беспокоиться о том, чтобы вручную копировать необходимые файлы в проект и следить за выходом их новых версий. В частности, речь идёт о менеджерах пакетов yarn и npm. И тот и другой, в общем-то, представляют собой практически одно и то же, различия между ними не так уж и велики, и вы можете изучить любой из них, после чего другой покажется вам очень знакомым.

Практика


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

Препроцессоры CSS


Препроцессоры расширяют возможности CSS, давая стилям функционал, недоступный при их стандартном использовании. Существует множество препроцессоров: Sass, Less, Stylus, PostCSS, и другие. Если бы мне пришлось бы выбрать один из них, я остановился бы на Sass. Однако в последнее время весьма интересно выглядит препроцессор PostCSS, умение обращаться с ним вам точно не помешает, это что-то вроде Babel для CSS. Его можно использовать автономно или поверх Sass. На данном этапе вашего обучения я порекомендовал бы освоить Sass, а позже, когда у вас будет время, разобраться с PostCSS.

CSS-фреймворки


В принципе, изучать CSS-фреймворки вам необязательно, однако, если вы решите освоить какой-нибудь из них, знайте, что существует их очень много. Из того, что я пробовал, мне больше всего понравились Bootstrap, Materialize и Bulma. Если вы выбираете фреймворк с учётом его рыночной востребованности, обратите внимание на Bootstrap. Я бы точно выбрал его, если бы сейчас задумывался об освоении CSS-фреймворка.

Организация CSS


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

Средства для сборки проектов


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

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

В области линтеров, опять же, существует масса вариантов: ESLint, JSLint, JSHint, JSCS. Однако сейчас наибольшей популярностью пользуется ESLint, поэтому вы вполне можете остановиться на нём.

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

Практика


После того, как вы освоите всё то, о чём шла речь выше, у вас появится очередной повод для праздника. Фактически, вы теперь стали современным JS-разработчиком примерно на 75%. Помните о том, что практика — это очень важно, поэтому создайте какой-нибудь проект, используя всё то, что уже изучили. Может быть — это будет некая библиотека, в которой будут применены возможности Sass и JavaScript. Завершив работу, используйте Webpack для преобразования Sass в CSS, примените babel для транспиляции ES6-кода. А когда всё будет готово — опубликуйте свою разработку на GitHub и выложите в npm.

Выбор фреймворка


В старой версии схемы, которую мы рассматриваем, шаг выбора фреймворка следовал сразу за освоением основ, но теперь я поместил его после Sass, инструментов для сборки проектов и менеджеров пакетов, так как всем этим вы будете пользоваться при работе с фреймворками.
В том, что касается выбора фреймворка, можно отметить несколько вариантов, однако наиболее распространёнными являются React, Vue и Angular. Причём в наши дни потребность рынка в React.js всё растёт и растёт. Однако выбрать можно любой из перечисленных фреймворков. Я бы, например, выбрал React или Angular. Стоит отметить, что вам, как начинающему разработчику, Angular может показаться проще в сравнении с React, возможно, из-за того, что Angular поддерживает практически всё, что нужно для работы, что называется, «из коробки». Это — мощный маршрутизатор с поддержкой ленивой загрузки, HTTP-клиент, поддерживающий перехватчики, средства для внедрения зависимостей, инкапсуляция CSS компонентов, и так далее. Используя Angular, вы будете избавлены от забот о подборе внешних библиотек. Однако React пользуется большей популярностью, вокруг него сложилось замечательное сообщество, Facebook активно занимается его развитием. Тут мне хочется отметить, что выбирать фреймворк, основываясь только лишь на его «популярности» не стоит. Лучше всего — оценить альтернативные варианты, сравнить их, «примерить» их к нуждам своего проекта и сделать выбор.

Тут я не буду рассказывать о том, как я работал с Angular и React, не буду сравнивать их. Пожалуй, это — тема для отдельной статьи. Однако, раз уж мы говорим об освоении технологий, рассмотрим кривые обучаемости для Angular и React.

Кривые обучаемости, представленные ниже, построены с учётом того факта, что разработчик уже знаком с TypeScript и RxJS. Описание особенностей этих кривых достойно самостоятельного материала, тут я лишь отмечу, что они выглядят именно так благодаря стандартизации и возможностям, которые присутствуют в Angular по умолчанию. Это не означает, что React в чём-то плох. У каждого из этих фреймворков есть своя область применения. Итак, вот эти кривые.


Кривые обучаемости для React и Angular

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

Если вы выбрали Angular, вам понадобится изучить TypeScript. Разрабатывать Angular-проекты можно и без TypeScript, но, всё же, рекомендуется применять именно этот язык. Кроме того, вам надо будет освоить и RxJS — это очень вам пригодится при разработке Angular-приложений. Это — по-настоящему мощная библиотека, которая, кроме того, подходит для функционального программирования.

Если вы выберете Vue.js, то вам может понадобиться изучить Vuex. Эта библиотека очень похожа на Redux, но предназначена для Vue.

Тут следует понимать, что Redux, Mobx и Rx.js не привязаны к соответствующим фреймворкам. Эти библиотеки можно использовать и в приложениях, написанных на чистом JavaScript. И, если вы выбрали Angular — обратите внимание на то, что это должен быть Angular 2+, а не Angular 1+.

Практика


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

После того, как вы сделаете то, что решили сделать — почитайте материалы об измерении и улучшении производительности. Например, обратите внимание на такие вещи, как Interactivity Time, Page Speed Index, Lighthouse Score, и так далее.

Прогрессивные веб-приложения


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

Тестирование приложений


В сфере тестирования существует масса инструментов, ориентированных на различные цели. Я, в основном, пользуюсь комбинацией из Jest, Mocha, Karma и Enzyme. Однако прежде чем вы выберете свою библиотеку для тестирования, полезно будет разобраться с различными типами тестов, проанализировать доступные инструменты и выбрать те, которые лучше всего вам подходят. Вот хороший материал о современных средствах JS-тестирования.

Статическая проверка типов


Средства для статической проверки типов помогают контролировать типы данных в JavaScript-приложениях. Нельзя сказать, что изучать их обязательно, но они, определённо, способны принести огромную пользу, да и освоить их, вывести на уровень практического использования, можно буквально за несколько часов. Я, в основном, имею в виду TypeScript и Flow. Лично я отдаю предпочтение TypeScript, но вам советую опробовать и то и другое, а потом уже решить — что вам больше понравится.

Серверный рендеринг


Если вы изучили всё то, о чём мы говорили, ваших знаний будет достаточно для того, чтобы получить должность фронтенд-разработчика. Однако, это — не повод останавливаться.
Изучите возможности серверного рендеринга в выбранном вами фреймворке. Как именно это будет выглядеть — зависит от фреймворка. Например, в сфере React особое внимание стоит обратить на Next.js и After.js. В случае с Angular — это Universal. Если речь идёт о Vue, то это — Nuxt.js.

Итоги


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

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

Let's block ads! (Why?)