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

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

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

 

 -Постоянные читатели

 -Статистика

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

Habrahabr








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

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

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

Загадки и мифы SPF

Вторник, 26 Сентября 2017 г. 12:25 + в цитатник
z3apa3a сегодня в 12:25 Администрирование

Загадки и мифы SPF

  • Tutorial


SPF (Sender Policy Framework), полное название можно перевести как "Основы политики отправителя для авторизации использования домена в Email" — протокол, посредством которого домен электронной почты может указать, какие хосты Интернет авторизованы использовать этот домен в командах SMTP HELO и MAIL FROM. Публикация политики SPF не требует никакого дополнительного софта и поэтому чрезвычайно проста: достаточно добавить в зону DNS запись типа TXT, содержащую политику, пример записи есть в конце статьи. Для работы с SPF есть многочисленные мануалы и даже онлайн-конструкторы.


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


TL;DR — рекомендации в конце.


1. Заблуждение: SPF защищает мой домен от подделок


На самом деле: SPF никак не защищает видимый пользователю адрес отправителя.


Объяснение: SPF вообще не работает с содержимым письма, которое видит пользователь, в частности с адресом отправителя. SPF авторизует и проверяет адреса на уровне почтового транспорта (SMTP) между двумя MTA (envelope-from, RFC5321.MailFrom aka Return-Path). Эти адреса не видны пользователю и могут отличаться от видимых пользователю адресов из заголовка From письма (RFC5322.From). Таким образом, письмо с поддельным отправителем во From запросто может пройти SPF-авторизацию.


2. Заблуждение: Я внедрю SPF и станет безопасней и меньше спама


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


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


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


3. Заблуждение: SPF отрицательно (положительно) влияет на доставляемость писем


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


Объяснение: SPF сам по себе не влияет на доставляемость писем обычным потоком, и отрицательно влияет при неправильном внедрении или на непрямых потоках писем (indirect flow), когда пользователь получает письма не от того сервера, с которого письмо было отправлено, например на перенаправленные письма. Но системы спам-фильтрации и репутационные классификаторы учитывают наличие SPF, что в целом, на основном потоке писем, дает положительный результат. Если, конечно, вы не рассылаете спам.


4. Заблуждение: SPF авторизует отправителя письма


На самом деле: SPF авторизует почтовый сервер, отправляющий письмо от имени домена.


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


5. Заблуждение: письма, не прошедшие авторизацию SPF, отсеиваются


На самом деле: SPF-авторизация или ее отсутствие в общем случае не влияет кардинально на доставку писем.


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


Факт наличия SPF-авторизации важен не столько для доставки письма и принятия решения о том, является ли оно спамом, сколько для подтверждения адреса отправителя и связи с доменом, что позволяет для письма использовать не репутацию IP, а репутацию домена.


На принятие решения о действии над письмом, не прошедшим авторизацию, гораздо больше влияет политика DMARC. Политика DMARC позволяет отбросить (или поместить в карантин) все письма, не прошедшие авторизацию или их процент.


6. Заблуждение: в SPF надо использовать -all (hardfail), это безопасней чем ?all или ~all


На самом деле: на практике -all никак не влияет ни на чью безопасность, зато негативно влияет на доставляемость писем.


Объяснение: -all приводит к блокировке писем, отправленных через непрямые маршруты теми немногими получателями, которые используют результат SPF напрямую и блокируют письма. При этом на большую часть спама и поддельных писем эта политика существенного влияния не окажет. На текущий момент наиболее разумной политикой считается ~all (softfail), она используется практически всеми крупными доменам, даже теми, у которых очень высокие требованиями к безопасности (paypal.com, например). -all можно использовать для доменов, с которых не производится отправки легальных писем. Для DMARC -, ~ и ? являются эквивалентными.


7. Заблуждение: достаточно прописать SPF только для доменов, с которых отправляется почта


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


Объяснение: в некоторых случаях, в частности, при доставке NDR (сообщение о невозможности доставки), DSN (сообщение подтверждения доставки) и некоторых автоответах, адрес отправителя в SMTP-конверте (envelope-from) является пустым. В таком случае SPF проверяет имя хоста из команды HELO/EHLO. Необходимо проверить, какое имя используется в данной команде (например, заглянув в конфигурацию сервера или отправив письмо на публичный сервер и посмотрев заголовки) и прописать для него SPF. Спамерам совершенно не обязательно слать спам с тех же доменов, с которых вы отправляете письма, они могут отправлять от имени любого хоста, имеющего A- или MX-запись. Поэтому, если вы публикуете SPF из альтруистических соображений, то надо добавлять SPF для всех таких записей, и желательно еще wildcard (*) для несуществующих записей.


8. Заблуждение: лучше добавлять в DNS запись специального типа SPF, а не TXT


На самом деле: надо добавлять запись типа TXT.


Объяснение: в текущей версии стандарта SPF (RFC 7208) записи типа SPF являются deprecated и не должны больше использоваться.


9. Заблуждение: чем больше всего (a, mx, ptr, include) я включу в SPF-запись, тем лучше, потому что меньше вероятность ошибиться


На самом деле: по возможности, следует максимально сократить SPF-запись и использовать в ней только адреса сетей через IP4/IP6.


Объяснение: на разрешение SPF-политики отведен лимит в 10 DNS-запросов. Его превышение приведет к постоянной ошибке политики (permerror). Кроме того, DNS является ненадежной службой, и для каждого запроса есть вероятность сбоя (temperror), которая возрастает с количеством запросов. Каждая дополнительная запись a или include требует дополнительного DNS-запроса, для include также необходимо запросить всё, что указано в include-записи. mx требует запроса MX-записей и дополнительного запроса A-записи для каждого MX-сервера. ptr требует дополнительного запроса, к тому же в принципе является небезопасной. Только адреса сетей, перечисленные через IP4/IP6, не требуют дополнительных DNS-запросов.


10. Заблуждение: TTL для SPF-записи следует сделать поменьше (побольше)


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


Объяснение: более высокий TTL снижает вероятность ошибок DNS и, как следствие, temperror SPF, но повышает время реакции при необходимости внесения изменений в SPF-запись.


11. Заблуждение: если я не знаю, с каких IP могут уходить мои письма, то лучше опубликовать политику с +all


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


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


12. Заблуждение: SPF бесполезен


На самом деле: SPF необходим.


Объяснение: SPF — это один из механизмов авторизации отправителя в электронной почте и способ идентификации домена в репутационных системах. В настоящее время крупные провайдеры почтовых сервисов постепенно начинают требовать наличие авторизации писем, и на письма, не имеющие авторизации, могут накладываться «штрафные санкции» по их доставке или отображению пользователю. Кроме того, на письма, не прошедшие SPF-авторизации, могут не возвращаться автоответы и отчеты о доставке или невозможности доставки. Причина в том, что эти категории ответов, как правило, идут именно на адрес SMTP-конверта и требуют, чтобы он был авторизован. Поэтому SPF необходим даже в том случае, если все письма авторизованы DKIM. Также SPF совершенно необходим в IPv6-сетях и облачных сервисах: в таких сетях практически невозможно использовать репутацию IP-адреса и письма с адресов, не авторизованных SPF, как правило, не принимаются. Одна из основных задач SPF, определенная в стандарте — как раз использование репутации доменного имени вместо репутации IP.


13. Заблуждение: SPF самодостаточен


На самом деле: необходимы также DKIM и DMARC.


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


14. Заблуждение: одна SPF-запись — хорошо, а две — лучше


На самом деле: запись должна быть ровно одна.


Объяснение: это требование стандарта. Если записей будет более одной, это приведет к постоянной ошибке (permerror). Если необходимо объединить несколько SPF-записей, опубликуйте запись с несколькими include.


15. Заблуждение: spf1 хорошо, spf2.0 — лучше


На самом деле: надо использовать v=spf1.


Объяснение: spf2.0 не существует. Публикация записи spf2.0 может приводить к непредсказуемым результатам. spf2.0 никогда не существовал и не был стандартом, но отсылка на него есть в экспериментальном стандарте RFC 4406 (Sender ID), который писался в предположении, что такой стандарт будет принят, ведь его принятие обсуждалось на тот момент. Sender ID, который должен был решить проблему подмены адресов, не стал общепринятым стандартом и от него следует отказаться в пользу DMARC. Даже в том случае, если вы решаете использовать Sender ID и опубликовать spf2.0 запись, она не заменит записи spf1.


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


  1. SPF-политика должна заканчиваться директивой all или redirect. После этих директив ничего идти не должно.
  2. Директивы all или redirect могут встретиться в политике ровно один раз, они заменяют друг друга (то есть в одной политике не может быть all и redirect одновременно).
  3. Директива include не заменяет директивы all или redirect. include может встретиться в политике несколько раз, при этом политику всё равно следует завершать директивами all или redirect. Политика, включаемая через include или redirect, также должна быть валидной политикой, оканчивающейся на директиву all или redirect. При этом для include безразлично, какое правило (-all, ~all, ?all) используется для all во включаемой политике, а для redirect разница есть.
  4. Директива include используется с двоеточием (include:example.com), директива redirect — со знаком равенства (redirect=example.com).
  5. SPF не распространяется на поддомены. SPF. Не. Распространяется. На. Поддомены. SPF НЕ РАСПРОСТРАНЯЕТСЯ НА ПОДДОМЕНЫ. (а DMARC, по умолчанию, распространяется). Надо публиковать SPF для каждой записи A или MX в DNS, по которой производится (или может производиться) доставка почты.


Резюме


  • Обязательно создайте политику для всех MX- и, желательно, A-записей.
  • Добавьте SPF-политики для имен, используемых в HELO/EHLO почтового сервера.
  • Публикуйте SPF-политику как TXT-запись с v=spf1 в DNS.
  • В политике преимущественно используйте адреса сетей заданные через IP4/IP6. Располагайте их в начале политики, чтобы избежать лишних DNS-запросов. Минимизируйте использование include, не используйте без необходимости a, без крайней и непреодолимой необходимости не используйте mx и никогда не используйте ptr.
  • Указывайте ~all для доменов, с которых реально отправляются письма, -all — для неиспользуемых доменов и записей.
  • Используйте маленькие TTL на период внедрения и тестирования, затем повысьте TTL до разумных значений. Перед необходимостью внесения изменений заблаговременно снижайте TTL.
  • Обязательно тестируйте правильность SPF-политики, например, здесь.
  • Не ограничивайтесь только SPF, постарайтесь внедрить DKIM и обязательно внедрите DMARC. DMARC поможет защитить ваши письма от подделок и позволит вам получать информацию по нарушениям SPF. Это позволит выявить подделки, непрямые потоки писем и ошибки конфигурации.
  • После внедрения SPF, DKIM и/или DMARC проверьте их с помощью сервиса https://postmaste/security/.
  • SPF и DMARC проверяются по текущему состоянию, наличие DKIM проверяется по статистическим данным за предыдущий день и будет показываться только при наличии переписки с ящиками на Mail.Ru в предшествующий день или ранее.

Пример политики SPF: @ IN TXT "v=spf1 ip4:1.2.3.0/24 include:_spf.myesp.example.com ~all"

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

https://habrahabr.ru/post/338700/


Метки:  

[Перевод] Коннектор Azure Container Instances для Kubernetes

Вторник, 26 Сентября 2017 г. 11:46 + в цитатник
stasus сегодня в 11:46 Разработка

Коннектор Azure Container Instances для Kubernetes

  • Перевод
Несколько месяцев назад я рассказывал вам о выходе новой службы экземпляров контейнеров Azure (Azure Container Instances, ACI), которая максимально упрощает развёртывание контейнеров. Сегодня речь пойдёт о коннекторе Azure Container Instances для Kubernetes, который позволяет развертывать экземпляры службы контейнеров Azure в кластерах Kubernetes.

Этот коннектор является экспериментальным и его не следует использовать для реальных проектов.



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

Принципы работы


Грубо говоря, коннектор ACI Connector имитирует интерфейс Kubelet следующим образом:

  • регистрируется в Kubernetes как узел (node) с неограниченными ресурсами;
  • отправляет поды (pod) на исполнение в службу экземпляров контейнеров Azure вместо нод на виртуальных машин.

После того как коннектор регистрируется в качестве узла с именем aci-connector, можно указать nodeName: aci-connector в конфигурации пода, чтобы запустить его через службу экземпляров контейнеров Azure. Поды, в конфигурации которых этот узел не указан, запускаются по расписанию в обычном режиме. Ниже даны инструкции по использованию соединителя ACI Connector и планировщика Kubernetes с помощью ограничений и допусков(taints и tolerations).

ACI connector k8s

Требования


  1. Работающий клиент командной строки az — установить Azure CLI 2.0.
  2. Кластер Kubernetes с рабочим kubectl — настроить кластер Kubernetes в Azure.

Текущие возможности


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


Текущие ограничения


Следующие функции Kubernetes в настоящее время не поддерживаются коннектором aci-connector:

  • ConfigMaps
  • Secrets
  • ServiceAccounts
  • Volumes
  • kubectl logs
  • kubectl exec

Как быстро попробовать


  1. Отредактируйте файл examples/aci-connector.yaml и укажите переменные среды.
  2. Запустите коннектор ACI Connector командой kubectl create -f examples/aci-connector.yaml.
  3. Дождитесь, пока команда kubectl get nodes отобразит узел aci-connector.
  4. Запустите под NGINX через ACI командой kubectl create -f examples/nginx-pod.yaml.
  5. Откройте под NGINX с помощью его общедоступного адреса.

Пошаговая инструкция


Создайте группу ресурсов


Коннектор ACI Connector создаст каждый экземпляр контейнера в указанной группе ресурсов. Новую группу ресурсов можно создать следующей командой:

$ az group create -n aci-test -l westus
{
  "id": "/subscriptions//resourceGroups/aci-test",
  "location": "westus",
  "managedBy": null,
  "name": "aci-test",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Отредактируйте examples/aci-connector.yaml и укажите имя группы ресурсов в переменной среды ACI_RESOURCE_GROUP.

Создайте Service Principal


Service Principal необходим для создания ресурсов в вашей подписке Azure с помощью коннектора ACI Connector. Создать Service Principal можно с помощью Azure CLI в соответсвии с инструкцией ниже.

Найдите subscriptionId с помощью Azure CLI:

$ az account list -o table
Name                                             CloudName    SubscriptionId                        State    IsDefault
-----------------------------------------------  -----------  ------------------------------------  -------  -----------
Pay-As-You-Go                                    AzureCloud   12345678-9012-3456-7890-123456789012  Enabled  True

С помощью az создайте субъекта-службу, который будет оперировать вашей подпиской:

$ az ad sp create-for-rbac --role=Contributor --scopes /subscriptions//
{
  "appId": "",
  "displayName": "azure-cli-2017-07-19-19-13-19",
  "name": "http://azure-cli-2017-07-19-19-13-19",
  "password": "",
  "tenant": ""
}

Отредактируйте файл examples/aci-connector.yaml и введите переменные среды, используя указанные выше значения:

  • AZURE_CLIENT_ID: введите идентификатор приложения appId.
  • AZURE_CLIENT_KEY: введите пароль.
  • AZURE_TENANT_ID: укажите тенант.
  • AZURE_SUBSCRIPTION_ID: введите идентификатор подписки subscriptionId.

Убедитесь, что провайдер Microsoft.ContainerInstance зарегистрирован


$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance             NotRegistered

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

$ az provider register -n Microsoft.ContainerInstance
$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance             Registered

Установите коннектор ACI Connector


$ kubectl create -f examples/aci-connector.yaml 
deployment "aci-connector" created

$ kubectl get nodes -w
NAME                        STATUS                     AGE       VERSION
aci-connector               Ready                      3s        1.6.6
k8s-agentpool1-31868821-0   Ready                      5d        v1.7.0
k8s-agentpool1-31868821-1   Ready                      5d        v1.7.0
k8s-agentpool1-31868821-2   Ready                      5d        v1.7.0
k8s-master-31868821-0       Ready,SchedulingDisabled   5d        v1.7.0

Установите соединитель ACI Connector с Helm (опционально)


Сначала укажите значения в файле values.yaml, находящемся в каталоге /charts/aci-connector.

Затем можно установить чарт:

$ helm install --name my-release ./charts/aci-connector

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

$ helm install --name my-release --set env.azureClientId=YOUR-AZURECLIENTID,env.azureClientKey=YOUR-AZURECLIENTKEY,env.azureTenantId=YOUR-AZURETENANTID,env.azureSubscriptionId=YOUR-AZURESUBSCRIPTIONID,env.aciResourceGroup=YOUR-ACIRESOURCEGROUP,env.aciRegion=YOUR-ACI-REGION ./charts/aci-connector

Установите пример c NGINX


$ kubectl create -f examples/nginx-pod.yaml 
pod "nginx" created

$ kubectl get po -w -o wide
NAME          READY     STATUS    RESTARTS   AGE       IP             NODE
aci-connector-3396840456-v75q2  1/1       Running   0          44s       10.244.2.21    k8s-agentpool1-31868821-2
nginx         1/1       Running   0          31s       13.88.27.150   aci-connector

Обратите внимание, что под развёрнут на узле aci-connector. Теперь он должен быть доступен через указанный открытый IP-адрес.

Использование планировщика Kubernetes


В примере в nginx-pod имя узла задано жестко, однако можно также использовать планировщик Kubernetes.

Виртуальный узел aci имеет ограничение (taint) (azure.com/aci) с эффектом NoSchedule по умолчанию. Это означает, что по умолчанию поды не запускаются на узле aci, если они не размещаются там явно.

Тем не менее планировщик Kubernetes может включать под, который допускает (tolerates) это ограничение, в график узла aci.

Ссылка на пример пода с таким допуском.

Воспользоваться этим подом легко:

$ kubectl create -f examples/nginx-pod-tolerations.yaml

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

Для того чтобы принудительно развернуть под в службе экземпляров контейнеров Azure, можно явно указать NodeName, как в первом примере, либо удалить все остальные узлы кластера командой kubectl delete nodes <имя узла>. Третий вариант — развернуть в кластере другие рабочие нагрузки; в этом случае планировщик будет обязан запланировать выполнение вашей задачи через API службы экземпляров контейнеров Azure.

Использование сборок Canary


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

Для того чтобы воспользоваться последней версией Canary, вы можете установить пакет обновлений для своего соединителя aci-connector и обновить тег контейнера, используя следующую команду:

$ kubectl set image deploy/aci-connector aci-connector=microsoft/aci-connector-k8s:canary
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338686/


Метки:  

[Перевод] Коннектор Azure Container Instances для Kubernetes

Вторник, 26 Сентября 2017 г. 11:46 + в цитатник
stasus сегодня в 11:46 Разработка

Коннектор Azure Container Instances для Kubernetes

  • Перевод
Несколько месяцев назад я рассказывал вам о выходе новой службы экземпляров контейнеров Azure (Azure Container Instances, ACI), которая максимально упрощает развёртывание контейнеров. Сегодня речь пойдёт о коннекторе Azure Container Instances для Kubernetes, который позволяет развертывать экземпляры службы контейнеров Azure в кластерах Kubernetes.

Этот коннектор является экспериментальным и его не следует использовать для реальных проектов.



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

Принципы работы


Грубо говоря, коннектор ACI Connector имитирует интерфейс Kubelet следующим образом:

  • регистрируется в Kubernetes как узел (node) с неограниченными ресурсами;
  • отправляет поды (pod) на исполнение в службу экземпляров контейнеров Azure вместо нод на виртуальных машин.

После того как коннектор регистрируется в качестве узла с именем aci-connector, можно указать nodeName: aci-connector в конфигурации пода, чтобы запустить его через службу экземпляров контейнеров Azure. Поды, в конфигурации которых этот узел не указан, запускаются по расписанию в обычном режиме. Ниже даны инструкции по использованию соединителя ACI Connector и планировщика Kubernetes с помощью ограничений и допусков(taints и tolerations).

ACI connector k8s

Требования


  1. Работающий клиент командной строки az — установить Azure CLI 2.0.
  2. Кластер Kubernetes с рабочим kubectl — настроить кластер Kubernetes в Azure.

Текущие возможности


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


Текущие ограничения


Следующие функции Kubernetes в настоящее время не поддерживаются коннектором aci-connector:

  • ConfigMaps
  • Secrets
  • ServiceAccounts
  • Volumes
  • kubectl logs
  • kubectl exec

Как быстро попробовать


  1. Отредактируйте файл examples/aci-connector.yaml и укажите переменные среды.
  2. Запустите коннектор ACI Connector командой kubectl create -f examples/aci-connector.yaml.
  3. Дождитесь, пока команда kubectl get nodes отобразит узел aci-connector.
  4. Запустите под NGINX через ACI командой kubectl create -f examples/nginx-pod.yaml.
  5. Откройте под NGINX с помощью его общедоступного адреса.

Пошаговая инструкция


Создайте группу ресурсов


Коннектор ACI Connector создаст каждый экземпляр контейнера в указанной группе ресурсов. Новую группу ресурсов можно создать следующей командой:

$ az group create -n aci-test -l westus
{
  "id": "/subscriptions//resourceGroups/aci-test",
  "location": "westus",
  "managedBy": null,
  "name": "aci-test",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Отредактируйте examples/aci-connector.yaml и укажите имя группы ресурсов в переменной среды ACI_RESOURCE_GROUP.

Создайте Service Principal


Service Principal необходим для создания ресурсов в вашей подписке Azure с помощью коннектора ACI Connector. Создать Service Principal можно с помощью Azure CLI в соответсвии с инструкцией ниже.

Найдите subscriptionId с помощью Azure CLI:

$ az account list -o table
Name                                             CloudName    SubscriptionId                        State    IsDefault
-----------------------------------------------  -----------  ------------------------------------  -------  -----------
Pay-As-You-Go                                    AzureCloud   12345678-9012-3456-7890-123456789012  Enabled  True

С помощью az создайте субъекта-службу, который будет оперировать вашей подпиской:

$ az ad sp create-for-rbac --role=Contributor --scopes /subscriptions//
{
  "appId": "",
  "displayName": "azure-cli-2017-07-19-19-13-19",
  "name": "http://azure-cli-2017-07-19-19-13-19",
  "password": "",
  "tenant": ""
}

Отредактируйте файл examples/aci-connector.yaml и введите переменные среды, используя указанные выше значения:

  • AZURE_CLIENT_ID: введите идентификатор приложения appId.
  • AZURE_CLIENT_KEY: введите пароль.
  • AZURE_TENANT_ID: укажите тенант.
  • AZURE_SUBSCRIPTION_ID: введите идентификатор подписки subscriptionId.

Убедитесь, что провайдер Microsoft.ContainerInstance зарегистрирован


$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance             NotRegistered

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

$ az provider register -n Microsoft.ContainerInstance
$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance             Registered

Установите коннектор ACI Connector


$ kubectl create -f examples/aci-connector.yaml 
deployment "aci-connector" created

$ kubectl get nodes -w
NAME                        STATUS                     AGE       VERSION
aci-connector               Ready                      3s        1.6.6
k8s-agentpool1-31868821-0   Ready                      5d        v1.7.0
k8s-agentpool1-31868821-1   Ready                      5d        v1.7.0
k8s-agentpool1-31868821-2   Ready                      5d        v1.7.0
k8s-master-31868821-0       Ready,SchedulingDisabled   5d        v1.7.0

Установите соединитель ACI Connector с Helm (опционально)


Сначала укажите значения в файле values.yaml, находящемся в каталоге /charts/aci-connector.

Затем можно установить чарт:

$ helm install --name my-release ./charts/aci-connector

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

$ helm install --name my-release --set env.azureClientId=YOUR-AZURECLIENTID,env.azureClientKey=YOUR-AZURECLIENTKEY,env.azureTenantId=YOUR-AZURETENANTID,env.azureSubscriptionId=YOUR-AZURESUBSCRIPTIONID,env.aciResourceGroup=YOUR-ACIRESOURCEGROUP,env.aciRegion=YOUR-ACI-REGION ./charts/aci-connector

Установите пример c NGINX


$ kubectl create -f examples/nginx-pod.yaml 
pod "nginx" created

$ kubectl get po -w -o wide
NAME          READY     STATUS    RESTARTS   AGE       IP             NODE
aci-connector-3396840456-v75q2  1/1       Running   0          44s       10.244.2.21    k8s-agentpool1-31868821-2
nginx         1/1       Running   0          31s       13.88.27.150   aci-connector

Обратите внимание, что под развёрнут на узле aci-connector. Теперь он должен быть доступен через указанный открытый IP-адрес.

Использование планировщика Kubernetes


В примере в nginx-pod имя узла задано жестко, однако можно также использовать планировщик Kubernetes.

Виртуальный узел aci имеет ограничение (taint) (azure.com/aci) с эффектом NoSchedule по умолчанию. Это означает, что по умолчанию поды не запускаются на узле aci, если они не размещаются там явно.

Тем не менее планировщик Kubernetes может включать под, который допускает (tolerates) это ограничение, в график узла aci.

Ссылка на пример пода с таким допуском.

Воспользоваться этим подом легко:

$ kubectl create -f examples/nginx-pod-tolerations.yaml

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

Для того чтобы принудительно развернуть под в службе экземпляров контейнеров Azure, можно явно указать NodeName, как в первом примере, либо удалить все остальные узлы кластера командой kubectl delete nodes <имя узла>. Третий вариант — развернуть в кластере другие рабочие нагрузки; в этом случае планировщик будет обязан запланировать выполнение вашей задачи через API службы экземпляров контейнеров Azure.

Использование сборок Canary


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

Для того чтобы воспользоваться последней версией Canary, вы можете установить пакет обновлений для своего соединителя aci-connector и обновить тег контейнера, используя следующую команду:

$ kubectl set image deploy/aci-connector aci-connector=microsoft/aci-connector-k8s:canary
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338686/


Метки:  

Начальник, что мне делать для того, чтобы получать больше денег

Вторник, 26 Сентября 2017 г. 11:40 + в цитатник
digore сегодня в 11:40 Управление

Начальник, что мне делать для того, чтобы получать больше денег

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

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


    «Белая» версия событий
    Предположим, Иван показывает свою позицию менеджеру: «Что я могу сделать в нашей компании для того, чтобы получать +30%»

    Позиция Ивана:

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

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

    • Иван – проактивный человек, проявляет лидерские качества, возможно, сможет расти в руководителя группы
    • Иван лоялен к компании, ведь первым начинает разговор со своим менеджером, а не идет на собеседование
    • Иван готов, возможно, к дополнительной работе
    • если планировалось повышение только +10% в этом году, можно рассмотреть Ивана для продвижения по карьерной лестнице и дать ему желаемые 30%.

    В таких переговорах есть большая вероятность, что Иван и Менеджер договорятся и найдут решение в стиле WIN-WIN:

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

    Очевидно, возможны и крайние случаи:

    • Иван запросит +100%, вряд ли в какой компании смогут организовать такое большое повышение
    • Менеджер по разным причинам не сможет найти варианты для повышения сотрудника.

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

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

    «Черная» версия событий (или как это происходит в реальности)
    Ивану проще оказывается сходить на работный портал и посмотреть новые вакансии, откликнуться на те, которые удовлетворяют его текущей оценке себя на рынке труда. Далее он проходит собеседование, приходит к менеджеру с job-offer и начинается веселая игра.
    Если сотрудник просто недоволен своей зарплатой и не так давно страдал от ее неповышения, в целом, хочет остаться в компании, то он говорит менеджеру:
    — Смотри, у меня job-offer, я стою на рынке столько-то, а вы мне платите меньше. Что вы можете мне предложить?
    Если сотрудник давно был демотивирован низкой зарплатой и считает ее гораздо ниже средней, то он просто говорит:
    — У меня есть job-offer, вот заявление, я ухожу.
    Если менеджер хочет сохранить сотрудника для компании, то он начнет искать пути удовлетворения его потребностей: повысить зарплату, найти интересные проекты, дать бонусы и т.д. И это невыигрышная ситуация для обоих:

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

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

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

    А ваши сотрудники или вы сами когда-нибудь задавали вопрос из названия? Может быть, вы сами когда-то делали так? Возможно, кто-то завтра собирается подойти к своему менеджеру и задать «правильный» вопрос?

    P.S. Автор однажды и сам так делал. Автору повезло, что его руководитель – Менеджер. Но это совсем другая история.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338674/


    Метки:  

    Начальник, что мне делать для того, чтобы получать больше денег

    Вторник, 26 Сентября 2017 г. 11:40 + в цитатник
    digore сегодня в 11:40 Управление

    Начальник, что мне делать для того, чтобы получать больше денег

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

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


      «Белая» версия событий
      Предположим, Иван показывает свою позицию менеджеру: «Что я могу сделать в нашей компании для того, чтобы получать +30%»

      Позиция Ивана:

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

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

      • Иван – проактивный человек, проявляет лидерские качества, возможно, сможет расти в руководителя группы
      • Иван лоялен к компании, ведь первым начинает разговор со своим менеджером, а не идет на собеседование
      • Иван готов, возможно, к дополнительной работе
      • если планировалось повышение только +10% в этом году, можно рассмотреть Ивана для продвижения по карьерной лестнице и дать ему желаемые 30%.

      В таких переговорах есть большая вероятность, что Иван и Менеджер договорятся и найдут решение в стиле WIN-WIN:

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

      Очевидно, возможны и крайние случаи:

      • Иван запросит +100%, вряд ли в какой компании смогут организовать такое большое повышение
      • Менеджер по разным причинам не сможет найти варианты для повышения сотрудника.

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

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

      «Черная» версия событий (или как это происходит в реальности)
      Ивану проще оказывается сходить на работный портал и посмотреть новые вакансии, откликнуться на те, которые удовлетворяют его текущей оценке себя на рынке труда. Далее он проходит собеседование, приходит к менеджеру с job-offer и начинается веселая игра.
      Если сотрудник просто недоволен своей зарплатой и не так давно страдал от ее неповышения, в целом, хочет остаться в компании, то он говорит менеджеру:
      — Смотри, у меня job-offer, я стою на рынке столько-то, а вы мне платите меньше. Что вы можете мне предложить?
      Если сотрудник давно был демотивирован низкой зарплатой и считает ее гораздо ниже средней, то он просто говорит:
      — У меня есть job-offer, вот заявление, я ухожу.
      Если менеджер хочет сохранить сотрудника для компании, то он начнет искать пути удовлетворения его потребностей: повысить зарплату, найти интересные проекты, дать бонусы и т.д. И это невыигрышная ситуация для обоих:

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

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

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

      А ваши сотрудники или вы сами когда-нибудь задавали вопрос из названия? Может быть, вы сами когда-то делали так? Возможно, кто-то завтра собирается подойти к своему менеджеру и задать «правильный» вопрос?

      P.S. Автор однажды и сам так делал. Автору повезло, что его руководитель – Менеджер. Но это совсем другая история.
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338674/


      Метки:  

      Я б в программеры пошёл, пусть меня научат

      Вторник, 26 Сентября 2017 г. 11:18 + в цитатник
      Free_Mic_RS сегодня в 11:18 Разное

      Я б в программеры пошёл, пусть меня научат

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

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


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

        Вузы, вы больны


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

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

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

        Что плохо в современном вузовском образовании?

        • Устаревшая материально-техническая база и устаревшие учебные планы — согласитесь, странно изучать Windows Server 2003 или Pascal в 2017 году.
        • Преподаватели-теоретики, некоторые из которых просто прошли курсы повышения квалификации и, например из математика превратились в преподавателя по алгоритмам и структурам данных.
        • Отсутствие практики — согласитесь, формальный месяц, за который студенты дважды посещают базу практики, совершенно не то, что нужно разработчикам или инженерам. В то время как вуз может запросто давать первичный и довольно глубокий опыт, припахивая студентов к внутренним проектам или грантам.

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

        Почему это важно:

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

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

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


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

        Рассматривалось три варианта:

        1. магистратура мехмата — была отвергнута из-за того, что в учебном плане было до кучи ненужного, а времени ушло бы три года. Ну и дорого, конечно;
        2. дополнительное образование в университете — было отвергнуто из-за устаревшей программы (как вам офисное программирование VBA или Access как изучаемая СУБД?) и изученного списка преподавателей-теоретиков;
        3. обучение в корпоративном институте крупнейшей компании-разработчика в городе. Учебный план был актуальный, стек интересный, длина — год (по факту почти полтора), преподаватели — исключительно практики. Бонусом было 100 часов английского — на тот момент не знала его вообще, моим первым иностранным был французский. Курс назывался «Разработка программного обеспечения».

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

        Первое и главное: корпоративный университет (даже если это базовая кафедра вуза, свой факультет и т.д.) — это всегда интерес компании. Фактически она готовит кадры для себя, и нужно быть готовым к тому, что на вас перенесут часть корпоративных стандартов. И если для студентов и молодых специалистов это шанс получить и практику, и работу, то взрослым специалистам такая «профильность» может мешать. Например, у нас С, С++ и Java превалировали над всеми предметами, а тот же Python прошёл почти мимо — мы на нём успели написать телепрограмму, турнирную таблицу матчей и календарь с рассылкой напоминалок на e-mail. Опять же, с точки зрения операционных систем нам дали только UNIX — правда, очень круто. Но об этом чуть ниже.

        Итак, минусы:

        • корпоративный интерес и корпоративный стек
        • профильные задачи на практике

        Плюсы:

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

        Группы сформированы неоднородно — видимо, руководство корпоративного университета рассчитывает на сознательность слушателей. В общем, у нас было 16 человек — 5 девушек, 11 парней, все разные: от нулевого уровня типа меня до высокого уровня профессиональных программистов (был С-шник и реально мощный тимлид 1С-овец). Закончили и защитились семеро, девушек — две. При этом перед поступлением проводится тестирование и собеседование для определения уровня английского языка и распределения по группам. А вот собеседование на уровень знания технологий — нет.

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

        А теперь про UNIX. И лекции, и практику вели сильнейшие парни, которые могли ответить на любой вопрос, как бы криво он ни был сформулирован. На практических занятиях на отстающих не забивали, а всей группой дотягивали того, кто запутался. Например, писали регулярки для девочки-дизайнера, разбирая с ней каждый элемент или сорок минут искали, почему у меня не компилился С-шный код в gcc (оказалось, в хедере была пропущена точка с запятой — классика). В итоге UNIX знали и сдали все, кто до него дожил, а я спустя полгода на раз-два прошла собеседование на позицию инженера по тестированию VoIP c кучей вопросов по командам bash.


        Итак, минусы:

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

        Плюсы:

        • разбираются самые нелепые и одновременно сложные вопросы
        • сильные, объясняя слабым, получают дополнительное развитие
        • появляется стимул рыться в литературе (правда, не у всех).

        А теперь о самом главном — о преподавании языков программирования и сопутствующей ИТ-инфраструктуры. Задачи отдалены от практики. Мы моделировали полёт бомбы на С, на нём же считали многочлены, программировали решето Эратосфена и работали с рядами Фибоначчи. На С++ мы писали и развивали карточку студента вплоть до применения деревьев. В этих задачах были упущены такие вопросы как безопасность, сетевая работа, проектирование и т.д. Разработка на практике выглядит, конечно же, совершенно иначе. И возможно, курс был бы ещё интереснее, если бы из наших выживших остатков группы сколотили настоящий отдел — senior, джуниоры, тестировщики, менеджер проектов. Тогда может и больше народу дошло бы до конца.

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

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

        Баги всегда рядом — стоит приступить к коду

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

        А вот что было по-настоящему неприятно — так это требование писать код на экзаменах и зачётах (да, они были!)…на листочке бумаги. Это вызывало ступор, трепет и блокировало мозги. То есть ты привык, что есть компилятор, что он твой помощник, что есть среда разработки, подсветка кода и тут — бац и ты уже пишешь на бумажке вот это:

        #include 
        int main()
        {
        int i, fact=1, n;
        cin>>n;
        for (i=1; i<=n; i++)
          {
          fact=fact*i;
          }
          cout << fact;
          return 0;
        }

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

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

        ООП виделось именно так

        Некоторые преподаватели были, что называется, «over qualified». Это умные и опытные тимлиды, для которых всё прозрачно и очевидно, поэтому они дают глубокий и качественный материал без основ — то есть фактически ничего, поскольку слушатели не включились в базу. Однако именно они транслировали практические ценности, рассказывали о продвинутых возможностях IDE (у нас были Visual Studio и Eclipse), открывали для тех, кто не знает, Хабр, книги Шилдта и Страуструпа. Кстати, что характерно, за почти полтора года обучения ни один преподаватель не произнёс слов «github» и «opensource». И это во многом было фатально — настолько, что даже наши решения и проекты ни у кого из нас почти не сохранились.

        Под конец курса случилась особая форма извращения, которая называлась «Управление проектами». Мы радовались, думая, что перед дипломом (да, был настоящий проект с защитой на английском языке) нас разгрузили. Но вместо этого на нас обрушилась вся мощь UML-диаграмм. Выше тройки не получил никто, одна из девушек дошла почти до конца, но не сдала экзамены именно из-за этого предмета. Но с другой стороны, именно с этим малоприятным занятием пришло понимание целостности и связности программного проекта. Так что всё не зря.

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

        • Обязательно должны быть введены понятия репозитория, структуры проекта, разделения задач программистов на проекте (junior, middle, senior).
        • Важно показывать роль книг, специализированных сайтов и опенсорса в обучении — только трое из нас купили учебники, только у одного был живой прокачанный аккаунт на Хабре и Тостере. И конечно, нужно обязательно рассказать о существовании курсов MIT, CS50 на русском, доступных записей лекций технических вузов. Примочки типа codecademy тоже не станут лишними в практике программирования — преподаватель просто обязан знать свой арсенал и транслировать его слушателям.
        • На лекциях у каждого слушателя должен быть включён ПК — это золотое, даже платиновое правило. Одно дело смотреть на магию на проекторе, другое — повторять это перед собой и ковыряться в коде. Да, это займёт больше времени, но оно и эффективнее. Сейчас я опять же по доброй воле учусь в том же месте на потоке «Администрирования Windows Server» (RegionSoft CRM — продукт по большей части виндовый, и нужно хорошо знать инфраструктурное окружение проекта) и это очень круто — когда каждое действие, каждую команду мы отрабатываем на виртуалке, причём нередко в нескольких вариантах — например, настраиваем систему через GUI, средствами командной строки и через скрипты/командлеты Power Shell). Во-первых, подключаются все типы человеческой памяти, во-вторых, происходит дополнительное обсуждение косяков и успехов друг друга.

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

        Как войти в айти


        Способ первый — полное самообразование


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

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

        1. Определиться, зачем вам нужно программирование или администрирование — для развития мозгов, своего проекта, смены работы, эмиграции, для того, чтобы выйти на новый уровень в текущей деятельности. Исходя из этого нужно задать сроки и интервалы обучения.
        2. Выбрать, с чего начать. Здесь все средства хороши, но как ни парадоксально, удачнее всего начинать с приложений вроде codecademy или книги «Python для чайников». Это не испортит вам стиль (его ещё нет), но доступным языком погрузит в основы и даст попробовать код «на пальцах».
        3. Расширить круг читаемой литературы, начать работать в IDE.
        4. Перестать бояться 127 ошибок в компиляторе, стать более внимательным к синтаксису.
        5. Начать работать со своим или опенсорсным проектом. До этого этапа мало кто доходит. Но если дошли, будьте уверены — всё сложится.

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

        Способ первый модифицированный — самообразование + наставник в компании или стажировка


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

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

        Способ второй — высшее образование (второе или дополнительное)


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

        Способ третий — корпоративный университет


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

        О самом главном — без чего не обойтись


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

        • Без непрерывной работы с кодом. Вы должны его писать, разбирать, искать пути оптимизации, просить критики в экспертных сообществах и уметь прислушиваться к ней (хотя вам скажут и про «вон из профессии», и про «руки из ж…», и про «говнокод». Это совершенно нормальный путь.
        • Без знания основ: позиционных систем счисления, устройства ПК, знания алгоритмов, работы с переменными, булевой алгебры, типизации и т.д. Большинство тех, кто хочет присоединиться к разработчикам, почему-то считают эти знания чем-то ненужным и погружаются сразу в готовые фрагменты кода, переделывая их и стряпая свой проект. Это неправильно — рано или поздно в проекте вы встретитесь именно с этими проблемами.
        • Без книг. Ни один гугл, Тостер, Stack overflow и ламповый форум SQL-щиков не заменит книг в плане глубины и основ. Конечно, в идеале это должны быть оригиналы книг зарубежных авторов, благо что сегодня на Amazon потрясающий ассортимент — от классического С до нейросетей и NLP (который natural language processing). Но и переводные издания радуют всё больше. Не бойтесь портить книгу — читайте её с карандашом, ручкой и чем угодно. И да, если в книге приведён код, то недостаточно его разглядывать — лучше воспроизвести его на ПК, скомпилировать, разобрать и вникнуть. От простого чтения кода пользы в разы меньше.
        • Без вопросов себе, преподавателю, гуглу, сообществу, наставнику. Идеальна схема выглядит так: слушаете лекцию, пишете базовые вещи, тут же отмечаете, что стоит изучить поглубже или узнать самому. На следующий день разбираете пометки, опять конспектируете самое важное. Затем практикуетесь в написании кода или, например, администрировании.
        • Без изучения сопутствующего окружения и ИТ-инфраструктуры. Да, можно написать небольшой сайт и даже разместить на нём, например, красивую галерею работ, но потолок придёт быстро, если вы не озаботились изучением вопросов нагрузки, безопасности данных, форм на сайте и т.д. Поэтому стоит изучать нужную технологию комплексно, захватывая остальные.

        Это самая точная картинка об изучении программирования

        • Без рефакторинга. При всём старании вы никогда не создадите совершенный код с первого раза. И с десятого не сотворите, это даже у опытных разработчиков не всегда быстро выходит. Но работая с кодом, продумывая варианты оптимизации, вы становитесь профессионалом, который способен не просто накодить, а сделать ПО работающим и качественным. Не бойтесь код-ревью.
        • Без проектирования. Если вы садитесь писать код, но не знаете, что вы пишете и как это должно работать, то вы просто тренируетесь в запоминании синтаксиса языка. Попробуйте нарисовать схему будущего приложения, установите, какие компоненты каким образом будут взаимодействовать, пропишите особенности и фичи. Так вам легче будет собрать проект и заставить его в конце концов работать.
        • Без знания устройства вашей IDE (среды разработки). Все современные среды напичканы кучей возможностей типа автоматической генерации кода, подсветки, элементов управления и т.д. Обязательно разбирайтесь с возможностями, читайте документацию, обращайте внимание на то, как вводится код, как собирается проект, как работает компилятор и отладчик.
        • Без понимания того, что такое библиотеки и как они работают. Во время обучения преподаватели иногда нас троллили — например, однажды мы долго прописывали функции арифметических операций и факториала, а потом нам показали math.h. Для целей обучения — полезный, весёлый и поучительный урок. Для целей работы — трата сил, времени и размножение костылей. Многое придумано до нас — достаточно взять, подключить и научиться использовать.
        • А ещё без тестирования, DevOps, документирования и т.д. Но это продвинутый уровень — как правило, этим занимаются уже на работе.
        • Без английского языка. Но это вы и без меня знаете. На английском доступны материалы, которые способны дать мощный толчок развитию профессионала. Их перевод зачастую выглядит тускло.

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

        https://habrahabr.ru/post/338664/


        Я б в программеры пошёл, пусть меня научат

        Вторник, 26 Сентября 2017 г. 11:18 + в цитатник
        Free_Mic_RS сегодня в 11:18 Разное

        Я б в программеры пошёл, пусть меня научат

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

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


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

          Вузы, вы больны


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

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

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

          Что плохо в современном вузовском образовании?

          • Устаревшая материально-техническая база и устаревшие учебные планы — согласитесь, странно изучать Windows Server 2003 или Pascal в 2017 году.
          • Преподаватели-теоретики, некоторые из которых просто прошли курсы повышения квалификации и, например из математика превратились в преподавателя по алгоритмам и структурам данных.
          • Отсутствие практики — согласитесь, формальный месяц, за который студенты дважды посещают базу практики, совершенно не то, что нужно разработчикам или инженерам. В то время как вуз может запросто давать первичный и довольно глубокий опыт, припахивая студентов к внутренним проектам или грантам.

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

          Почему это важно:

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

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

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


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

          Рассматривалось три варианта:

          1. магистратура мехмата — была отвергнута из-за того, что в учебном плане было до кучи ненужного, а времени ушло бы три года. Ну и дорого, конечно;
          2. дополнительное образование в университете — было отвергнуто из-за устаревшей программы (как вам офисное программирование VBA или Access как изучаемая СУБД?) и изученного списка преподавателей-теоретиков;
          3. обучение в корпоративном институте крупнейшей компании-разработчика в городе. Учебный план был актуальный, стек интересный, длина — год (по факту почти полтора), преподаватели — исключительно практики. Бонусом было 100 часов английского — на тот момент не знала его вообще, моим первым иностранным был французский. Курс назывался «Разработка программного обеспечения».

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

          Первое и главное: корпоративный университет (даже если это базовая кафедра вуза, свой факультет и т.д.) — это всегда интерес компании. Фактически она готовит кадры для себя, и нужно быть готовым к тому, что на вас перенесут часть корпоративных стандартов. И если для студентов и молодых специалистов это шанс получить и практику, и работу, то взрослым специалистам такая «профильность» может мешать. Например, у нас С, С++ и Java превалировали над всеми предметами, а тот же Python прошёл почти мимо — мы на нём успели написать телепрограмму, турнирную таблицу матчей и календарь с рассылкой напоминалок на e-mail. Опять же, с точки зрения операционных систем нам дали только UNIX — правда, очень круто. Но об этом чуть ниже.

          Итак, минусы:

          • корпоративный интерес и корпоративный стек
          • профильные задачи на практике

          Плюсы:

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

          Группы сформированы неоднородно — видимо, руководство корпоративного университета рассчитывает на сознательность слушателей. В общем, у нас было 16 человек — 5 девушек, 11 парней, все разные: от нулевого уровня типа меня до высокого уровня профессиональных программистов (был С-шник и реально мощный тимлид 1С-овец). Закончили и защитились семеро, девушек — две. При этом перед поступлением проводится тестирование и собеседование для определения уровня английского языка и распределения по группам. А вот собеседование на уровень знания технологий — нет.

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

          А теперь про UNIX. И лекции, и практику вели сильнейшие парни, которые могли ответить на любой вопрос, как бы криво он ни был сформулирован. На практических занятиях на отстающих не забивали, а всей группой дотягивали того, кто запутался. Например, писали регулярки для девочки-дизайнера, разбирая с ней каждый элемент или сорок минут искали, почему у меня не компилился С-шный код в gcc (оказалось, в хедере была пропущена точка с запятой — классика). В итоге UNIX знали и сдали все, кто до него дожил, а я спустя полгода на раз-два прошла собеседование на позицию инженера по тестированию VoIP c кучей вопросов по командам bash.


          Итак, минусы:

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

          Плюсы:

          • разбираются самые нелепые и одновременно сложные вопросы
          • сильные, объясняя слабым, получают дополнительное развитие
          • появляется стимул рыться в литературе (правда, не у всех).

          А теперь о самом главном — о преподавании языков программирования и сопутствующей ИТ-инфраструктуры. Задачи отдалены от практики. Мы моделировали полёт бомбы на С, на нём же считали многочлены, программировали решето Эратосфена и работали с рядами Фибоначчи. На С++ мы писали и развивали карточку студента вплоть до применения деревьев. В этих задачах были упущены такие вопросы как безопасность, сетевая работа, проектирование и т.д. Разработка на практике выглядит, конечно же, совершенно иначе. И возможно, курс был бы ещё интереснее, если бы из наших выживших остатков группы сколотили настоящий отдел — senior, джуниоры, тестировщики, менеджер проектов. Тогда может и больше народу дошло бы до конца.

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

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

          Баги всегда рядом — стоит приступить к коду

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

          А вот что было по-настоящему неприятно — так это требование писать код на экзаменах и зачётах (да, они были!)…на листочке бумаги. Это вызывало ступор, трепет и блокировало мозги. То есть ты привык, что есть компилятор, что он твой помощник, что есть среда разработки, подсветка кода и тут — бац и ты уже пишешь на бумажке вот это:

          #include 
          int main()
          {
          int i, fact=1, n;
          cin>>n;
          for (i=1; i<=n; i++)
            {
            fact=fact*i;
            }
            cout << fact;
            return 0;
          }

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

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

          ООП виделось именно так

          Некоторые преподаватели были, что называется, «over qualified». Это умные и опытные тимлиды, для которых всё прозрачно и очевидно, поэтому они дают глубокий и качественный материал без основ — то есть фактически ничего, поскольку слушатели не включились в базу. Однако именно они транслировали практические ценности, рассказывали о продвинутых возможностях IDE (у нас были Visual Studio и Eclipse), открывали для тех, кто не знает, Хабр, книги Шилдта и Страуструпа. Кстати, что характерно, за почти полтора года обучения ни один преподаватель не произнёс слов «github» и «opensource». И это во многом было фатально — настолько, что даже наши решения и проекты ни у кого из нас почти не сохранились.

          Под конец курса случилась особая форма извращения, которая называлась «Управление проектами». Мы радовались, думая, что перед дипломом (да, был настоящий проект с защитой на английском языке) нас разгрузили. Но вместо этого на нас обрушилась вся мощь UML-диаграмм. Выше тройки не получил никто, одна из девушек дошла почти до конца, но не сдала экзамены именно из-за этого предмета. Но с другой стороны, именно с этим малоприятным занятием пришло понимание целостности и связности программного проекта. Так что всё не зря.

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

          • Обязательно должны быть введены понятия репозитория, структуры проекта, разделения задач программистов на проекте (junior, middle, senior).
          • Важно показывать роль книг, специализированных сайтов и опенсорса в обучении — только трое из нас купили учебники, только у одного был живой прокачанный аккаунт на Хабре и Тостере. И конечно, нужно обязательно рассказать о существовании курсов MIT, CS50 на русском, доступных записей лекций технических вузов. Примочки типа codecademy тоже не станут лишними в практике программирования — преподаватель просто обязан знать свой арсенал и транслировать его слушателям.
          • На лекциях у каждого слушателя должен быть включён ПК — это золотое, даже платиновое правило. Одно дело смотреть на магию на проекторе, другое — повторять это перед собой и ковыряться в коде. Да, это займёт больше времени, но оно и эффективнее. Сейчас я опять же по доброй воле учусь в том же месте на потоке «Администрирования Windows Server» (RegionSoft CRM — продукт по большей части виндовый, и нужно хорошо знать инфраструктурное окружение проекта) и это очень круто — когда каждое действие, каждую команду мы отрабатываем на виртуалке, причём нередко в нескольких вариантах — например, настраиваем систему через GUI, средствами командной строки и через скрипты/командлеты Power Shell). Во-первых, подключаются все типы человеческой памяти, во-вторых, происходит дополнительное обсуждение косяков и успехов друг друга.

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

          Как войти в айти


          Способ первый — полное самообразование


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

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

          1. Определиться, зачем вам нужно программирование или администрирование — для развития мозгов, своего проекта, смены работы, эмиграции, для того, чтобы выйти на новый уровень в текущей деятельности. Исходя из этого нужно задать сроки и интервалы обучения.
          2. Выбрать, с чего начать. Здесь все средства хороши, но как ни парадоксально, удачнее всего начинать с приложений вроде codecademy или книги «Python для чайников». Это не испортит вам стиль (его ещё нет), но доступным языком погрузит в основы и даст попробовать код «на пальцах».
          3. Расширить круг читаемой литературы, начать работать в IDE.
          4. Перестать бояться 127 ошибок в компиляторе, стать более внимательным к синтаксису.
          5. Начать работать со своим или опенсорсным проектом. До этого этапа мало кто доходит. Но если дошли, будьте уверены — всё сложится.

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

          Способ первый модифицированный — самообразование + наставник в компании или стажировка


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

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

          Способ второй — высшее образование (второе или дополнительное)


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

          Способ третий — корпоративный университет


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

          О самом главном — без чего не обойтись


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

          • Без непрерывной работы с кодом. Вы должны его писать, разбирать, искать пути оптимизации, просить критики в экспертных сообществах и уметь прислушиваться к ней (хотя вам скажут и про «вон из профессии», и про «руки из ж…», и про «говнокод». Это совершенно нормальный путь.
          • Без знания основ: позиционных систем счисления, устройства ПК, знания алгоритмов, работы с переменными, булевой алгебры, типизации и т.д. Большинство тех, кто хочет присоединиться к разработчикам, почему-то считают эти знания чем-то ненужным и погружаются сразу в готовые фрагменты кода, переделывая их и стряпая свой проект. Это неправильно — рано или поздно в проекте вы встретитесь именно с этими проблемами.
          • Без книг. Ни один гугл, Тостер, Stack overflow и ламповый форум SQL-щиков не заменит книг в плане глубины и основ. Конечно, в идеале это должны быть оригиналы книг зарубежных авторов, благо что сегодня на Amazon потрясающий ассортимент — от классического С до нейросетей и NLP (который natural language processing). Но и переводные издания радуют всё больше. Не бойтесь портить книгу — читайте её с карандашом, ручкой и чем угодно. И да, если в книге приведён код, то недостаточно его разглядывать — лучше воспроизвести его на ПК, скомпилировать, разобрать и вникнуть. От простого чтения кода пользы в разы меньше.
          • Без вопросов себе, преподавателю, гуглу, сообществу, наставнику. Идеальна схема выглядит так: слушаете лекцию, пишете базовые вещи, тут же отмечаете, что стоит изучить поглубже или узнать самому. На следующий день разбираете пометки, опять конспектируете самое важное. Затем практикуетесь в написании кода или, например, администрировании.
          • Без изучения сопутствующего окружения и ИТ-инфраструктуры. Да, можно написать небольшой сайт и даже разместить на нём, например, красивую галерею работ, но потолок придёт быстро, если вы не озаботились изучением вопросов нагрузки, безопасности данных, форм на сайте и т.д. Поэтому стоит изучать нужную технологию комплексно, захватывая остальные.

          Это самая точная картинка об изучении программирования

          • Без рефакторинга. При всём старании вы никогда не создадите совершенный код с первого раза. И с десятого не сотворите, это даже у опытных разработчиков не всегда быстро выходит. Но работая с кодом, продумывая варианты оптимизации, вы становитесь профессионалом, который способен не просто накодить, а сделать ПО работающим и качественным. Не бойтесь код-ревью.
          • Без проектирования. Если вы садитесь писать код, но не знаете, что вы пишете и как это должно работать, то вы просто тренируетесь в запоминании синтаксиса языка. Попробуйте нарисовать схему будущего приложения, установите, какие компоненты каким образом будут взаимодействовать, пропишите особенности и фичи. Так вам легче будет собрать проект и заставить его в конце концов работать.
          • Без знания устройства вашей IDE (среды разработки). Все современные среды напичканы кучей возможностей типа автоматической генерации кода, подсветки, элементов управления и т.д. Обязательно разбирайтесь с возможностями, читайте документацию, обращайте внимание на то, как вводится код, как собирается проект, как работает компилятор и отладчик.
          • Без понимания того, что такое библиотеки и как они работают. Во время обучения преподаватели иногда нас троллили — например, однажды мы долго прописывали функции арифметических операций и факториала, а потом нам показали math.h. Для целей обучения — полезный, весёлый и поучительный урок. Для целей работы — трата сил, времени и размножение костылей. Многое придумано до нас — достаточно взять, подключить и научиться использовать.
          • А ещё без тестирования, DevOps, документирования и т.д. Но это продвинутый уровень — как правило, этим занимаются уже на работе.
          • Без английского языка. Но это вы и без меня знаете. На английском доступны материалы, которые способны дать мощный толчок развитию профессионала. Их перевод зачастую выглядит тускло.

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

          https://habrahabr.ru/post/338664/


          Вторая версия Монитора качества воздуха

          Вторник, 26 Сентября 2017 г. 11:09 + в цитатник
          Migrator сегодня в 11:09 Разработка

          Вторая версия Монитора качества воздуха

            image

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

            И вот появилась новая версия прибора.

            image

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

            image

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

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

            Новый датчик подключается по интерфейсу I2C прямо к уже установленным часам.
            image

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

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

            -> Тут можно взять новую прошивку
            -> Тут Архив с файлами скриптов
            -> Тут инструкция о том как самостоятельно собрать подобный прибор

            Инструкцию о том как прошивать контроллер можно посмотреть тут.



            Электрическая схема:


            Схема


            Монтажная плата: 



            Дополнительную информацию можно найти на моем сайте
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338722/


            Метки:  

            Вторая версия Монитора качества воздуха

            Вторник, 26 Сентября 2017 г. 11:09 + в цитатник
            Migrator сегодня в 11:09 Разработка

            Вторая версия Монитора качества воздуха

              image

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

              И вот появилась новая версия прибора.

              image

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

              image

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

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

              Новый датчик подключается по интерфейсу I2C прямо к уже установленным часам.
              image

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

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

              -> Тут можно взять новую прошивку
              -> Тут Архив с файлами скриптов
              -> Тут инструкция о том как самостоятельно собрать подобный прибор

              Инструкцию о том как прошивать контроллер можно посмотреть тут.



              Электрическая схема:


              Схема


              Монтажная плата: 



              Дополнительную информацию можно найти на моем сайте
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338722/


              Метки:  

              Используем PubNub: эмоциональный говорящий чат своими руками

              Вторник, 26 Сентября 2017 г. 10:45 + в цитатник
              Cromathaar сегодня в 10:45 Разработка

              Используем PubNub: эмоциональный говорящий чат своими руками

              • Tutorial
              image

              На удивление, в русскоязычном сегменте интернета (и на Хабре в том числе) до сих пор крайне мало информации о PubNub. Между тем, основанный в 2010-м году калифорнийский стартап успел за последние семь лет вырасти в то, что сама компания называет Global Data Stream Network (DSN), а по факту – IaaS-решение, направленное на удовлетворение нужд в области передачи сообщений в реальном времени. Наша компания – Distillery – является одним из на данный момент четырех development-партнеров PubNub, но сказано это не пустого бахвальства ради, а чтобы поделиться с сообществом вариантом использования PubNub на примере demo-проекта, который требовалось создать для получение оного статуса.

              Те, кому не терпится посмотреть на код (C# + JavaScript), могут сразу пройти в репозиторий на GitHub. Тех же, кому интересно, что умеет PubNub, и как это работает, прошу под кат.

              В целом PubNub предлагает три категории сервисов:

              • Realtime Messaging. API, реализующий механизм Publish/Subscribe, за которым стоит готовая глобальная инфраструктура, включающая в себя 15 распределенных по земному шару локаций с заявленным latency не более 250мс. Все это приправлено такими вкусными вещами как, например, поддержка высоконагруженных каналов, компрессия данных и автоматический бандлинг сообщений при нестабильной связи.
              • Presence. API для отслеживания состояния клиентов – от банального статуса онлайн/оффлайн до кастомных вещей вроде нотификаций о наборе сообщения.
              • Functions. Раньше эта функция называлась BLOCKS, но совсем недавно пережила ребрэндинг (точнее, все еще его переживает). Представляет собой скрипты, написанные на JavaScript и крутящиеся на серверах PubNub, с помощью которых можно фильтровать, агрегировать, трансформировать данные или, как мы вскоре увидим, осуществлять взаимодействие со сторонними сервисами.

              Для реализации всего это дела PubNub предлагает более 70-ти SDK для самых разнообразных языков программирования и платформ, в том числе и для IoT-решений на базе Arduino, RaspberryPi и даже Samsung Smart TV (полный список можно найти тут).

              Пожалуй, достаточно теории, перейдем к практике. Тестовое задание, предваряющее получение партнерского статуса, звучит следующим образом: «Создать проект на базе PubNub, используя два любых SDK и следующие функции: Presence, PAM и один BLOCK». PAM расшифровывается как PubNub Access Manager и является надстройкой над фреймворком безопасности, позволяющей контролировать доступ к каналу на уровне приложения, самого канала или конкретного пользователя. Поскольку задание сформулировано довольно расплывчато, это предоставляет достаточную волю фантазии, полет которой в итоге привел к не самой полезной, но весьма интересной идее говорящего чата. А чтобы было веселее, чат не просто озвучивается синтезатором речи, но еще и позволяет передавать вербальные эмоции.

              Собственно, само приложение концептуально простое донельзя – это двухстраничный веб-сайт. Изначально пользователь попадает на страницу логина, где и настоящей аутентификации-то на самом деле не происходит, и после ввода никнейма и выбора режима – полный или ReadOnly – переходит на страницу с чатом. На ней имеется «окно» с сообщениями канала, в том числе и системными а ля «Vasya joined the channel», поле для набора сообщений и выпадающий список с выбором эмоций. При получении новых сообщений от других пользователей оные сообщения зачитываются синтезатором речи с той эмоцией, которая была выставлена автором при отправке. Для перевода текста в речь используется стандартный BLOCK от IBM Watson, требующий минимальной настройки, в основном касающейся используемого голоса. На момент написания статьи эмоциональную речь поддерживали только три голоса: en-US_AllisonVoice (женский), en-US_LisaVoice (женский) и en-US_MichaelVoice (мужской). Еще пару месяцев назад делать это умела только Allison, так что, как говорится, прогресс налицо.

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

              public class HomeController : Controller
              {
                  public ActionResult Login()
                  {
                      return View();
                  }
              
                  [HttpPost]
                  public ActionResult Main(LoginDTO loginDTO)
                  {
                      String chatChannel = ConfigurationHelper.ChatChannel;
                      String textToSpeechChannel = ConfigurationHelper.TextToSpeechChannel;
                      String authKey = loginDTO.Username + DateTime.Now.Ticks.ToString();
              
                      var chatManager = new ChatManager();
                          
                      if (loginDTO.ReadAccessOnly)
                      {
                          chatManager.GrantUserReadAccessToChannel(authKey, chatChannel);
                      }
                      else
                      {
                          chatManager.GrantUserReadWriteAccessToChannel(authKey, chatChannel);
                      }
              
                      chatManager.GrantUserReadWriteAccessToChannel(authKey, textToSpeechChannel);
              
                      var authDTO = new AuthDTO()
                      {
                          PublishKey = ConfigurationHelper.PubNubPublishKey,
                          SubscribeKey = ConfigurationHelper.PubNubSubscribeKey,
                          AuthKey = authKey,
                          Username = loginDTO.Username,
                          ChatChannel = chatChannel,
                          TextToSpeechChannel = textToSpeechChannel
                      };
              
                      return View(authDTO);
                  }
              }
              

              Метод контроллера Main получает DTO от формы логина, извлекает информацию о каналах из конфигурационных данных (один канал для чата, второй для общения с IBM Watson), устанавливает уровень доступа посредством вызова соответствующих методов объекта класса ChatManager и отдает всю собранную информацию странице. Дальше всем занимается уже фронтенд. Для полноты картины приведем также листинг класса ChatManager, инкапсулирующего взаимодействие с SDK PubNub:

              public class ChatManager
              {
                  private const String PRESENCE_CHANNEL_SUFFIX = "-pnpres";
              
                  private Pubnub pubnub;
              
                  public ChatManager()
                  {
                      var pnConfiguration = new PNConfiguration();
                      pnConfiguration.PublishKey = ConfigurationHelper.PubNubPublishKey;
                      pnConfiguration.SubscribeKey = ConfigurationHelper.PubNubSubscribeKey;
                      pnConfiguration.SecretKey = ConfigurationHelper.PubNubSecretKey;
                      pnConfiguration.Secure = true;
              
                      pubnub = new Pubnub(pnConfiguration);
                  }
              
                  public void ForbidPublicAccessToChannel(String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel })
                          .Read(false)
                          .Write(false)
                          .Async(new AccessGrantResult());
                  }
              
                  public void GrantUserReadAccessToChannel(String userAuthKey, String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
                          .AuthKeys(new String[] { userAuthKey })
                          .Read(true)
                          .Write(false)
                          .Async(new AccessGrantResult());
                  }
              
                  public void GrantUserReadWriteAccessToChannel(String userAuthKey, String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
                          .AuthKeys(new String[] { userAuthKey })
                          .Read(true)
                          .Write(true)
                          .Async(new AccessGrantResult());
                  }
              }
              

              Здесь имеет смысл заострить внимание на константе PRESENCE_CHANNEL_SUFFIX. Дело в том, что механизм Presence для своих сообщений использует отдельный канал, который по имеющемуся соглашению утилизирует имя текущего канала с добавлением суффикса «-pnpres». Обратите внимание, что код PubNub Access Manager, выраженный в виде вызова функции Grant, требует явного указания Presence-канала для установки прав доступа.

              var pubnub;
              var chatChannel;
              var textToSpeechChannel;
              var username;
              
              function init(publishKey, subscribeKey, authKey, username, chatChannel, textToSpeechChannel) {
                  pubnub = new PubNub({
                      publishKey: publishKey,
                      subscribeKey: subscribeKey,
                      authKey: authKey,
                      uuid: username
                  });
              
                  this.username = username;
                  this.chatChannel = chatChannel;
                  this.textToSpeechChannel = textToSpeechChannel;
              
                  addListener();
                  subscribe();
              }
              

              Первое, что нам предстоит сделать в JavaScript-коде – это провести инициализацию соответствующего SDK. Для удобства и простоты некоторые сущности вынесены в глобальные переменные. После инициализации необходимо добавить слушателя для интересующих нас событий и подписаться на каналы чата, Presence и IBM Watson. Начнем с подписки:

              function subscribe() {
                  pubnub.subscribe({
                      channels: [chatChannel, textToSpeechChannel],
                      withPresence: true
                  });
              }
              

              Если код метода subscribe говорит сам за себя, то с методом addListener все немного сложнее:

              function addListener() {
                  pubnub.addListener({
                      status: function (statusEvent) {
                          if (statusEvent.category === "PNConnectedCategory") {
                              getOnlineUsers();
                          }
                      },
                      message: function (message) {
                          if (message.channel === chatChannel) {
                              var jsonMessage = JSON.parse(message.message);
                              var chat = document.getElementById("chat");
                              if (chat.value !== "") {
                                  chat.value = chat.value + "\n";
                                  chat.scrollTop = chat.scrollHeight;
                              }
              
                              chat.value = chat.value + jsonMessage.Username + ": " + 
                                  jsonMessage.Message;
                          }
                          else if (message.channel === textToSpeechChannel) {
                              if (message.publisher !== username) {
                                  var audio = new Audio(message.message.speech);
                                  audio.play();
                              }
                          }
                      },
                      presence: function (presenceEvent) {
                          if (presenceEvent.channel === chatChannel) {
                              if (presenceEvent.action === 'join') {
                                  if (!UserIsOnTheList(presenceEvent.uuid)) {
                                      AddUserToList(presenceEvent.uuid);
                                  }
              
                                  PutStatusToChat(presenceEvent.uuid, 
                                      "joins the channel");
                              }
                              else if (presenceEvent.action === 'timeout') {
                                  if (UserIsOnTheList(presenceEvent.uuid)) {
                                      RemoveUserFromList(presenceEvent.uuid);
                                  }
              
                                  PutStatusToChat(presenceEvent.uuid, 
                                      "was disconnected due to timeout");
                              }
                          }
                      }
                  });
              }
              

              Во-первых, мы подписываемся на событие «PNConnectedCategory», чтобы отловить момент присоединения к каналу текущего пользователя. Это важно, потому что получение и отображение списка всех участников необходимо вызывать лишь однажды, в то время как Presence-событие «join» срабатывает каждый раз при присоединении нового клиента. Во-вторых, при поимке события о новом сообщении, мы проверяем канал, которому это событие адресовано, и в зависимости от результата проверки либо формируем текстовое представление путем банальной конкатенации, либо инициализируем объект Audio пришедшей от IBM Watson ссылкой на аудио-файл и запускаем проигрывание.

              Еще одна интересная вещь происходит при отправке сообщения:

              function publish(message) {
                  var jsonMessage = {
                      "Username": username,
                      "Message": message
                  };
              
                  var publishConfig = {
                      channel: chatChannel,
                      message: JSON.stringify(jsonMessage)
                  };
              
                  pubnub.publish(publishConfig);
              
                  var emotedText = '';
              
                  var selectedEmotion = iconSelect.getSelectedValue();
              
                  if (selectedEmotion !== "") {
                      emotedText += '';
                  }
              
                  emotedText += message;
              
                  if (selectedEmotion !== "") {
                      emotedText += '';
                  }
              
                  emotedText += '';
              
                  jsonMessage = {
                      "text": emotedText
                  };
              
                  publishConfig = {
                      channel: textToSpeechChannel,
                      message: jsonMessage
                  };
              
                  pubnub.publish(publishConfig);
              }
              

              Сначала мы формируем само сообщение, затем определяем конфигурацию, которую понимает SDK, и только после этого инициируем отправку. Дальше лучше. Чтобы превратить текст в синтезированную речь, еще одно сообщение мы отправляем в канал IBM Watson. Для определения эмоциональной окраски используется Speech Synthesis Markup Language (SSML), а если конкретнее — тэг . Как вы уже наверняка догадываетесь, при отправке сообщения ReadOnly-пользователем, оно будет заблокировано механизмом PAM и так никогда и не найдет своего получателя.

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

              https://habrahabr.ru/post/338720/


              Метки:  

              Используем PubNub: эмоциональный говорящий чат своими руками

              Вторник, 26 Сентября 2017 г. 10:45 + в цитатник
              Cromathaar сегодня в 10:45 Разработка

              Используем PubNub: эмоциональный говорящий чат своими руками

              • Tutorial
              image

              На удивление, в русскоязычном сегменте интернета (и на Хабре в том числе) до сих пор крайне мало информации о PubNub. Между тем, основанный в 2010-м году калифорнийский стартап успел за последние семь лет вырасти в то, что сама компания называет Global Data Stream Network (DSN), а по факту – IaaS-решение, направленное на удовлетворение нужд в области передачи сообщений в реальном времени. Наша компания – Distillery – является одним из на данный момент четырех development-партнеров PubNub, но сказано это не пустого бахвальства ради, а чтобы поделиться с сообществом вариантом использования PubNub на примере demo-проекта, который требовалось создать для получение оного статуса.

              Те, кому не терпится посмотреть на код (C# + JavaScript), могут сразу пройти в репозиторий на GitHub. Тех же, кому интересно, что умеет PubNub, и как это работает, прошу под кат.

              В целом PubNub предлагает три категории сервисов:

              • Realtime Messaging. API, реализующий механизм Publish/Subscribe, за которым стоит готовая глобальная инфраструктура, включающая в себя 15 распределенных по земному шару локаций с заявленным latency не более 250мс. Все это приправлено такими вкусными вещами как, например, поддержка высоконагруженных каналов, компрессия данных и автоматический бандлинг сообщений при нестабильной связи.
              • Presence. API для отслеживания состояния клиентов – от банального статуса онлайн/оффлайн до кастомных вещей вроде нотификаций о наборе сообщения.
              • Functions. Раньше эта функция называлась BLOCKS, но совсем недавно пережила ребрэндинг (точнее, все еще его переживает). Представляет собой скрипты, написанные на JavaScript и крутящиеся на серверах PubNub, с помощью которых можно фильтровать, агрегировать, трансформировать данные или, как мы вскоре увидим, осуществлять взаимодействие со сторонними сервисами.

              Для реализации всего это дела PubNub предлагает более 70-ти SDK для самых разнообразных языков программирования и платформ, в том числе и для IoT-решений на базе Arduino, RaspberryPi и даже Samsung Smart TV (полный список можно найти тут).

              Пожалуй, достаточно теории, перейдем к практике. Тестовое задание, предваряющее получение партнерского статуса, звучит следующим образом: «Создать проект на базе PubNub, используя два любых SDK и следующие функции: Presence, PAM и один BLOCK». PAM расшифровывается как PubNub Access Manager и является надстройкой над фреймворком безопасности, позволяющей контролировать доступ к каналу на уровне приложения, самого канала или конкретного пользователя. Поскольку задание сформулировано довольно расплывчато, это предоставляет достаточную волю фантазии, полет которой в итоге привел к не самой полезной, но весьма интересной идее говорящего чата. А чтобы было веселее, чат не просто озвучивается синтезатором речи, но еще и позволяет передавать вербальные эмоции.

              Собственно, само приложение концептуально простое донельзя – это двухстраничный веб-сайт. Изначально пользователь попадает на страницу логина, где и настоящей аутентификации-то на самом деле не происходит, и после ввода никнейма и выбора режима – полный или ReadOnly – переходит на страницу с чатом. На ней имеется «окно» с сообщениями канала, в том числе и системными а ля «Vasya joined the channel», поле для набора сообщений и выпадающий список с выбором эмоций. При получении новых сообщений от других пользователей оные сообщения зачитываются синтезатором речи с той эмоцией, которая была выставлена автором при отправке. Для перевода текста в речь используется стандартный BLOCK от IBM Watson, требующий минимальной настройки, в основном касающейся используемого голоса. На момент написания статьи эмоциональную речь поддерживали только три голоса: en-US_AllisonVoice (женский), en-US_LisaVoice (женский) и en-US_MichaelVoice (мужской). Еще пару месяцев назад делать это умела только Allison, так что, как говорится, прогресс налицо.

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

              public class HomeController : Controller
              {
                  public ActionResult Login()
                  {
                      return View();
                  }
              
                  [HttpPost]
                  public ActionResult Main(LoginDTO loginDTO)
                  {
                      String chatChannel = ConfigurationHelper.ChatChannel;
                      String textToSpeechChannel = ConfigurationHelper.TextToSpeechChannel;
                      String authKey = loginDTO.Username + DateTime.Now.Ticks.ToString();
              
                      var chatManager = new ChatManager();
                          
                      if (loginDTO.ReadAccessOnly)
                      {
                          chatManager.GrantUserReadAccessToChannel(authKey, chatChannel);
                      }
                      else
                      {
                          chatManager.GrantUserReadWriteAccessToChannel(authKey, chatChannel);
                      }
              
                      chatManager.GrantUserReadWriteAccessToChannel(authKey, textToSpeechChannel);
              
                      var authDTO = new AuthDTO()
                      {
                          PublishKey = ConfigurationHelper.PubNubPublishKey,
                          SubscribeKey = ConfigurationHelper.PubNubSubscribeKey,
                          AuthKey = authKey,
                          Username = loginDTO.Username,
                          ChatChannel = chatChannel,
                          TextToSpeechChannel = textToSpeechChannel
                      };
              
                      return View(authDTO);
                  }
              }
              

              Метод контроллера Main получает DTO от формы логина, извлекает информацию о каналах из конфигурационных данных (один канал для чата, второй для общения с IBM Watson), устанавливает уровень доступа посредством вызова соответствующих методов объекта класса ChatManager и отдает всю собранную информацию странице. Дальше всем занимается уже фронтенд. Для полноты картины приведем также листинг класса ChatManager, инкапсулирующего взаимодействие с SDK PubNub:

              public class ChatManager
              {
                  private const String PRESENCE_CHANNEL_SUFFIX = "-pnpres";
              
                  private Pubnub pubnub;
              
                  public ChatManager()
                  {
                      var pnConfiguration = new PNConfiguration();
                      pnConfiguration.PublishKey = ConfigurationHelper.PubNubPublishKey;
                      pnConfiguration.SubscribeKey = ConfigurationHelper.PubNubSubscribeKey;
                      pnConfiguration.SecretKey = ConfigurationHelper.PubNubSecretKey;
                      pnConfiguration.Secure = true;
              
                      pubnub = new Pubnub(pnConfiguration);
                  }
              
                  public void ForbidPublicAccessToChannel(String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel })
                          .Read(false)
                          .Write(false)
                          .Async(new AccessGrantResult());
                  }
              
                  public void GrantUserReadAccessToChannel(String userAuthKey, String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
                          .AuthKeys(new String[] { userAuthKey })
                          .Read(true)
                          .Write(false)
                          .Async(new AccessGrantResult());
                  }
              
                  public void GrantUserReadWriteAccessToChannel(String userAuthKey, String channel)
                  {
                      pubnub.Grant()
                          .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
                          .AuthKeys(new String[] { userAuthKey })
                          .Read(true)
                          .Write(true)
                          .Async(new AccessGrantResult());
                  }
              }
              

              Здесь имеет смысл заострить внимание на константе PRESENCE_CHANNEL_SUFFIX. Дело в том, что механизм Presence для своих сообщений использует отдельный канал, который по имеющемуся соглашению утилизирует имя текущего канала с добавлением суффикса «-pnpres». Обратите внимание, что код PubNub Access Manager, выраженный в виде вызова функции Grant, требует явного указания Presence-канала для установки прав доступа.

              var pubnub;
              var chatChannel;
              var textToSpeechChannel;
              var username;
              
              function init(publishKey, subscribeKey, authKey, username, chatChannel, textToSpeechChannel) {
                  pubnub = new PubNub({
                      publishKey: publishKey,
                      subscribeKey: subscribeKey,
                      authKey: authKey,
                      uuid: username
                  });
              
                  this.username = username;
                  this.chatChannel = chatChannel;
                  this.textToSpeechChannel = textToSpeechChannel;
              
                  addListener();
                  subscribe();
              }
              

              Первое, что нам предстоит сделать в JavaScript-коде – это провести инициализацию соответствующего SDK. Для удобства и простоты некоторые сущности вынесены в глобальные переменные. После инициализации необходимо добавить слушателя для интересующих нас событий и подписаться на каналы чата, Presence и IBM Watson. Начнем с подписки:

              function subscribe() {
                  pubnub.subscribe({
                      channels: [chatChannel, textToSpeechChannel],
                      withPresence: true
                  });
              }
              

              Если код метода subscribe говорит сам за себя, то с методом addListener все немного сложнее:

              function addListener() {
                  pubnub.addListener({
                      status: function (statusEvent) {
                          if (statusEvent.category === "PNConnectedCategory") {
                              getOnlineUsers();
                          }
                      },
                      message: function (message) {
                          if (message.channel === chatChannel) {
                              var jsonMessage = JSON.parse(message.message);
                              var chat = document.getElementById("chat");
                              if (chat.value !== "") {
                                  chat.value = chat.value + "\n";
                                  chat.scrollTop = chat.scrollHeight;
                              }
              
                              chat.value = chat.value + jsonMessage.Username + ": " + 
                                  jsonMessage.Message;
                          }
                          else if (message.channel === textToSpeechChannel) {
                              if (message.publisher !== username) {
                                  var audio = new Audio(message.message.speech);
                                  audio.play();
                              }
                          }
                      },
                      presence: function (presenceEvent) {
                          if (presenceEvent.channel === chatChannel) {
                              if (presenceEvent.action === 'join') {
                                  if (!UserIsOnTheList(presenceEvent.uuid)) {
                                      AddUserToList(presenceEvent.uuid);
                                  }
              
                                  PutStatusToChat(presenceEvent.uuid, 
                                      "joins the channel");
                              }
                              else if (presenceEvent.action === 'timeout') {
                                  if (UserIsOnTheList(presenceEvent.uuid)) {
                                      RemoveUserFromList(presenceEvent.uuid);
                                  }
              
                                  PutStatusToChat(presenceEvent.uuid, 
                                      "was disconnected due to timeout");
                              }
                          }
                      }
                  });
              }
              

              Во-первых, мы подписываемся на событие «PNConnectedCategory», чтобы отловить момент присоединения к каналу текущего пользователя. Это важно, потому что получение и отображение списка всех участников необходимо вызывать лишь однажды, в то время как Presence-событие «join» срабатывает каждый раз при присоединении нового клиента. Во-вторых, при поимке события о новом сообщении, мы проверяем канал, которому это событие адресовано, и в зависимости от результата проверки либо формируем текстовое представление путем банальной конкатенации, либо инициализируем объект Audio пришедшей от IBM Watson ссылкой на аудио-файл и запускаем проигрывание.

              Еще одна интересная вещь происходит при отправке сообщения:

              function publish(message) {
                  var jsonMessage = {
                      "Username": username,
                      "Message": message
                  };
              
                  var publishConfig = {
                      channel: chatChannel,
                      message: JSON.stringify(jsonMessage)
                  };
              
                  pubnub.publish(publishConfig);
              
                  var emotedText = '';
              
                  var selectedEmotion = iconSelect.getSelectedValue();
              
                  if (selectedEmotion !== "") {
                      emotedText += '';
                  }
              
                  emotedText += message;
              
                  if (selectedEmotion !== "") {
                      emotedText += '';
                  }
              
                  emotedText += '';
              
                  jsonMessage = {
                      "text": emotedText
                  };
              
                  publishConfig = {
                      channel: textToSpeechChannel,
                      message: jsonMessage
                  };
              
                  pubnub.publish(publishConfig);
              }
              

              Сначала мы формируем само сообщение, затем определяем конфигурацию, которую понимает SDK, и только после этого инициируем отправку. Дальше лучше. Чтобы превратить текст в синтезированную речь, еще одно сообщение мы отправляем в канал IBM Watson. Для определения эмоциональной окраски используется Speech Synthesis Markup Language (SSML), а если конкретнее — тэг . Как вы уже наверняка догадываетесь, при отправке сообщения ReadOnly-пользователем, оно будет заблокировано механизмом PAM и так никогда и не найдет своего получателя.

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

              https://habrahabr.ru/post/338720/


              Метки:  

              Как попасть в Технопарк Университета ИТМО: большое интервью

              Вторник, 26 Сентября 2017 г. 10:18 + в цитатник
              itmo сегодня в 10:18 Управление

              Как попасть в Технопарк Университета ИТМО: большое интервью

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

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

                Мастерская-лаборатория ФабЛаб — подразделение Технопарка

                Кто приходит в технопарк


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

                • AR/VR
                • Робототехника
                • Системами ИИ
                • Микроэлектроника
                • Нанотехнологии

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

                — Олеся Баранюк, Технопарк Университета ИТМО

                В создании сегодняшнего материала принимали участие руководители следующих проектов.

                Ontodia


                Ontodia — это платформа для визуализации и исследования графовых (graph-based data) данных. Графовые данные — это данные построенные по модели вершин и связей между ними. Проект работает в том числе и с наиболее известным хранилищем графовых данных — Neo4j. Один из примеров проектов, использующих технологию Ontodia, — сервис «Топология бизнеса». Проект Ontodia находится на стадии рыночного продукта, который продолжает дорабатываться и совершенствоваться.

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

                — Дмитрий Павлов, коммерческий директор VISmart (компании-создателя платформы Ontodia)

                odgAssist


                Проект odgAssist помогает производственным (в частности, фармацевтическим) компаниям создавать новые продукты и быстрее выводить их на рынок. А именно — позволяет автоматизировать работу персонала на нижнем уровне (за счет использования носимых устройств для сбора данных и контроля процессов на соответствие, в частности, в формате «фотографии рабочего дня» сотрудника). Такой подход позволяет сократить скорость вывода инновационного продукта на рынок на 20% и серьёзно сэкономить на расходах. У компании есть первые продажи.

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

                —Олег Шахов директор по развитию бизнеса компании «Оптимальное движение» (разрабатывает проект odgAssist)

                Orbi


                Компания Orbi разрабатывает первые в мире очки для съемки видео в формате 360 градусов. Это солнечные очки, в которые встроены 4 камеры, позволяющие снимать полную панораму в формате 360. Проект провел успешную краудфандинговую кампанию на Indiegogo, а также привлек значительное финансирование от частных инвесторов. На данный момент в Orbi разработано уникальное программное обеспечение для склейки панорамы из 4-х видеопотоков, работающее на основных десктопных и мобильных платформах и позволяющее получать высококачественное панорамное видео в полностью автоматическом режиме (без участия пользователя). На данный момент в производство отправился прототип устройства в финальном дизайне. Он будет готов к середине ноября 2017 года.




                [На момент появления в Технопарке] мы находились на стадии активной разработки программного обеспечения, хотя наша команда разработчиков состояла только из трех программистов. Также мы активно искали подходящее решение для самого устройства (процессор, оптику, сенсоры и так далее) и производителя, который сможет это устройство сделать. На тот момент у нас уже была запущена кампания на Indiцegogo.

                — Александр Морено, технический директор Orbi

                Parseq Lab


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

                [Состояние на момент получения статуса резидента:] вывод пилотной разработки на рынок.

                — Александр Павлов, директор компании Parseq Lab

                Зачем компаниям приходить в Технопарк


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

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

                — Дмитрий Павлов, VISmart

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

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

                — Олег Шахов, odgAssist

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

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

                — Александр Морено, Orbi

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

                — Александр Павлов, Parseq Lab

                Как стать резидентом


                Заявку на получение статуса резидента можно подать на сайте Технопарка в любой момент. Экспертный совет рассматривает её в течение 2-3 дней, после чего принимается решение, брать проект в «семью» ИТМО или нет. За этим решением следует встреча с представителями Технопарка.

                Кто становится резидентами:

                • Технологические проекты (первоначальная связь с Университетом ИТМО, наличие в составе участников учёных или учащихся Университета необязательно)
                • Малые Инновационные Предприятия (Университет ИТМО выступает соучредителем таких предприятий, они размещаются в Технопарке в приоритетном порядке)
                • Корпоративные исследовательские центры

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

                — Олеся Баранюк, Технопарк Университета ИТМО

                На что обращают внимание эксперты при отборе заявок:

                • Инновационная составляющая
                • Конкурентные преимущества перед аналогами
                • Понимание рынка, наличие первых продаж
                • Возможность создавать места для прохождения студентами Университета ИТМО практики с последующим трудоустройством

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

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

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

                — Дмитрий Павлов, VISmart

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

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

                — Олег Шахов, odgAssist

                Соответствие тематической направленности Технопарка
                Мы разрабатываем инновационное устройство, находящееся действительно на переднем крае современных технологий в области камеростроения (например используемые нами процессор и объективы только появились на рынке, буквально год назад ничего подобного в принципе не существовало). Сама область 360 видео новая и очень активно развивается.

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

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

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

                — Александр Морено, Orbi

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

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

                Область для Университета не профильная, но, тем не менее, в Университете развивается такое направление как Биоинформатика в рамках Лаборатории и Института Биоинформатики [кстати, об этом направлении мы рассказывали в одном из наших материалов], и наличие резидентов с уникальными компетенциями в этой области значительно увеличивает исследовательские возможности студентов, аспирантов и сотрудников научных подразделений.

                — Олеся Баранюк, Технопарк Университета ИТМО

                Как проекты-резиденты взаимодействуют с Университетом ИТМО


                Научная поддержка

                Поучаствовать в проекте могут и студенты-стажеры, и крупные учёные, причём не только из Университета ИТМО:

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

                Сервис, над которым работала команда VISmart, очень заинтересовал ассистент-профессора Венского экономического университета Герхарда Вольгенаннта, что привело его вначале в компанию VISmart, а потом и в Университет ИТМО. В результате он стал участником программы ITMO Fellowship, влился в команду, в настоящий момент работает над усовершенствованием семантических технологий в области голосового управления устройствами.

                — Олеся Баранюк, Технопарк Университета ИТМО

                Вот как говорит об этом взаимодействии коммерческий директор VISmart:

                Да, наши разработки связаны с Университетом ИТМО. Дело в том, что наш продукт Ontodia ориентирован в том числе на поддержку стандартов semantic web, выпущенных w3c, а именно RDF, OWL, SPARQL.

                В России, по нашим сведениям, есть только одно сильное научное подразделение, которое учит применять эти стандарты и ведет серьезные научно-исследовательские проекты в этой сфере — это Международная лаборатория Университета ИТМО “Интеллектуальные методы обработки информации и семантические технологии”, с которой у нас установлены тесные связи. Двое наших сотрудников является аспирантами ИТМО.

                — Дмитрий Павлов, VISmart

                Совместные кейсы

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

                Поиск сотрудников

                От резидентов Технопарка ожидается готовность принимать на стажировку студентов и аспирантов Университета. Часть стажёров впоследствии становится сотрудниками компании — например, студенты и выпускники Университета ИТМО работают на проектах odgAssist и Orbi.

                Использование оборудования и лабораторий

                Возможность не только консультироваться с учёными, но и решать вместе с ними практические задачи инновационных компаний — ещё одна точка соприкосновения Университета и резидентов Технопарка:

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

                — Олеся Баранюк, Технопарк Университета ИТМО

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


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

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

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

                — Дмитрий Павлов, VISmart

                Продвижение и инфраструктура
                Технопарк активно помогает находить интересные программы и конкурсы для стартапов. Например, Технопарк поспособствовал нашему участию в конкурсе проектов Polar Bear Pitching в Оулу (Финляндия), где мы заняли второе место. Это был интересный опыт, участие в котором дало возможность стать нам более узнаваемыми в мире, ведь на мероприятии присутствовали представители средств массовой информации со всего мира: CNN, BBC, Al Jazeera и др., многие вели он-лайн трансляцию, ведь не каждый день можно увидеть предпринимателя, вещающего о конкурентных преимуществах из ледяной проруби в феврале при температуре –25.

                Также для нас очень полезна возможность общаться с другими компаниями, работающими в области 360 видео. Очень удобно, что в технопарке есть ФабЛаб, где много различных инструментов и оборудования, что позволяет, например, быстро напечатать на 3D принтере прототипы, детали и так далее.

                — Александр Морено, Orbi

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

                — Олег Шахов, odgAssist

                Советы молодым предпринимателям: что важно на старте


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

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

                — Дмитрий Павлов, VISmart

                Проект должен выполнять задачи, для которых он создаётся. Бизнес должен приносить деньги. То, что вы делаете, может приносить деньги? А что можно сделать, чтобы приносило больше?

                Любыми способами (легальными) добейтесь первых продаж. Вы должны понимать, что вы делаете, за какие деньги, для кого и зачем (какую проблему решаете). Если всё ок, то сделайте SWOT-анализ своей идеи/бизнеса. Не стесняйтесь pivot’а и закрытия проекта.

                Не взлетело – посмотрите, почему. Если ценности нет — что ж, так бывает. Если нет скорости, фокуса или execution – поработайте над собой, возможно, вам ещё рано делать стартап. И делайте CustDev, много CustDev’a, чтобы ваш продукт был кому-то нужен.

                — Олег Шахов, odgAssist

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

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

                — Александр Морено, Orbi
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/338714/


                Метки:  

                Как попасть в Технопарк Университета ИТМО: большое интервью

                Вторник, 26 Сентября 2017 г. 10:18 + в цитатник
                itmo сегодня в 10:18 Управление

                Как попасть в Технопарк Университета ИТМО: большое интервью

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

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

                  Мастерская-лаборатория ФабЛаб — подразделение Технопарка

                  Кто приходит в технопарк


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

                  • AR/VR
                  • Робототехника
                  • Системами ИИ
                  • Микроэлектроника
                  • Нанотехнологии

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

                  — Олеся Баранюк, Технопарк Университета ИТМО

                  В создании сегодняшнего материала принимали участие руководители следующих проектов.

                  Ontodia


                  Ontodia — это платформа для визуализации и исследования графовых (graph-based data) данных. Графовые данные — это данные построенные по модели вершин и связей между ними. Проект работает в том числе и с наиболее известным хранилищем графовых данных — Neo4j. Один из примеров проектов, использующих технологию Ontodia, — сервис «Топология бизнеса». Проект Ontodia находится на стадии рыночного продукта, который продолжает дорабатываться и совершенствоваться.

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

                  — Дмитрий Павлов, коммерческий директор VISmart (компании-создателя платформы Ontodia)

                  odgAssist


                  Проект odgAssist помогает производственным (в частности, фармацевтическим) компаниям создавать новые продукты и быстрее выводить их на рынок. А именно — позволяет автоматизировать работу персонала на нижнем уровне (за счет использования носимых устройств для сбора данных и контроля процессов на соответствие, в частности, в формате «фотографии рабочего дня» сотрудника). Такой подход позволяет сократить скорость вывода инновационного продукта на рынок на 20% и серьёзно сэкономить на расходах. У компании есть первые продажи.

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

                  —Олег Шахов директор по развитию бизнеса компании «Оптимальное движение» (разрабатывает проект odgAssist)

                  Orbi


                  Компания Orbi разрабатывает первые в мире очки для съемки видео в формате 360 градусов. Это солнечные очки, в которые встроены 4 камеры, позволяющие снимать полную панораму в формате 360. Проект провел успешную краудфандинговую кампанию на Indiegogo, а также привлек значительное финансирование от частных инвесторов. На данный момент в Orbi разработано уникальное программное обеспечение для склейки панорамы из 4-х видеопотоков, работающее на основных десктопных и мобильных платформах и позволяющее получать высококачественное панорамное видео в полностью автоматическом режиме (без участия пользователя). На данный момент в производство отправился прототип устройства в финальном дизайне. Он будет готов к середине ноября 2017 года.




                  [На момент появления в Технопарке] мы находились на стадии активной разработки программного обеспечения, хотя наша команда разработчиков состояла только из трех программистов. Также мы активно искали подходящее решение для самого устройства (процессор, оптику, сенсоры и так далее) и производителя, который сможет это устройство сделать. На тот момент у нас уже была запущена кампания на Indiцegogo.

                  — Александр Морено, технический директор Orbi

                  Parseq Lab


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

                  [Состояние на момент получения статуса резидента:] вывод пилотной разработки на рынок.

                  — Александр Павлов, директор компании Parseq Lab

                  Зачем компаниям приходить в Технопарк


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

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

                  — Дмитрий Павлов, VISmart

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

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

                  — Олег Шахов, odgAssist

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

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

                  — Александр Морено, Orbi

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

                  — Александр Павлов, Parseq Lab

                  Как стать резидентом


                  Заявку на получение статуса резидента можно подать на сайте Технопарка в любой момент. Экспертный совет рассматривает её в течение 2-3 дней, после чего принимается решение, брать проект в «семью» ИТМО или нет. За этим решением следует встреча с представителями Технопарка.

                  Кто становится резидентами:

                  • Технологические проекты (первоначальная связь с Университетом ИТМО, наличие в составе участников учёных или учащихся Университета необязательно)
                  • Малые Инновационные Предприятия (Университет ИТМО выступает соучредителем таких предприятий, они размещаются в Технопарке в приоритетном порядке)
                  • Корпоративные исследовательские центры

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

                  — Олеся Баранюк, Технопарк Университета ИТМО

                  На что обращают внимание эксперты при отборе заявок:

                  • Инновационная составляющая
                  • Конкурентные преимущества перед аналогами
                  • Понимание рынка, наличие первых продаж
                  • Возможность создавать места для прохождения студентами Университета ИТМО практики с последующим трудоустройством

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

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

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

                  — Дмитрий Павлов, VISmart

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

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

                  — Олег Шахов, odgAssist

                  Соответствие тематической направленности Технопарка
                  Мы разрабатываем инновационное устройство, находящееся действительно на переднем крае современных технологий в области камеростроения (например используемые нами процессор и объективы только появились на рынке, буквально год назад ничего подобного в принципе не существовало). Сама область 360 видео новая и очень активно развивается.

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

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

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

                  — Александр Морено, Orbi

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

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

                  Область для Университета не профильная, но, тем не менее, в Университете развивается такое направление как Биоинформатика в рамках Лаборатории и Института Биоинформатики [кстати, об этом направлении мы рассказывали в одном из наших материалов], и наличие резидентов с уникальными компетенциями в этой области значительно увеличивает исследовательские возможности студентов, аспирантов и сотрудников научных подразделений.

                  — Олеся Баранюк, Технопарк Университета ИТМО

                  Как проекты-резиденты взаимодействуют с Университетом ИТМО


                  Научная поддержка

                  Поучаствовать в проекте могут и студенты-стажеры, и крупные учёные, причём не только из Университета ИТМО:

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

                  Сервис, над которым работала команда VISmart, очень заинтересовал ассистент-профессора Венского экономического университета Герхарда Вольгенаннта, что привело его вначале в компанию VISmart, а потом и в Университет ИТМО. В результате он стал участником программы ITMO Fellowship, влился в команду, в настоящий момент работает над усовершенствованием семантических технологий в области голосового управления устройствами.

                  — Олеся Баранюк, Технопарк Университета ИТМО

                  Вот как говорит об этом взаимодействии коммерческий директор VISmart:

                  Да, наши разработки связаны с Университетом ИТМО. Дело в том, что наш продукт Ontodia ориентирован в том числе на поддержку стандартов semantic web, выпущенных w3c, а именно RDF, OWL, SPARQL.

                  В России, по нашим сведениям, есть только одно сильное научное подразделение, которое учит применять эти стандарты и ведет серьезные научно-исследовательские проекты в этой сфере — это Международная лаборатория Университета ИТМО “Интеллектуальные методы обработки информации и семантические технологии”, с которой у нас установлены тесные связи. Двое наших сотрудников является аспирантами ИТМО.

                  — Дмитрий Павлов, VISmart

                  Совместные кейсы

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

                  Поиск сотрудников

                  От резидентов Технопарка ожидается готовность принимать на стажировку студентов и аспирантов Университета. Часть стажёров впоследствии становится сотрудниками компании — например, студенты и выпускники Университета ИТМО работают на проектах odgAssist и Orbi.

                  Использование оборудования и лабораторий

                  Возможность не только консультироваться с учёными, но и решать вместе с ними практические задачи инновационных компаний — ещё одна точка соприкосновения Университета и резидентов Технопарка:

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

                  — Олеся Баранюк, Технопарк Университета ИТМО

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


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

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

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

                  — Дмитрий Павлов, VISmart

                  Продвижение и инфраструктура
                  Технопарк активно помогает находить интересные программы и конкурсы для стартапов. Например, Технопарк поспособствовал нашему участию в конкурсе проектов Polar Bear Pitching в Оулу (Финляндия), где мы заняли второе место. Это был интересный опыт, участие в котором дало возможность стать нам более узнаваемыми в мире, ведь на мероприятии присутствовали представители средств массовой информации со всего мира: CNN, BBC, Al Jazeera и др., многие вели он-лайн трансляцию, ведь не каждый день можно увидеть предпринимателя, вещающего о конкурентных преимуществах из ледяной проруби в феврале при температуре –25.

                  Также для нас очень полезна возможность общаться с другими компаниями, работающими в области 360 видео. Очень удобно, что в технопарке есть ФабЛаб, где много различных инструментов и оборудования, что позволяет, например, быстро напечатать на 3D принтере прототипы, детали и так далее.

                  — Александр Морено, Orbi

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

                  — Олег Шахов, odgAssist

                  Советы молодым предпринимателям: что важно на старте


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

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

                  — Дмитрий Павлов, VISmart

                  Проект должен выполнять задачи, для которых он создаётся. Бизнес должен приносить деньги. То, что вы делаете, может приносить деньги? А что можно сделать, чтобы приносило больше?

                  Любыми способами (легальными) добейтесь первых продаж. Вы должны понимать, что вы делаете, за какие деньги, для кого и зачем (какую проблему решаете). Если всё ок, то сделайте SWOT-анализ своей идеи/бизнеса. Не стесняйтесь pivot’а и закрытия проекта.

                  Не взлетело – посмотрите, почему. Если ценности нет — что ж, так бывает. Если нет скорости, фокуса или execution – поработайте над собой, возможно, вам ещё рано делать стартап. И делайте CustDev, много CustDev’a, чтобы ваш продукт был кому-то нужен.

                  — Олег Шахов, odgAssist

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

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

                  — Александр Морено, Orbi
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338714/


                  Метки:  

                  Без заголовка

                  Вторник, 26 Сентября 2017 г. 10:18 + в цитатник

                  Метки:  

                  Без заголовка

                  Вторник, 26 Сентября 2017 г. 10:18 + в цитатник

                  Метки:  

                  [recovery mode] Переезды в облако: 5 разных историй

                  Вторник, 26 Сентября 2017 г. 10:08 + в цитатник
                  SZinkevich сегодня в 10:08 Администрирование

                  Переезды в облако: 5 разных историй

                  «Все отделы от серваков отказались, а на Авито их никто не купил — шеф сказал, это теперь тестовая среда».

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


                  Эта штука умеет пробрасывать аппаратные ключи 1С в разные подсети

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

                  Соцсеть LOQUI BUSINESS


                  Локви (business.loqui.ru) — растущая корпоративная соцсеть. Своего рода полная реализация корпоративного портала. Они поняли, что корпорациям не хватает социальной сети для общения сотрудников, и подумали, что это белое пятно стоит закрыть. Понятное дело, что понадобилась среда для разработки. Управленцы в Москве, разработчики в Германии (русские в основном). Проект изначально российский, базовый язык — русский. Распространение — SaaS, поставляют клиентам уже готовый сервис. То есть у нас развёрнута одна большая мультитенантная инсталляция. Почему мы? Потому что российскому сегменту соцсети надо быть в РФ. Облако подошло гибкостью на этапе разработки и возможностью построения катастрофоустойчивой инфраструктуры, чтобы не огорчать падениями владельцев социальных аккаунтов. Сейчас рассматривают возможность резервирования или полной миграции в виртуальный дата-центр КРОК зарубежных серверов, где лежат медиафайлы, чтобы обеспечить более надёжную защиту от сбоев и максимальную доступность.



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

                  Смартекс


                  Веб-разработчики, которые научились не только делать крутые сайты, но и поддерживать их, всю сознательную жизнь пользовались плюсами Амазона. Но, конечно, какой бы ты клёвый сайт ни сделал, если он будет во Франкфурте, то в Москве открываться быстро он не будет. А парням это важно, у них динамическая подгрузка контента множеством сессий. Вопрос пинга стал для них очень важен. Амазоновский CDN в Москве не работает. Парни встали к нам — им важно наличие API, которое в нашем случае на 80 процентов совпадает с амазоновским. У нас очень просто тем, кто переезжал с Амазона. Если им понадобится российский CDN — просто обратятся к российскому CDN-провайдеру, это очень просто.

                  Как делают банки


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

                  Как делает розница


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

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

                  Е-коммерс


                  Один большой ритейлер захотел торговать через сеть, у них база на 100 тысяч наименований. Страшно. Но совладали со страхом и начали делать по европейской модели click-and-collect, когда сначала заказываешь издалека, а потом забираешь собранное на месте. Заодно отказались от бумажных каталогов, которые всех порядочно достали. Уровень ада по тому, как быстро всё внедрялось, — hardcore.

                  Мы вместе работаем уже лет 15, все магазины обеспечиваем инфраструктурой. Полевые инженеры до сих пор ездят с жёсткими дисками, комплектами для чистки блоков питания и так далее. Но дальше ни-ни, головная компания по поддержке софта — из Англии. Соответственно основные сотрудники у них из Индии. С соответствующим подходом. В частности, работают только по будням. В итоге мы один раз в субботу спасали их СУБД, вставшую намертво (забыли чистить логи, накопилось 350 Гб). Потом было ещё чёрное воскресенье, ещё и ещё… Потом у них не все сервисы стартовали, потому что они их руками пусками. Помню, я звонил их админу, и мы играли в командную строку по телефону. Ну и ещё индийский нюанс подхода — «бекапы делает только трус». Ещё эти гады индусы говорят на «хорошем» английском. Но как только что-то не так с их стороны, начинается на конференц-колах клоунада с тем, что они, типа, перестали понимать. Зато тот единственный раз, когда у нас сгорела железка, они стебали нас: «Ну что, херовые выходные были?» В общем, задолбало. Я сказал: «Парни, мы вас очень любим, но с дачи больше к вам не поедем. Давайте прикрутим нормальный мониторинг, чтобы без сюрпризов». Они почесали голову — мы сделали предложение, и они его приняли.

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

                  https://habrahabr.ru/post/338678/


                  Метки:  

                  Как мы отмечали 256 день года и рисовали пиксели через API

                  Вторник, 26 Сентября 2017 г. 09:41 + в цитатник
                  green_hippo сегодня в 09:41 Разработка

                  Как мы отмечали 256 день года и рисовали пиксели через API

                    13 сентября в Контуре отмечали День программиста. В самом большом офисе разработки играли в Pac-Man и пытались съесть 280 коробок с пиццей. Одновременно полторы тысячи человек рисовали пиксели в онлайне. В этом посте четыре разработчика рассказывают, как делали праздник.



                    Часть 1. Рассказывает Игорь green_hippo, который стырил идею на Reddit


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


                    Я решил, что надо сделать свой Place, с таймлапсом и API.





                    На Reddit миллион человек рисовал на холсте размером один мегапиксель. Каждый мог закрасить не больше одного пикселя раз в 5–20 минут. Если сделать праздничный холст 256x256 пикселей (в 15 раз меньше) и учесть, что у нас не миллион сотрудников (а в 200 раз меньше), то задержку между пикселями тоже должна быть примерно в 10 раз меньше.


                    Поэтому для нашего поля 256x256 пикселей я выбрал задержку от 2:56 до 0:32. А после этого рассказал об идее коллегам, которые согласились помочь.


                    Часть 2. Рассказывает Вероника aminopyrodin, которая поборола себя и тормозной canvas


                    Я сразу поняла, что на фронте будет нужен холст, палитра и зум. Но дизайнеры (Владимир dzekh и Юлия krasilnikovayu) оказались хитрее и придумали ещё перемотку, статистику, лидерборд и скриншоты.



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


                    Тем временем я, как современный фронтендер, рефлекторно начала думать о том, чтобы настроить Webpack, Babel и Autoprefixer. А когда очнулась, узнала, что бэкенд-разработчик уже всё сделал. И оно даже работало. Криво-косо, но работало: точки на canvas ставились, зум зумился. Я отпилила от прекрасного дизайна все ненужное и красивенько сверстала.


                    Остались две проблемы: Edge и Safari.



                    В Safari и правда все тормозило со страшной силой. Сначала обнаружила, что canvas не вынесен в отдельный композитный слой. Поэтому браузер при каждом обновлении холста перерисовывал весь документ. Добавила канвасу transition: translateZ(0), и все стало тормозить быстрее. Потом отрефакторила остальной бакендерский код, избавилась ещё от десятка перерисовок. Интерфейс полетел на первой космической.


                    Об IE я сразу не заботилась, потому что знала, что игроки будут пользоваться нормальными браузерами. Беда пришла от старшего брата. Если просишь Edge нарисовать квадрат, он категорически отказывается. Говорит: «Но плавные переходы лучше!» — и размывает весь рисунок.



                    Такая же проблема была у ребят из Reddit. Сначала я решила её с помощью CSS-свойства image-rendering и флага CanvasRenderingContext2D.imageSmoothingEnabled. Но перед запуском оказалось, что Edge косячит при общении с сервером через вебсокеты. Поэтому я и его объявила ненормальным браузером.


                    Горжусь, что трижды пыталась принести в код React, Webpack, Babel, LESS и Autoprefixer, но смогла победить себя. В итоге всё написано на чистом ES6+ и CSS, но с модными гридами, вебсокетами и fetch-ем.


                    Часть 3. Рассказывает Иван vansel, который попробовал новую классную библиотеку и не рад этому


                    Я не хотел писать всё с нуля, поэтому поискал готовое. Оригинальный Place лежит на Github, но там слишком много кода. Я взял простой клон под NodeJS и прошёлся по нему напильником. Именно поэтому, когда за дело взялась Вероника, интерфейс уже как-то работал. Вообще, есть уйма клонов, выбирайте для себя любой.


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



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


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


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



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


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



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


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



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


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


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


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


                    $ ffmpeg -pattern_type glob \
                             -i "*.png" \
                             -c:v libx264 \
                             -vf format=yuv420p \
                             timelapse.mp4
                    
                    $ ffmpeg -i timelapse.mp4 \
                             -i sci-fi.mp3 \
                             256.mp4

                    Часть 4. Рассказывает Павел xoposhiy, который загнул радугу и запустил ракету через API


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



                    Я тоже в этом поучаствовал:



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


                    сетку для безошибочного нанесения картинок


                    браузерного бота


                    Я ждал от Дня программиста большего. И дождался — на второй день Игорь опубликовал в Стаффе такой фрагмент кода и стал раздавать желающим API-ключи:



                    Это было уже что-то!


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


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


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


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


                    Это должен был быть самый медленный полёт ракеты в истории человечества. С текущей задержкой за пару часов я мог сдвинуть ракету всего на несколько пикселей. Нужно было либо уменьшать ракету, либо двигать её скачками, либо смириться с тем, что лететь она будет сутки. Поделился муками выбора с Игорем, а он со словами «Твори добро!» внезапно отсыпал без малого 50 ключей для API. С таким количеством ключей ракета могла достичь скорости один пиксель в секунду!



                    Осталось немного: выбрать дизайн ракеты и написать весь код. Я отбросил мультяшные ракеты и выбрал ракету-носитель «Восток». Сразу стало понятно, что полёт ракеты должен заканчиваться выводом на орбиту корабля Восток-1.


                    Почему «Восток»? Потому что прямо сейчас куча инженеров из Контура занимается секретным проектом с кодовым названием Vostok. Я хотел, чтобы парням было приятно.


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


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




                    Кстати, без NSFW-контента не обошлось. Кто-то из нарисованного моим первым нескучным ботом слова TRON упорно делал слово PRON.


                    Были и более интересные рисунки


                    Ваня потом рассказал, что 13 сентября на холсте одновременно рисовало 1630 человек и десяток ботов, то есть примерно треть всех работников компании. В среднем к серверам было подключено 440 клиентов, а в дневные часы — 840.


                    В итоге у нас получилась такая картинка:



                    И такой таймлапс. Моя ракета взлетает на 27 секунде:





                    А вы программируете по праздникам и для праздников? Расскажите нам в комментариях.


                    P. S. Если интересно, о чём мы не рассказываем на Хабре, подписывайтесь на наш канал в Телеграме.

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

                    https://habrahabr.ru/post/338716/


                    Метки:  

                    Наш рецепт отказоустойчивого VPN-сервера на базе tinc, OpenVPN, Linux

                    Вторник, 26 Сентября 2017 г. 09:01 + в цитатник
                    gserge сегодня в 09:01 Администрирование

                    Наш рецепт отказоустойчивого VPN-сервера на базе tinc, OpenVPN, Linux

                    • Tutorial


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

                    • обеспечивать отказоустойчивость и избыточность;
                    • легко масштабироваться;
                    • просто и быстро решать задачу добавления и блокировки пользователей VPN;
                    • балансировать нагрузку между входными нодами;
                    • одинаково хорошо работать для клиентов на GNU/Linux, Mac OS X и Windows;
                    • поддерживать клиентов, которые находятся за NAT.

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

                    Разработка концепции


                    В качестве базовой VPN-технологии со стороны клиента мы выбрали OpenVPN: он прекрасно работает через NAT и поддерживает все требуемые платформы.

                    OpenVPN было решено развернуть в режиме TLS-сервера, а добавление и блокировку пользователей в нем сделать с помощью пакета easy-rsa, который позволяет создавать ключ и сертификат, а затем отзывать их при необходимости.

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

                    Итоговое решение вышло простым и изящным. Мы решили использовать N входных нод, адреса которых с помощью round-robin DNS выдаются клиентам. Все ноды и узлы сервиса клиентов включены в единое L2-пространство tinc VPN. Клиентские подключения (тоже L2) объединяются с tinc-интерфейсом в мост. Таким образом, получается, что, подключаясь по OpenVPN, клиент попадает на случайную ноду и оказывается в единой L2-сети со всеми остальными клиентами, нодами и сервисом клиента.



                    Для реализации этой схемы были выделены 3 VPS в различных дата-центрах, на которых и требовалось развернуть «точки входа» в сеть (ep1, ep2 и ep3). Кроме того, в сети присутствовал гипервизор с сервисами клиента (hpv1). На всех машинах установили Ubuntu Server 16.04.

                    Строим tinc VPN


                    Для начала устанавливаем пакеты:

                    $ sudo apt-get update && sudo apt-get install tinс

                    На этом этапе нам нужно определиться с названием сети — пусть будет l2vpnnet. Создаем структуру каталогов:

                    $ sudo mkdir -p /etc/tinc/l2vpnnet/hosts

                    В каталоге /etc/tinc/l2vpnnet создаем файл tinc.conf и наполняем его следующим содержимым:

                    # Имя текущей машины
                    Name = ep1
                    # Тип сети, в нашем случае — L2
                    Mode = switch
                    # Интерфейс, который мы будем использовать
                    Interface = tap0
                    # По умолчанию используется протокол UDP
                    Port = 655
                    
                    # Записываем имена всех остальных хостов, к которым мы будем подключаться
                    ConnectTo = ep2
                    ConnectTo = ep3
                    ConnectTo = hpv1

                    Создаем файл /etc/tinc/l2vpnnet/ep1 и вносим в него параметры:

                    # Публичный адрес и порт
                    Address = 100.101.102.103 655
                    # Используемые алгоритмы шифрования и аутентификации
                    Cipher = aes-128-cbc
                    Digest = sha1
                    # Для уменьшения задержек рекомендуем также выключать сжатие
                    Compression = 0

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

                    $ cd /etc/tinc/l2vpnnet && sudo tincd -n l2vpnnet -K2048
                    Generating 2048 bits keys:
                    ............................................+++ p
                    .................................+++ q
                    Done.
                    Please enter a file to save private RSA key to [/etc/tinc/l2vpnnet/rsa_key.priv]: 
                    Please enter a file to save public RSA key to [/etc/tinc/l2vpnnet/hosts/ep1]: 

                    На остальных машинах проделываем аналогичные действия. Файлы с открытым ключом и параметрами подключения (/etc/tinc/l2vpnnet/hosts/ep1|ep2|ep3|hpv1) необходимо разместить у всех участников сети в каталоге /etc/tinc/l2vpnnet/hosts.

                    Название сети необходимо внести в файл /etc/tinc/nets.boot, чтобы tinc запускал VPN к нашей сети автоматически при загрузке:

                    $ sudo cat nets.boot 
                    #This file contains all names of the networks to be started 
                    #on system startup.
                    l2vpnnet

                    При настройке как tinc VPN, так и OpenVPN в нашей компании принято использовать стандартные механизмы управления сетью Ubuntu. Добавим в /etc/network/interfaces описание параметров устройства tap0:

                    # Устройство запускается автоматически при старте системы
                    auto tap0
                    # Указываем режим конфигурации manual, так как IP мы назначим уже на bridge
                    iface tap0 inet manual
                            # Создание устройства перед запуском tinc
                            pre-up ip tuntap add dev $IFACE mode tap
                            # ... и его удаление после остановки
                            post-down ip tuntap del dev $IFACE mode tap
                            # Собственно, запуск tinc с настроенной нами сетью
                            tinc-net l2vpnnet

                    Такая настройка позволит нам управлять tinc с помощью ifup/ifdown-скриптов.

                    Для единого L2-пространства нужно выбрать и L3-пространство. Для примера мы будем использовать сеть 10.10.10.0/24. Настроим bridge-интерфейс и назначим ему IP — для этого внесем в /etc/network/interfaces такую информацию:

                    auto br0
                    iface br0 inet static
                            # Естественно, IP должен быть разным для хостов
                            address 10.10.10.1 
                            netmask 255.255.255.0
                            # Указываем, что в бридже наш интерфейс tinc vpn
                            bridge_ports tap0
                    
                            # Отключаем протокол spanning tree для bridge-интерфейса
                            bridge_stp off
                            # Максимальное время ожидания готовности моста
                            bridge_maxwait 5
                            # Отключаем задержку при форвардинге
                            bridge_fd 0

                    После этого последовательно стартуем оба устройства на всех серверах и проверяем связанность любым средством диагностики (ping, mtr и т.п.):

                    $ sudo ifup tap0 && sudo ifup br0
                    $ ping -c3 10.10.10.2
                    PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data.
                    64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=3.99 ms
                    64 bytes from 10.10.10.2: icmp_seq=2 ttl=64 time=1.19 ms
                    64 bytes from 10.10.10.2: icmp_seq=3 ttl=64 time=1.07 ms
                    
                    --- 10.10.10.2 ping statistics ---
                    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
                    rtt min/avg/max/mdev = 1.075/2.087/3.994/1.349 ms

                    Отлично: L2-пространство для входных нод и целевого сервера построено. Теперь нужно добавить в него удаленных клиентов.

                    Настраиваем OpenVPN


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

                    $ sudo apt-get update && sudo apt-get install openvpn easy-rsa

                    Настроим DNS-зону, добавим 3 A-записи с одинаковым именем VPN-сервиса:

                    vpn.compa.ny.        IN     A    100.101.102.103
                    vpn.compa.ny.        IN     A    50.51.52.53
                    vpn.compa.ny.        IN     A    1.1.1.1

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

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

                    Node 1 10.10.10.100-10.10.10.129
                    Node 2 10.10.10.130-10.10.10.159
                    Node 2 10.10.10.160-10.10.10.189

                    Создадим окружение для CA:

                    $ cd /etc/openvpn
                    $ sudo -s
                    # make-cadir ca
                    # mkdir keys 
                    # chmod 700 keys
                    # exit

                    Теперь отредактируем файл с переменными vars, установив следующие значения:

                    # Каталог с easy-rsa
                    export EASY_RSA="`pwd`"
                    # Путь к openssl, pkcs11-tool, grep 
                    export OPENSSL="openssl"
                    export PKCS11TOOL="pkcs11-tool"
                    export GREP="grep"
                    # Конфиг openssl
                    export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
                    # Каталог с ключами
                    export KEY_DIR="$EASY_RSA/keys"
                    export PKCS11_MODULE_PATH="dummy"
                    export PKCS11_PIN="dummy"
                    # Размер ключа
                    export KEY_SIZE=2048
                    # CA-ключ будет жить 10 лет
                    export CA_EXPIRE=3650
                    # Описываем нашу организацию: страна, регион,
                    # город, наименование, e-mail и подразделение
                    export KEY_COUNTRY="RU"
                    export KEY_PROVINCE="Magadan region"
                    export KEY_CITY="Susuman"
                    export KEY_ORG="Company"
                    export KEY_EMAIL="info@compa.ny"
                    export KEY_OU="IT"
                    export KEY_NAME="UnbreakableVPN"

                    Сохраняем и начинаем генерацию ключей:

                    # . vars
                    # ./clean-all 
                    # ./build-ca
                    Generating a 2048 bit RSA private key
                    ..........................+++
                    .+++
                    writing new private key to 'ca.key'
                    -----
                    You are about to be asked to enter information that will be incorporated
                    into your certificate request.
                    What you are about to enter is what is called a Distinguished Name or a DN.
                    There are quite a few fields but you can leave some blank
                    For some fields there will be a default value,
                    If you enter '.', the field will be left blank.
                    -----
                    Country Name (2 letter code) [RU]:
                    State or Province Name (full name) [Magadan region]:
                    Locality Name (eg, city) [Susuman]:
                    Organization Name (eg, company) [Company]:
                    Organizational Unit Name (eg, section) [IT]:
                    Common Name (eg, your name or your server's hostname) [Company CA]:
                    Name [UnbreakableVPN]:
                    Email Address [info@compa.ny]:
                    # ./build-dh
                    Generating DH parameters, 2048 bit long safe prime, generator 2
                    This is going to take a long time
                    …
                    # ./build-key-server server
                    # openvpn --genkey --secret keys/ta.key

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

                    # ./build-key testuser
                    # ./revoke-full testuser

                    Скопируем все необходимые для настройки сервера ключи в каталог с ключевой информацией OpenVPN:

                    # cd keys
                    # mkdir /etc/openvpn/.keys
                    # cp ca.crt server.crt server.key dh2048.pem ta.key crl.pem /etc/openvpn/.keys
                    # exit

                    Подготовим конфигурацию OpenVPN-сервера, для чего создадим файл /etc/openvpn/server.conf:

                    # Устанавливаем подробность ведения журнала
                    verb 4
                    # Порт и протокол подключения
                    port 1194
                    proto tcp-server
                    # Режим и способ аутентификации 
                    mode server
                    tls-server
                    # Определяем MTU 
                    tun-mtu 1500
                    # Определяем имя и тип интерфейса, который будет обслуживать клиентов
                    dev ovpn-clients
                    dev-type tap
                    # Указываем, что TA-ключ используется в режиме сервера
                    key-direction 0
                    # Описываем ключевую информацию
                    cert /etc/openvpn/.keys/server.crt
                    key /etc/openvpn/.keys/server.key
                    dh /etc/openvpn/.keys/dh2048.pem
                    tls-auth /etc/openvpn/.keys/ta.key
                    crl-verify /etc/openvpn/.keys/crl.pem
                    # Определяем протоколы аутентификации и шифрования
                    auth sha1
                    cipher AES-128-CBC 
                    # Опция, указывающая, что устройство будет создаваться единожды
                    # на все время работы сервера
                    persist-tun
                    # Указываем тип топологии и пул
                    topology subnet
                    server-bridge 10.10.10.1 255.255.255.0 10.10.10.100 10.10.10.129
                    # Указываем маршрут по умолчанию через туннель и определяем
                    # внутренние DNS
                    push "redirect-gateway autolocal"
                    push "dhcp-option DNS 10.10.10.200"
                    push "dhcp-option DNS 10.20.20.200"
                    # Проверяем доступность подключенного клиента раз в 10 секунд,
                    # таймаут подключения — 2 минуты
                    keepalive 10 120
                    # То самое ограничение в 30 клиентов
                    max-clients 30
                    # Локальные привилегии демона openvpn
                    user nobody
                    group nogroup
                    # Позволяет удаленному клиенту подключаться с любого IP и порта
                    float
                    # Путь к файлу журнала
                    log    /var/log/openvpn-server.log

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

                    По аналогии с tinc настроим управление OpenVPN через стандартные ifup/ifdown-скрипты, добавив описание устройства в /etc/network/interfaces:

                    auto ovpn-clients
                    iface ovpn-clients inet manual 
                            pre-up ip tuntap add dev $IFACE mode tap 
                            post-up systemctl start openvpn@server.service 
                            pre-down systemctl stop openvpn@server.service 
                            post-down ip tuntap del dev $IFACE mode tap

                    Включим интерфейс в мост вместе с tinc, изменив настройки интерфейса br0:

                            ...
                            netmask 255.255.255.0
                            bridge_ports tap0
                            bridge_ports ovpn_clients
                            bridge_stp off
                            ...

                    Приведем все в рабочее состояние:

                    $ sudo ifup ovpn-clients && sudo ifdown br0 && sudo ifup br0

                    Серверная конфигурация готова. Теперь создадим клиентские ключи и ovpn-файл:

                    $ sudo -s
                    # cd /etc/openvpn/ca
                    # ./build-key PetrovIvan
                    # exit

                    Для упрощения использования мы создадим клиентский ovpn-файл c ключевой информацией INLINE:

                    $ vim PetrovInan.ovpn
                    # Указываем тип подключения, тип устройства и протокол
                    client
                    dev tap
                    proto tcp
                    # Определяем MTU такой же, как и на сервере
                    tun-mtu 1500
                    # Указываем узел и порт подключения
                    remote vpn.compa.ny 1194
                    # Отказываемся от постоянного прослушивания порта
                    nobind
                    # Опция, которая позволяет не перечитывать ключи для каждого соединения
                    persist-key
                    persist-tun
                    # Корректируем MSS 
                    mssfix
                    # Указываем, что будем использовать TA как TLS-клиент
                    key-direction 1
                    ns-cert-type server
                    remote-cert-tls server
                    
                    auth sha1
                    cipher AES-128-CBC
                    verb 4
                    keepalive 10 40
                    
                    
                    ### Сюда вставляем содержимое ca.crt
                    
                    
                     
                    ### Сюда вставляем содержимое ta.key
                    
                    
                    
                    ### Сюда вставляем содержимое PetrovIvan.crt
                    
                    
                    
                    ### Сюда вставляем содержимое PetrovIvan.key
                    

                    Сохраняем и отдаем клиенту, который просто подключается к VPN, используя ovpn-файл. На этом настройка OpenVPN закончена.

                    Блокировка клиента


                    В случае, когда нам необходимо запретить подключение к VPN одному из клиентов (например, при увольнении сотрудника), мы просто отзываем сертификат:

                    $ ./revoke-all PetrovIvan

                    После отзыва обновляем на всех серверах crl.pem и выполняем:

                    $ sudo service openvpn reload

                    Обратите внимание, что в server.conf отсутствует опция persist-key. Это позволяет обновить ключевую информацию во время выполнения reload — иначе бы для этого потребовался рестарт демона.

                    Для распространения списка отзыва и выполнения действия reload для OpenVPN мы используем Chef. Очевидно, для этой цели подойдут любые другие средства автоматического развертывания конфигураций (Ansible, Puppet…) или даже простой shell-скрипт.

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

                    Заключение


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

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

                    P.S.


                    Читайте также в нашем блоге:

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

                    https://habrahabr.ru/post/338628/


                    Метки:  

                    Разбираемся с новым sync.Map в Go 1.9

                    Вторник, 26 Сентября 2017 г. 03:50 + в цитатник
                    divan0 сегодня в 03:50 Разработка

                    Разбираемся с новым sync.Map в Go 1.9

                    • Tutorial

                    Одним из нововведений в Go 1.9 было добавление в стандартную библиотеку нового типа sync.Map, и если вы ещё не разобрались что это и для чего он нужен, то эта статья для вас.


                    Для тех, кому интересен только вывод, TL;DR:


                    если у вас высоконагруженная (и 100нс решают) система с большим количеством ядер процессора (32+), вы можете захотеть использовать sync.Map вместо стандартного map+sync.RWMutex. В остальных случаях, sync.Map особо не нужен.


                    Если же интересны подробности, то давайте начнем с основ.


                    Тип map


                    Если вы работаете с данными в формате "ключ"-"значение", то всё что вам нужно это встроенный тип map (карта). Хорошее введение, как пользоваться map есть в Effective Go и блог-посте "Go Maps in Action".


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


                    Вспомним как пользоваться map:


                    // инициализация
                    m := make(map[string]int)
                    // запись
                    m["habr"] = 42
                    // чтение
                    val := m["habr"]
                    // чтение с comma,ok
                    val, ok := m["habr"] // ok равен true, если ключ найден
                    // итерация
                    for k, v := range m { ... }
                    // удаление
                    delete(m, "habr")

                    Во время итерации значения в map могут изменяться.


                    Go, как известно, является языком созданным для написания concurrent программ — программ, который эффективно работают на мультипроцессорных системах. Но тип map не безопасен для параллельного доступа. Тоесть для чтения, конечно, безопасен — 1000 горутин могут читать из map без опасений, но вот параллельно в неё ещё и писать — уже нет. До Go 1.8 конкурентный доступ (чтение и запись из разных горутин) могли привести к неопределенности, а после Go 1.8 эта ситуация стала явно выбрасывать панику с сообщением "concurrent map writes".


                    Почему map не потокобезопасен


                    Решение делать или нет map потокобезопасным было непростым, но было принято не делать — эта безопасность не даётся бесплатно. Там где она не нужна, дополнительные средства синхронизации вроде мьютексов будут излишне замедлять программу, а там где она нужна — не составляет труда реализовать эту безопасность с помощью sync.Mutex.


                    В текущей реализации map очень быстр:


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


                    Давайте, посмотрим, как это делается.


                    Map + sync.Mutex


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


                    type Counters struct {
                        sync.Mutex
                        m map[string]int
                    }

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


                    func NewCounters() *Counters {
                        return &Counters{
                            m: make(map[string]int),
                        }
                    }

                    Теперь у переменной типа Counters будет метод Lock() и Unlock(), но если мы хотим упростить себе жизнь и использовать этот тип из других пакетов, то будет также удобно сделать функции обёртки вроде Load() и Store(). В таком случае мьютекс можно не встраивать, а просто сделать "приватным" полем:


                    type Counters struct {
                        mx sync.Mutex
                        m map[string]int
                    }
                    
                    func (c *Counters) Load(key string) (int, bool) {
                        c.mx.Lock()
                        defer c.mx.Unlock()
                        val, ok := c.m[key]
                        return val, ok
                    }
                    
                    func (c *Counters) Store(key string, value int) {
                        c.mx.Lock()
                        defer c.mx.Unlock()
                        c.m[key] = value
                    }

                    Тут нужно обратить внимание на два момента:


                    • defer имеет небольшой оверхед (порядка 50-100 наносекунд), поэтому если у вас код для высоконагруженной системы и 100 наносекунд имеют значение, то вам может быть выгодней не использовать defer
                    • методы Get() и Store() должны быть определены для указателя на Counters, а не на Counters (тоесть не func (c Counters) Load(key string) int { ... }, потому что в таком случае значение ресивера (c) копируется, вместе с чем скопируется и мьютекс в нашей структуре, что лишает всю затею смысла и приводит к проблемам.

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


                    Кстати, обратите внимание, я намеренно пишу "если нужно", потому что вы всегда решаете конкретную задачу и в каждом конкретном случае у вас могут разные профили использования. Если вам не нужен Range() — не тратьте время на его реализацию. Когда нужно будет — всегда сможете добавить. Keep it simple.


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


                    counters := NewCounters()
                    counters.Store("habr", 42)
                    v, ok := counters.Load("habr")

                    В зависимости, опять же, от конкретной задачи, можно делать любые удобные вам методы. Например, для счётчиков удобно делать увеличение значения. С обычной map мы бы делали что-то вроде:


                    counters["habr"]++

                    а для нашей структуры можем сделать отдельный метод:


                    func (c *Counters) Inc(key string) {
                        c.mx.Lock()
                        defer c.mx.Unlock()
                        c.m[key]++
                    }
                    ...
                    counters.Inc("habr")

                    Но часто у работы с данными в формате "ключ"-"значение", паттерн доступа неравномерный — либо частая запись, и редкое чтение, либо наоборот. Типичный случай — обновление происходит редко, а итерация (range) по всем значениям — часто. Чтение, как мы помним, из map — безопасно, но сейчас мы будем лочиться на каждой операции чтения, теряя без особой выгоды время на ожидание разблокировки.


                    sync.RWMutex


                    В стандартной библиотеке для решения этой ситуации есть тип sync.RWMutex. Помимо Lock()/Unlock(), у RWMutex есть отдельные аналогичные методы только для чтения — RLock()/RUnlock(). Если метод нуждается только в чтении — он использует RLock(), который не заблокирует другие операции чтения, но заблокирует операцию записи и наоборот. Давай обновим наш код:


                    type Counters struct {
                        mx sync.RWMutex
                        m  map[string]int
                    }
                    ...
                    func (c *Counters) Load(key string) (int, bool) {
                        c.mx.RLock()
                        defer c.mx.RUnlock()
                        val, ok := c.m[key]
                        return val, ok
                    }

                    Решения map+sync.RWMutex являются почти стандартом для map, которые должны использоваться из разных горутин. Они очень быстрые.


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


                    Cache contention


                    Если посмотреть на код sync.RWMutex, то можно увидеть, что при блокировке на чтение, каждая горутина должна обновить поле readerCount — простой счётчик. Это делается атомарно с помощью функции из пакета sync/atomic atomic.AddInt32(). Эти функции оптимизированы под архитектуру конкретного процессора и реализованы на ассемблере.


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


                    На современном железе передача между L2 кешем занимает что-то около 40 наносекунд. Это немного, но когда много ядер одновременно пытаются обновить счётчик, каждое из них становится в очередь и ждёт эту инвалидацию и вычитывание из кеша. Операция, которая должна укладываться в константное время внезапно становится O(N) по количеству ядер. Эта проблема называется cache contention.


                    В прошлом году в issue-трекере Go была создана issue #17973 на эту проблему RWMutex. Бенчмарк ниже показывает почти 8-кратное увеличение времени на RLock()/RUnlock() на 64-ядерной машине по мере увеличения количества горутин активно "читающих" (использующих RLock/RUnlock):



                    А это бенчмарк на одном и том же количестве горутин (256) по мере увеличения количества ядер:



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


                    В стандартной библиотеке map-ы используются довольно много где, в том числе в таких пакетах как encoding/json, reflect или expvars и описанная проблема может приводить к не очень очевидным замедлениям в более высокоуровневом коде, который и не использует напрямую map+RWMutex, а, например, использует reflect.


                    Собственно, для решения этой проблемы — cache contention в стандартной библиотеке и был добавлен sync.Map.


                    sync.Map


                    Итак, ещё раз сделаю акцент — sync.Map решает совершенно конкретную проблему cache contention в стандартной библиотеке для таких случаев, когда ключи в map стабильны (не обновляются часто) и происходит намного больше чтений, чем записей.


                    Если вы совершенно чётко не идентифицировали в своей программе узкое место из-за cache contention в map+RWMutex, то, вероятнее всего, никакой выгоды от sync.Map вы не получите, и возможно даже слегка потеряете в скорости.


                    Ну а если все таки это ваш случай, то давайте посмотрим, как использовать API sync.Map. И использовать его на удивление просто — практически 1-в-1 наш код раньше:


                        // counters := NewCounters() <-- 
                        var counters sync.Map

                    Запись:


                        counters.Store("habr", 42)

                    Чтение:


                        v, ok := counters.Load("habr")

                    Удаление:


                        counters.Delete("habr")

                    При чтении из sync.Map вам, вероятно также потребуется приведение к нужному типу:


                    v, ok := counters.Load("habr")
                    if ok {
                       val = v.(int)
                    }

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


                        v2, ok := counters.LoadOrStore("habr2", 13)

                        counters.Range(func(k, v interface{}) bool {
                            fmt.Println("key:", k, ", val:", v)
                            return true // if false, Range stops
                        })

                    API обусловлен исключительно паттернами использования в стандартной библиотеке. Сейчас sync.Map используется в пакетах encoding/{gob/xml/json}, mime, archive/zip, reflect, expvars, net/rpc.


                    По производительности sync.Map гарантирует константное время доступа к map вне зависимости от количества одновременных чтений и количества ядер. До 4 ядер, sync.Map при большом количестве параллельных чтений, может быть существенно медленнее, но после начинает выигрывать у map+RWMutex:



                    Заключение


                    Резюмируя — sync.Map это не универсальная реализация неблокирующей map-структуры на все случаи жизни. Это реализация для конкретного паттерна использования для, преимущественно, стандартной библиотеки. Если ваш паттерн с этим совпадает и вы совершенно чётко знаете, что узкое место в вашей программе это cache contention на map+sync.RWMutex — смело используйте sync.Map. В противном случае, sync.Map вам вряд ли поможет.


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


                    Так же для вашего случая могут больше подходить други реализации hash-таблиц, например на lock-free алгоритмах. Подобные пакеты были давно, и единственная причина, почему sync.Map находится в стандартной библиотеке — этого его активное использование другими пакетами из стандратной библиотеки.


                    Ссылки


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

                    https://habrahabr.ru/post/338718/


                    Метки:  

                    Eggs Datacenter: как Emercoin позволил реализовать идею распределённого дата-центра на блокчейне

                    Понедельник, 25 Сентября 2017 г. 19:48 + в цитатник
                    EmercoinBlog сегодня в 19:48 Администрирование

                    Eggs Datacenter: как Emercoin позволил реализовать идею распределённого дата-центра на блокчейне

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

                      image
                      Раньше каждый ребёнок знал, что не следует держать все eggs в одной korzinka

                      Представленный 21 сентября на CryptoBazar в Москве проект распределенного дата-центра Eggs Datacenter собирается изменить сложившееся статус-кво на рынке традиционных ЦОДов при помощи технологий Emercoin.

                      Распределенный дата-центр Eggs Datacenter — тоже самое что и обычный ЦОД, только:

                      • без физической системы защиты, такой как высокие стены и злые овчарки,
                      • без веры в правила и стандарты XX века, такие как Tier 1-4,
                      • без невообразимой плотности пользователей на один хост.

                      — но с гибридной бизнес моделью.

                      По сути, это сеть одноранговых серверов, размещенных в помещениях малого и среднего бизнеса в 17 регионах России. Хостеры (бизнес) получают дешевый интернет по цене на 30-50% ниже рыночной, взамен позволяя размещать у себя мобильные сервера на базе форм фактора Mini-ITX. Каждый сервер оборудован 6 ядерным процессором Xeon с ECC, видеокартой Nvidia GeForce или Radeon GTX, 16 — 32 ГБ ОЗУ, 1 ТБ SSD диском. Среднее TDP не превышает 600 Вт. Как поставщик интернета, распределенный дата-центр контролирует сетевой стек на уровне L3, соответственно, весь траффик фильтруется и тщательно процеживается. Апстримами выступают Авантел, Rinet, Эр Телеком Холдинг и многие другие интернет провайдеры, стремящиеся загрузить свои оптоволоконные сети. В качестве гипервизора используется open-source XenServer 7.2 (Xen 4.0) и CloudStack.

                      Блокчейн — это и база хранения информации, и гарант её неизменности. Одним из вариантов применения блокчейна стала запись и хранение в нем важной информации в виде параметров «имя-значение» (NVS). Реализованное в блокчейне Emercoin, это решение позволяет локально сохранять данные публичных SSH-ключей, SSL-сертификатов и DNS-записей, не доверяя конкретному центру. Блокчейн Emercoin позволяет базирующимся на нём проектам быть и децентрализованными, и защищеннёми одновременно. Такова сила криптографии.

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

                      Гибридная бизнес модель снижает стоимость услуг, задержку доставки сигнала и риски кражи конфиденциальной информации, т.к. все хосты расположены локально и средняя плотность юзеров на хост — не более 6 человек. Но хостах стоит антивирус и используется FDE-шифрование для физической защиты жесткого диска пользователя в случае кражи/порчи оборудования. Блокчейн же используется как локальная система хранения SSH-ключей, SSL-сертификатов во избежании атаки «Человек посередине» и для защиты от компрометации DNS запросов. Среди тех, кто уже пользуется услугами дата центра — малый бизнес компании Eggs TV в Москве, Санкт-Петербурге, Нижнем Новгороде, Казани, Екатеринбурге и т.д. Большинство хостеров — сетевые бренды, такие как «Мать и дитя», Black Star, Dr Loder и другие.



                      Децентрализованному дата-центру — распределённое финансирование


                      Чтобы расширяться, проекту необходимо больше денег на установку серверов и переподключение хостеров к интернету. Собрать их Eggs Datacenter решил через краудфандинг. Для сбора средств, в продажу будут выпущены токены EGS на блокчейне Ethereum (стандарта ERC20), а по его завершении, токены будут использоваться для выплаты кэшбека за покупку услуг дата-центра: 10% от каждой покупки будут начисляться токенами, на которые, в свою очередь, можно будет оплатить оплатить интернет как малому бизнесу, так и обычным пользователям у себя дома. Планируемый объем выкупа токенов для кэшбека пользователям — 13 320 000 штук из максимального возможного объема эмиссии 30 000 000 токенов.

                      Как принять участие в pre-ICO на Emercoin


                      Для своего Pre-ICO Eggs Datacenter выбрали тоже Emercoin как наиболее подходящую, на взгляд разработчиков, для краудфандинговых кампаний, соблюдающих нормы KYC/AML.

                      Чтобы купить EGS со скидкой от 20% до 50% ранним инвесторам нужно будет оставить оставить заявку на сайте Eggs Datacenter. Им на почту придёт уникальный идентификатор и список уникальных кошельков в 7 основных валютах: USD, RUB, BTC, ETH/ETC, EMC, WAVES.

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

                      Проверить свою запись можно будет прямо в Emer-блокчейне или в любом кошельке Emercoin. К ICO будет будут выпущены токены EGS уже на Ethereum, ссылку для зачисления которых все участники pre-ICO получат на свои электронные адреса.

                      Пообщаться с разработчиками проекта можно в Telegram-чате.


                      EGGS Datacenter: Мы заботимся о яйцах
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/338572/


                      Метки:  

                      Поиск сообщений в rss_rss_hh_full
                      Страницы: 1824 ... 1547 1546 [1545] 1544 1543 ..
                      .. 1 Календарь