2016-12-24

Об IFTTT

Недавно Telegram обзавёлся поддержкой IFTTT. Или IFTTT обзавёлся поддержкой Telegram. Это смотря с какой стороны смотреть. Самое время вспомнить, что такое IFTTT, и зачем оно нужно.
IFTTT — это IF This Then That. Если Это, То То. Если что-то где-то происходит, то сделать с этим то-то. Что-то и то-то — это интернет сервисы, а в последнее время и всякие штуки интернета вещей. Если что-то случается в одном интернет сервисе или умной домашней штуке, можно сделать что-то в другом интернет сервисе или другой умной домашней штуке.
IFTTT
Эти сервисы или штуки раньше назывались каналами (channel), а сейчас, называются именно сервисами. Просто сервисы, с которыми может работать IFTTT. У каждого такого сервиса есть две стороны. С одной стороны оно может стоят в условии if, т.е. быть источником каких-то событий. Называется это триггером (trigger). С другой стороны оно может стоять после then, т.е. совершать какие-то действия. Называется это экшеном (action).
Объединение условия и действия раньше называлось рецептом (recipe), а сейчас называется апплетом (applet). Задаёте себе апплеты и они работают. Где-то в недрах IFTTT, типа в облаке. Это тотальная автоматизация интернетов. И, в какой-то мере, умных домов.
IFTTT
Я постоянно пользуюсь такими рецептами. Feed в качестве триггера. Это полноценная читалка RSS и Atom лент. Соответственно, событие возникает, когда появляется новая запись. Ну ещё опциально можно отфильтровать по ключевым словам. И Pocket в качестве экшена. Это тот самый Pocket, который замечательное приложение для чтения потом. В него я засовываю всякоразные статьи, чтобы потом с комфортом читать с планшета. А с помощью IFTTT туда же сами попадают новые статьи из RSS. Таких рецептов, Feed + Pocket, у меня аж шестнадцать штук. Таким странным образом я подписываюсь на RSS.
Конечно же, можно подписаться на RSS через Feedly. Помните, он возник, когда Google похоронила свой Reader, объявив, что RSS умирает. Вот только Feedly предоставляет интеграцию с IFTTT только в Pro версии, которая стоит денег. А Feed в IFTTT — бесплатен.
Ещё один мой рецепт шлёт новости из Feed по электропочте. Сервис Email умеет слать симпатичные письма.
Есть интеграция и с Gmail. Но Gmail больше подходит для отправки писем, от вашего имени, чем для получения писем. Как-то письма с новостями от самого себя выглядят немного странно. А вот триггеры у Gmail весьма интересные. Можно мониторить входящие, по меткам или разным условиям поиска. А уж в then потом можете сделать что угодно.
У IFTTT есть приложение для Android. В нём можно рулить рецептами. Но и IFTTT получает возможность рулить вашим Андроидом. IFTTT может следить за состоянием батареи вашего телефона, есть соответствующие триггеры. Может следить (триггеры) за Bluetooth и Wi-Fi подключениями, и менять (экшены) рингтоны, обои и прочую мелочь. Может следить за вашим местоположением. Может следить, кто вам звонит и какие звонки вы пропустили. Узнаёт, когда вы сделали новую фоточку. Может следить на СМСками и даже отсылать их. А ещё может отсылать уведомления на умные часы с Android Wear.
Конечно, более специализированные штуки, работающие в рамках одного Android устройства, могут быть более точны и эффективны. Например, для отключения звонка, когда находишься на работе, лучше работает Locale или Llama. А Automate вообще творит чудеса. А фоточки в облако прекрасно заливает и сам Google Photos. Но когда надо связать разные сервисы с вашим телефоном, а прямой интеграции нет, то IFTTT остаётся чуть ли не единственным вариантом.
Кстати, вместо какого-то условного триггера, можно просто разместить кнопку на экране вашего телефона. Нажимаете кнопку, и некий экшен происходит.
IFTTT
IFTTT — это самый универсальный способ репоста между разными соцсеточками. Поддерживаются Twitter, Facebook, Foursquare, Instagram, LinkedIn и некоторые другие. А вот ни ВКонтакте, ни Гуглоплюса нет.
Гугль вообще как-то плохо дружит с IFTTT. Гуглокалендарь, например, есть. Но триггер там срабатывает только в момент наступления события в календаре, а вовсе не заранее. Почти бесполезно.
Поддерживаются чатики. Можно послать сообщение в Slack. А можно что-то сделать в Telegram.
Интеграция с Телеграмом получилась очень мощная. Со стороны Телеграма это выглядит как бот по имени @IFTTT. Его можно добавить в группы и каналы. И триггером в IFTTT будут определённые сообщения напрямую боту или в эти группы или каналы. А в качестве экшена IFTTT может посылать сообщения, фоточки, видосики, музычку прямо вам или снова в группы или каналы. Даже не выходя за пределы Телеграмма получается довольно мощный и универсальный бот. Но ведь триггерами в IFTTT может быть почти всё, что угодно, и экшенами тоже всё, что угодно. Можно настроить уведомление в Телеграм о всём, что угодно. Или наоборот, настроить управление из Телеграма всем, чем угодно.
Интернет вещей. Есть простые штуки, вроде тех самых лампочек, меняющих цвет, с неприличным названием Philips Hue, или того самого термостата Nest. А есть интеграция с сервисами, которые сами являются полноценными мозгами для умного дома, например, openHAB.
В общем, IFTTT — очень крутая штука. И часто — совершенно бесплатная. Довольно сложно сразу придумать, зачем он нужен. Но иногда он весьма элегантно решает насущные проблемы.
Сейчас IFTTT почему-то акцентирует внимание на готовых апплетах, хотя вся мощь IFTTT запрятана в сервисах. Начните с поиска сервисов. Посмотрите, что они умеют. Вдруг пригодятся.
IFTTT Infrastructure

2016-12-18

О субботнике

В Омске у нас раз в месяц проходят ИТ субботники. Это такие маленькие полустихийные конференции на айтишную тематику.
А в прошлый раз субботник был выездным. На самом деле, он случился вместо более большой конференции HappyDev. Ну просто подустали организовывать, бегать за иногородними докладчиками. Поэтому решили просто потусить на БО им. Стрельникова. Самостоятельно. Силами омичей. Впрочем гости из Новосибирска и Павлодара тоже были.
Олскульный субботник
Получилась маленькая (хотя не такая уж и маленькая) тесная тусовочка с вечера пятницы до вечера субботы, или даже воскресенья (кто хотел, тот остался). Причём по уровню полезности получилось получше иных полноценных двухдневных конференций.
Вечером пятницы случились баркемпы. Сергей Мячин взялся рассказать про корпоративную культуру. А получился какой-то экскурс в особенности человеческого мышления. Про то, что всякие причинно-следственные связи — это иллюзия. Что то, что мы считаем истинным — лишь наши предубеждения и навязанные стереотипы. В общем, про то, что все врут, и в первую очередь сами себе. Нормуль. Но причём тут корпоративная культура и ИТ, я не понял.
А потом был бассейн. Кто не помнит, в Стрельникова есть открытый йодо-бромный (типа лечебный, мутно-коричневатый) бассейн. Открытый. В минус 17. Вода плюс 32. Очень мило и хорошо. И сауна рядом. Я там два часа плюхался. Кто-то не просто плюхался, но и болтал. Кто-то ещё и запивал напитками. Хорошо.
Докладчики
Первая половина субботы была посвящена докладам. Ну почти как на конференции.
Вадим Литвинов, постоянный гость из Новосибирска, рассказал про интересную штуку. Как по фотографиям, с разных точек или ракурсов, или по видеосъемке, построить 3D модель объекта или окружающего пространства. Например, по записи видеорегистратора можно построить модель улицы, с фасадами и текстурами. Очень интересно было узнать, какой матан при этом используется. Про воксели я догадывался, но что можно 3D пространство разбить на тетраэдры, обозначить пустые и принадлежащие объекту, получить поверхность и затекстурировать её, я не знал. Здорово, что для всей этой магии нужны только плоские изображения, ничего больше. Только нужно ещё знать параметры линз, через которые делалась съемка, чтобы убрать их нелинейные искажения.
Алексей Городецкий очень кратко и интересно рассказал про LLVM. Как работают компиляторы. Почему между языком высокого уровня с одной стороны и машинным кодом конкретной платформы с другой стороны получается универсальное промежуточное представление. В LLVM — это инструкции виртуальной машины. Какие получаются преимущества от наличия этого универсального представления.
Евгений Тюменцев рассказал про разновидности формальных грамматик, тех самых, которыми описываются языки программирования. Каким образом осуществляется синтаксический анализ этих наших языков.
Как-то темы про компиляторы и то, как они работают, возникли как раз в тот момент, когда мы на курсах программирования на Java, занялись созданием лексического анализатора. Удивительное совпадение.
Алексей Коровянский поведал о дополненной реальности, которая Augmented или AR. Не путать с виртуальной реальностью, которая Virtual или VR. Что там как. Как поживает проект Tango от Google, где есть куча всяких крутых датчиков в формате небольшого планшета, чтобы эту самую дополненную реальность строить. Это пересекается с докладом Вадима. Только тут датчиков больше, и штуковина в реальном времени строит объемное представление того, что видит, и дополняет картинку виртуальными элементами. После таких докладов даже родился спор: что победит на рынке, дополненная или виртуальная реальность?
Хаски
Потом были хаски и обед. Хаски, лайки и прочие милые собачухи. Осторожно, они очень милые. Всего меня облизали, когда я присел к ним на корточках. Обед был вкусный, как всегда.
После обеда снова были баркемпы. Я посетил три штуки.
Александр Селезнёв поделился личной болью. Что никто не знает и не понимает, каким должен быть DevOps. И никто не делает DevOps так, как положено. Не должно быть отдельного отдела DevOps, не должно приглашать отдельного DevOps на проект. DevOps — это ещё одна кучка проектной работы, которую нужно делать.
Игорь Артамонов рассказал про блокчейн вообще и Ethereum в частности. Очень интересно. А история раскола Ethereum на Ethereum Classic и просто Ethereum достойна увековечивания в каком-нибудь голливудском фильме.
Напоследок, под вечер субботы, Евгений Тюменцев дал ответ Николаю Линкеру по поводу функционального программирования. Речь о том, что в функциональном программировании нет решающего преимущества. Просто вместо объектов у нас тут функции. И SOLID принципы, хоть и были сформулированы для ООП, вполне себе применимы и для ФП.
Между делом нашлась отличная метрика трудоёмкости программных единиц. Эта метрика вполне может быть подсчитана какой-нибудь IDE. И те функции или методы, где она будет слишком высокой, должны быть досмотрены и переписаны. Хорошая идея для плагинчика к IDEA.
Писюк
В качестве ночных посиделок на субботнике была игротека. Кучка настольных игр. Неаутентичный "Денди", купленный в "Метро ЦЦ". PS4. И я ещё притащил старый писюк, откопанный в чулане. Целерон об 1.2 гигагерцах, одноядерный. 100 МГц системная шина. 384 мегабайта ОЗУ. GeForce 2 MX 400. Винт на 60 гигабайт. Нормальный такой писюк начала двухтысячных. Мы ещё ЭЛТ монитор нарыли, чтобы было ещё более аутентично.
Я замучался на это железо накатывать Windows 98 SE. Там уже давно Linux стоял. А теперь захотелось в старые игрушки поиграть. Если на сайтах Nvidia и Gigabyte вполне ещё можно найти старые драйвера, в разделе legacy hardware, то на сайте Microsoft нет совсем ничего, относящегося к тем временам. Даже DirectX для Windows 98 пришлось качать с каких-то левых форумов энтузиастов.
Кажется, игротека сработала. Сам я немного поиграл в Rollcage и The Neverhood. Но кто-то ещё ночами мучал сей комп. Мы рядом с компом положили старые CD с играми. И после субботника обнаружилось, что кто-то поставил несколько частей HoMM и даже Black & White (хотя, насколько помню, она еле шевелилась на этом железе).
Ёлочки
Непонятно, что лучше, выездной субботник или полноценная конференция. Концентрация полезных докладов получилась выше. Народу было меньше. Возможно, в следующем году выйдет что-то промежуточное по формату.

2016-11-30

О спаме

В электропочте много спама. Со спамом борются. Борются довольно успешно. Так что даже приходится бороться со средствами борьбы со спамом.
Подымаешь какой-нибудь сервер, и этот бедный сервер не может отослать письма так, чтобы они не попали у получателя в спам. Потому что как минимум пара довольно интересных технологий борьбы со спамом нашли таки широкое применение. А значит, надо их учитывать и применять на своём сервере.
Смысл обеих технологий сводится к проверке сервера, который отправляет почту. А действительно ли этот сервер имеет право отправлять письма от данного почтового домена?
Postbox
Технология номер раз. SPF — Sender Policy Framework. Проверяется IP адрес сервера, отправляющего почту. Правила проверки задаются в DNS домена, в виде TXT записи, рядом с MX записью. Если вы не знали, то знайте, в DNS можно хранить произвольные текстовые данные. Впрочем, весьма ограниченной длины, ибо должны влезать в один UDP пакет.
Синтаксис SPF записи весьма прост. Сначала идёт префикс, указывающий, что это именно SPF запись, именно версии один.
v=spf1
Далее идут механизмы проверки, разделённые пробелами. Порядок определения механизмов важен, ибо проверка адреса сервера происходит именно в этом порядке.
Можно указать IPv4 или IPv6 адрес, или сеть в CIDR нотации.
v=spf1 +ipv4:188.232.141.211 +ipv6:2a02:2698:5424:f600::1
Плюсик в начале означает "pass", т.е. серверу с данным IP разрешено отправлять письма с этого домена. Плюсик подразумевается по умолчанию, поэтому повсеместно опускается.
Можно сказать, что все MX сервера, т.е. перечисленные в MX записях данного домена, могут отправлять почту данного домена.
v=spf1 mx
Можно сказать, что все A записи данного домена, т.е. IP адреса, в которые данное доменное имя резолвится, могут отправлять почту данного домена.
v=spf1 a
Можно сказать, что мы тут, в этом домене, не особо знаем, какие сервера будут отправлять нашу почту, а потому, мол, спроси SPF запись того домена. Это особенно актуально, если ваша почта хостится где-нибудь, например, у Гугла. И отправляется, соответственно, хоть и от вашего домена, но серверами Гугла.
v=spf1 include:_spf.google.com
Последним, но очень важным механизмом должен стоять all. Если все остальные правила не сработали, надо принять какое-то решение. -all (с минусом) означает, что все письма с вашим доменом отправителя, отправленные с серверов, не разрешённых предыдущими правилами, должны быть отвергнуты. Это означает, что письмо не будет принято и не дойдёт до получателя. Обычно так не делают, ибо, если вдруг случайно айпишник сервера сменится, письма перестанут доходить, а этого никто не хочет. Поэтому ставят ~all (с тильдой), что означает "soft fail", т.е. вроде низя, но мало ли что. Такие письма как раз и попадают в спам.
Итоговая TXT запись для вашего домена может выглядеть так:
example.com.    300 IN  TXT "v=spf1 include:_spf.google.com ~all"
Из-за того, что в конце ставят не сильно категоричный ~all или даже совсем неуверенный ?all, а также потому, что SPF запись всё ещё отсутствует у многих доменов, SPF не так сильно защищает от спама, как могла бы.
Кстати, чтобы не мучаться с этими механизами и всем прочим, есть онлайн конструкторы SPF записей.
SPF
Технология номер два. DKIM — DomainKeys Identified Mail. Привлекаем криптографию. Сервер перед отправкой подписывает письмо своим приватным ключом (это ассиметричное шифрование). Сервер получателя (или даже почтовый клиент получателя) проверяют правильность подписи публичным ключом. Сам публичный ключ хранится тоже в TXT записи DNS.
Серверов, отправляющих почту, может быть много. Чтобы не копировать один и тот же приватный ключ на все сервера, в DKIM поступили хитрее. С одним доменом может быть связано несколько пар ключей. То, какой ключ использовать, определяется селектором (selector).
Итак, чтобы нам начать подписывать письма на нашем сервере, отправляющем почту, нужно сгенерировать пару ключей. Это просто сделать с помощью OpenSSL.
openssl genrsa -out domainkey.pem 1024 -outform PEM
Ключи длиннее 2048 бит в DKIM не используются, опять-таки из-за ограничений на размер пакета DNS ответа. 1024 бит вполне достаточно.
OpenSSL создаёт pem файл, начинающийся с -----BEGIN RSA PRIVATE KEY-----. На самом деле в этом файле находится пара ключей. Нам нужно вытащить публичный ключ.
openssl rsa -in domainkey.pem -out domainkey-public.pem -pubout -outform PEM
Теперь у нас есть файл, начинающийся с -----BEGIN PUBLIC KEY-----. Вот его содержимое, с этого бегина и до -----END PUBLIC KEY-----, без переводов строки, и надо поместить в TXT запись. Только не в TXT запись самого домена, а поддомена селектор._domainkey. Как-то так:
mail._domainkey.example.com. 300 IN TXT \
"k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD0GCsik63lng6q171lmHx869xrYL9qExYM3YQuYpfEXoDnoatOsDUh8dNKnEzGr+jXxU8LOy/6haR32Is3gT9sKIYQ0QWFzG0wdu7moXfAmJcAdoElj6H2DV7Xkk6oFNz0W/8RB6Jw8nQnITTdRkN+ZQi0AjaDFIxXOeM749RspQIDAQAB;"
Ещё раз, селекторов может быть много, ключей тоже. Поэтому поддоменов _domainkey тоже может быть много. Иногда в начало TXT записи добавляют v=DKIM1;.
Конструкторы тоже имеются. Но я бы поостерёгся тех, которые сами генерируют ключи. Таки приватный ключ лучше сгенерировать самому, и никому его не давать.
С публичным ключом разобрались. Нужно теперь сделать так, чтобы письма подписывались приватным ключом. Для этого есть OpenDKIM. В Debian и Ubuntu он живёт в одноимённом пакете. Это — milter, т.е. почтовый фильтр, который можно подоткнуть как к Sendmail, так и к Postfix.
OpenDKIM может как подписывать отправляемые почтовые сообщения, так и проверять подпись в принимаемых сообщениях. В простейшем случае, когда нужно только подписывать письма и только с одного домена, его конфигурационный файл /etc/opendkim.conf может быть таким:
# стартовать как демон, писать в сислог и т.п.
AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           yes
LogWhy                  yes

# как канонизировать (т.е. нормализовать) заголовки и тело письма
# relaxed для заголовков означает привести их к нижнему регистру
# убрать лишние пробелы и всё такое
# simple для тела письма означает только игнорировать
# последнюю пустую строку в конце письма
Canonicalization        relaxed/simple

# домен, который подписываем
Domain                  example.com
# селектор, которым подписываем
Selector                mail
# приватный ключ, которым подписываем
KeyFile                 /etc/opendkim/domainkey.pem

# режим работы, только подписываем
Mode                    s

# где пид файл хранить
PidFile                 /var/run/opendkim/opendkim.pid

# каким алгоритмом подписывать
SignatureAlgorithm      rsa-sha256

# под каким пользователем запускать демона
UserID                  opendkim:opendkim

# где демон будет слушать
Socket                  inet:[email protected]
Теперь Postfix может подключить этот milter. В /etc/postfix/main.cf нужно добавить несколько строк.
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:12301
non_smtpd_milters = inet:127.0.0.1:12301
OpenDKIM может заниматься подписью и нескольких доменов. Тогда ему нужно сказать, в каких случаях какими ключами пользоваться. Это настраивается несколько сложнее, но принципы не меняются.
В результате работы OpenDKIM в письме появляется ещё один заголовок.
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com; s=mail;
 t=1479817077; bh=pr3OwqtRJV10SOrRVobgyVcUHIepUu4Dr5yPJGUpD7s=;
 h=Date:To:From:Subject:From;
 b=G8MGkpMDnusbtuL29KSW6z1maK/M2HcvEP+rRSvVifsFfdgXTcPv7yHVEZfjw8z5K
 C6IF7/BDtEifsRb9H1Saauu1IsBoCO5NbRjciGxgWsAK6GGqW+RL1TxJpDlODY8z4g
 LCDe+zGxqD4MmnudDvuImPVZzFt+0dGIdMQ3P8Sw=
Тут у нас присутствет куча настроек OpenDKIM. Алгоритм подписи "a=". Канонизация "c=". Домен "d=". Селектор "s=", именно так принимающая сторона понимает, каким ключом проверять. Заголовки "h=", которые использовались при формировании подписи. Заметьте, далеко не все заголовки включены в подпись.
DKIM
Как проверить, что всё это работает?
Можно отправить письмо себе на Gmail ящик. Гугловый почтовый сервер добавит к письму заголовок (чтобы его увидеть, надо посмотреть исходный текст письма).
Authentication-Results: mx.google.com; dkim=pass [email protected]; spf=pass
 (google.com: domain of [email protected] designates 188.232.141.211 as permitted
 sender) [email protected]
Соответственно, "dkim=pass" и "spf=pass" означают, что соответствующие проверки прошли успешно.
Кстати, Gmail добавляет DKIM подпись для писем, пересылаемых через него с полной авторизацией.
Подобный же отчёт, но в вебе, с красивыми картинками, можно получить, если зайти на mail-tester.com и послать письмо на указанный адрес. Осторожно, после третьего письма за сутки начнут просить денег.
Sunny mail
Есть ещё третья технология. DMARC — Domain-based Message Authentication, Reporting and Conformance. В некотором смысле это объединение SPF и DKIM. Вы можете добавить ещё одну TXT запись к вашему домену. Точнее к поддомену _dmarc.
_dmarc.example.com. 300 IN  TXT \
"v=DMARC1;p=reject;pct=100;rua=mailto:[email protected]"
Этим вы скажете получателям писем от вашего домена, чтобы они обязательно проверяли письма посредством SPF и DKIM. Если письма не проходят проверку, их надо отбрасывать ("p=reject"), причём отбрасывать 100% писем ("pct=100"). Отбрасывать не просто так, а некоторую агрегированную статистику слать на почту [email protected] Да, таким образом владелец домена может получать информацию о том, как много спама ходит от его имени.
DMARC
Есть, конечно, куча других мелочей, влияющих на спамовость письма. Тело письма, если уж содержит HTML разметку MIME типа "text/html", должно ещё содержать и альтернативное представление в виде "text/plain". По крайней мере, если оно не так, это не нравится SpamAssassin. Ваш почтовый сервер должен представляться (указывать в SMTP команде HELO/EHLO) правильным доменным именем, в которое должен обратно резолвится его собственный IP адрес. Это тоже проверяется.
В общем, сейчас можно сделать так, чтобы правильные письма, отправленные вашим правильным почтовым сервером, разительно отличались от писем всяких негодяев, пишуших якобы от вашего имени/домена. И этими способами уже совсем-совсем нельзя пренебрегать.
З.Ы. Красивые картинки взяты с блога компании Postmark.

2016-10-31

О MyCloud

Давно хотел завести маленький тихий уютный домашний сервер. Казалось бы, что проще. Воткни десктоп работать круглосуточно. Пробрось ему порты куда надо. И будет тебе сервер.
My Cloud
Но, оказывается, у меня уже давно нет в доме десктопов. И, мониторов, соответственно. Только ноутбуки, планшеты и умнотелефоны. Так исторически сложилось. С десктопом не поваляешься на диване, не почитаешь новости в местах квартиры, что поближе к воде. Десктоп большой, ему нужно постоянное место, он гудит вентиляторами. Гудение — это вообще беда. Ночью же в квартире тихо. Так, что слышно, как собака у соседей чешет во сне за ухом.
В общем, десктопа нет. Но есть желание смотреть фильмы, коллекционировать музыку и книги. И от стопки DVD я тоже отказался. И умнотелевизор имелся. Так что какое-то время роль домашнего сервера, ака файлопомойки, выполнял роутер.
Хороший мощный TP-Link, 128 мегабайт ОЗУ, 8 мегабайт флэша, гигабитный езернет, пятигигагерцовый вайфай 802.11n, пара портов USB 2.0. Вот за USB его и выбирал. Подрубаем обычный карманный USB винт на терабайтик, и файлопомойка готова.
Впрочем, штатная прошивка довольно плохо работает в таком режиме. Поэтому водружаем еще OpenWRT. И наступает момент счастья. Немного костыляем с загрузкой модулей ядра для поддержки NTFS на внешнем диске. Ставим Samba. В минимальном виде файлопомойка готова. Можно еще FTP, если захочется, но как-то не сложилось у меня с его настройкой, а SMB более чем хватает для засылки файлов через локалку.
Но у нас же умнотелевизор. Открываем себе прелести DLNA. И водружаем MiniDLNA на роутер. Оно работает! Не без мелких глюков, конечно. Но работает. Стабильно. А аналогичная фиговина в штатной прошивке висла через полдня.
Ну вы поняли. Хостить сайты дома я не собирался. Хотелось просто домашней файлопомойки-фильмо-аудиотеки. И, в какой-то мере, получилось.
Перед и зад
Но тут случились переезд и новый умнотелек с UHD экраном. Где брать 4K видосы? На торрентах. Как качать торренты? С ноутбука. С ноутбука не удобно, он постоянно утаскивается из дома и выключается на ночь. К тому же оказалось, что выкачать торрент из интернетов получается быстрее, чем прокачать его по локалке на винт через USB 2.0.
Надо что-то менять. Водрузить торрентокачалку на роутер? Можно. А он не треснет? Оказалось, ещё как треснет. Банально в 8 мегабайт флэшки не умещаются одновременно dynamic DNS клиент и тот же MiniDLNA. Просто для dyn DNS через Cloudflare нужен HTTPS. А HTTPS в OpenWRT — это мегабайты всякой мути вроде OpenSSL, которые не входят в простой обычный BusyBox. Некуда тут ещё и торрентоклиент засовывать. Ну и USB 2.0 и терабайта будет маловато для 4К видосиков. Нужно новое железо.
Присматривался к разным NAS. Дорого. Да ещё без жёстких дисков продаются. Диски тоже надо подбирать. Присматривался к маленьким корпусам. Но опять-таки, вентиляторы. И опять-таки собирать и подбирать всё ручками не очень хотелось. Много беседовал со своей жабой.
И тут сосед по лофту предложил посмотреть на My Cloud. Внешний жёсткий диск от Western Digital. Посмотрел. Понял, что это вроде то, что нужно. Купил. Настроил. Пользуюсь.
Размеры
Имеем, во втором поколении данных устройств, что нынче продаются. Marvell Armada 375 с двумя ядрами ARMv7 с частотой до гигагерца. 512 мегабайт памяти. Гигабитный езернет. USB 3.0. Жесткий диск семейства WD Red, вроде как специально предназначенный для работы в NAS, т.е. быть постоянно включенным. В моём случае на 4 терабайта. В общем, полный фарш для моего случая. И без вентилятора.
Да, никакого резервирования нет. Но для файлопомойки, имхо, не очень-то и надо. Ну а для желающих обязательно иметь какой-нибудь худо-бедный RAID, есть и My Cloud Mirror.
Red
Из коробки мы получаем очень даже много для такой маленькой коробочки. Приличный веб интерфейс. Доступ к диску через немыслимое количество протоколов: SMB, NFS, FTP. На радость маководам есть даже AFP и совместимость с Time Machine. На радость параноикам есть возможность бэкапа всей файлопомойки на другой My Cloud, зареганный под вашим же аккаунтом, или на USB диск, или просто на любое другое доступное сетевое хранилище.
Есть и DLNA медиа-сервер. Говорят, на основе TwonkyMedia. Работает. Достаточно всеяден. Достаточно быстро индексирует файлики. Кажется, ради него там даже MySQL запущен.
Веб морда
Самое интересное, конечно, регистрация и подключение к загадочному облаку WD. Безо всяких танцев с динамическим DNS и прокидыванием портов мы получаем доступ к нашим файлам в файлопомойке. Из Интернетов. Авторизованный. Через веб клиент (такой недо-дропбокс). Вроде даже можно отдельные файлы ссылкой расшаривать и давать доступ анонимусам. Через мобильный клиент. Который не только даёт доступ к файлам, но и умеет автоматически заливать фоточки с мобилки в вашу персональную облачную помойку, которая стоит у вас дома. Кстати, технически этот доступ делается через OpenVPN от девайса до недр WD.
Для меня очень очень приятным бонусом оказалось, что этот мобильный клиент ещё и довольно сносно умеет играть музыку с этого нашего облака. Я, наконец-то, понял, что делать с накопившимися альбомами любимых исполнителей: заливать их в My Cloud и слушать. Где угодно, где есть Интернет. Пока есть Интернет и электричество у вас дома, где облако стоит. Нет нужды искать альбомы во всяких айтюнсах, ямузыках и вконтактах, всё любимое и родное уже имеется на родном облачке, аккуратненько раскиданное по правильным папочкам. Ну а как пополнять муз коллекцию, вы и без меня догадаетесь.
Приложеньице
Это то, что имеется из коробки. А ведь ещё можно включить ssh. Правда это тут же лишает вас гарантии. В предыдущем поколении My Cloud имелся, хоть и сильно порезанный, но вполне себе Debian. К нему можно было подтыкать дебиановые репозитории и просто доставлять нужный софт. Во втором поколении, что у меня, живёт загадочный Linux MyCloud. В нем никаких репозиториев Debian уже не наблюдается. И какой-то странный BusyBox, который даже не умеет выводить юникодные имена файлов в консоль.
Но ребята с известного форума, чьё название начинается на "4", а заканчивается на "pda", уже со всем разобрались. Оказывается, в штатном веб интерфейсе есть несколько скрытых опций, которые можно легко включить через ssh. Например, включить доступ к хранилищу через WebDAV. Или поддержку IPv6, которая, впрочем, так и не заработала.
Самая же интересная скрытая возможность: установка приложений. В каких-то архивах секретного формата. Прямо через веб. Соответственно, энтузиасты придумали приложение, которое закрепляет эти секретные опции (иначе они исчезают после перезагрузки). А также портировали несколько других приложений.
Можно заполучить тот же самый Debian Jessie, только в chroot. Можно поднять BitTorrent Sync. Можно запустить клиента Dropbox (и получить ещё одну копию тамошней файлопомойки). Можно раздавать музычку посредством Squeeze Center или Icecast. Можно возрузить Plex Media Server (Зачем нужен Plex, если уже есть домашнее облако?). Можно поднять парочку пэхэпэшных приложений: Joomla, phpBB, phpMyAdmin. Еще можно, наверное, сканировать файлы посредством ClamAV. Можно обмениваться файлами через aMule.
Я ограничился установкой Transmission. А Трансмишен умеет слушать папочку, и добавлять в раздачу торренты, когда в папочке появится новый .torrent файл. Так можно, не выпячивая веб интерфейс самого Трансмишена наружу, добавлять закачки даже с телефона, через то самое приложение от WD.
Получилась тихая (ночью слышно шуршание диска, если открыть шкаф и постоять рядом, затаив дыхание) домашняя торренто-качалка-раздавалка. Плюс нормальный медиа-сервер, который способен скормить телеку 4К видос на 50 мегабайтах в секунду. Плюс коллекция любимой музыки. Плюс просто домашняя файлопомойка. Нормуль.

2016-10-18

О Docker Swarm

Swarm — это рой.
В частности, насекомых. Пчёл, например. Но лично у меня это слово ассоциируется со стаей зергов. Помните, такие милые и очаровательные букашки? Ну а в Docker тоже есть свой Swarm — рой Docker Engine.
Zerg Swarm
Одиночный Docker Engine запускает контейнеры на локалохосте, из образов, либо собранных тоже на локалхосте, либо выкачанных с Docker Hub.
Docker Swarm — это кластер Докеров. Множество хостов, на каждом из которых запущен отдельный Docker Engine, объединены под общим управлением, и выглядят как один большой Докер. Хосты могут добавляться в кластер, и вычислительная ёмкость вашего большого Докера будет тоже увеличена.
Поднять свою стаю Докеров довольно легко. Главный момент: компоненты кластера — это тоже докер контейнеры. Вообще складывается ощущение, что в мире Докера образы используются как обычные приложения: можно и нужно запускать одни и те же образы с разными параметрами, чтобы получить нужный результат.
Docker Swarm
По умолчанию Docker Engine, то бишь демон Docker, управляется через локальный сокет /var/run/docker.sock. Для Swarm демоны должны управляться удалённо, через TCP. Поэтому демону нужно добавить параметр запуска:
-H tcp://0.0.0.0:2275
Демон будет слушать порт 2275, без TLS шифрования. В Ubuntu с Upstart этот параметр задаётся в файле /etc/default/docker, дописать в переменную DOCKER_OPTS.
docker cli
Управлять Swarm будет Swarm Manager. Это, внезапно, контейнер, запущенный из образа swarm с параметром manage.
Можно для этого образа ручками сделать docker run. Можно сочинить docker-compose.yml. Но я, так как дело будет происходить на кучке хостов кластера, предпочёл запользовать Ansible. Модуль docker_service работает вполне себе ничего. Он дёргает docker-compose на целевой машине. А описание самого композа можно задать прямо в ансибловой задаче (и там и там, таки, YAML), со всей мощью шаблонов, конечно.
Получается, что через Ansible Docker Swarm Manager можно запустить как-то так.
- name: start swarm manager
  run_once: true
  become: yes
  docker_service:
    project_name: swarm
    definition:
      version: '2'
      services:
        manager:
          image: swarm
          command: 'manage -H :3375 --advertise {{ inventory_hostname }}:3375 consul://{{ inventory_hostname }}:8500'
          restart: unless-stopped
          ports:
            - '3375:3375'
run_once пригодится, чтобы не запустить случайно несколько менеджеров. В кластере действительно может быть несколько менеджеров. Они устраивают выборы, и кто победит, становится primary, а остальные replica. Впрочем, команды можно слать на любой, replica будет пересылать их в primary.
Тут можно указать project_name — ту самую первую часть имени контейнеров, создаваемых Docker Compose, которая обычно берётся из имени каталога, где лежит docker-compose.yml.
Берём образ по имени swarm c Docker Hub, и выполняем в нём команду manage с параметрами.
Ключ -H указывает порт, который будет слушать менеджер. Этот порт нужно пробросить наружу в директиве ports. Для доступа к менеджеру без TLS шифрования принято использовать порт 3375.
Чтобы менеджеры видели друг друга для выборов используется ключ --advertise, где указывается внешнее имя хоста и порт, по которому доступен данный менеджер, так он будет себя объявлять. Ещё нужен ключ --replication без параметров, его я тут не указал, потому что если у вас менеджер один, он рискует ни с кем не договориться, кто здесь главный, и зависнуть в состоянии replica, рой тогда не заведётся.
Последний параметр команды manage — адрес Consul. Менеджеру нужно какое-то распределённое хранилище, чтобы хранить адреса и состояния узлов кластера, а также выбирать главного менеджера. Хранилищем можен быть Consul, или Etcd, или Zookeeper.
Мегаполезный параметр restart у Docker и Docker Compose появился с Докера 1.10. Он говорит демону, нужно ли запускать этот контейнер при старте самого демона. always — запускать всегда. unless-stopped — запускать всегда, если только контейнер не был ранее остановлен явно (через docker stop или docker-compose down). Так как Swarm нам нужен после ребута, ставим этот параметр.
Swarm Manager Backup
Нам нужен кластер Consulа. Конечно же сам Консул будем запускать в докер контейнере. На всех узлах Swarm кластера и там, где запущен Swarm Manager. Чтобы все, кому нужен Consul, могли бы ходить за ним на свой собственный хост. Конечно же для Consul уже есть готовый образ, который нужно запустить с правильными параметрами.
На одном из узлов нужно стартовать сервер Консула.
- name: start consul
  run_once: true
  become: yes
  docker_service:
    project_name: swarm
    definition:
      version: '2'
      services:
        consul:
          image: progrium/consul
          command: "-server -advertise {{ inventory_hostname }} -bootstrap"
          restart: unless-stopped
          ports:
            - '8300:8300'
            - '8301:8301'
            - '8301:8301/udp'
            - '8302:8302'
            - '8302:8302/udp'
            - '8400:8400'
            - '8500:8500'
Сервер должен объявить о себе другим Консулам, для этого нужен ключик -advertise. Ключ -bootstrap говорит, что это сам себе сервер, он начнёт обслуживать запросы, не дожидаясь, пока в сети появятся другие Консулы.
У Консула нужно прокинуть много портов. Какие-то порты используются, чтобы Консулам собраться в свой кластер. А Smarm Manager ходит в Консул по порту 8500 — это REST API для доступа к распределённому key-value хранилищу.
А на других узлах Consul должен войти в существующий кластер. Для этого нужно выдать образу другой набор параметров.
command: "-server -advertise {{ inventory_hostname }} -join {{ manager_host }}"
Вам нужен адрес хоста, где был запущен первый Консул, чтобы передать его здесь в параметр -join.
Consul cluster
Консулы есть, менеджер есть, нужно скомандовать Докерам объединяться. Для этого нужно снова взять образ swarm, только выполнить в нём команду join.
- name: join swarm cluster
  become: yes
  docker_service:
    project_name: swarm
    definition:
      version: '2'
      services:
        node:
          image: swarm
          command: 'join --advertise={{ inventory_hostname }}:2275 consul://{{ inventory_hostname }}:8500'
          restart: unless-stopped
Узел, вступающий в Swarm, должен объявить миру (т.е. менеджеру), на каком хосте и каком порту живёт докер демон. А объявляет он через Консула.
Вступление в Swarm нужно сделать на всех хостах, которые должны войти в кластер и управляться менеджером. Формально менеджер (или кластер менеджеров) не обязан входить в это множество хостов, он может быть сбоку от самого Swarm кластера. Но менеджер работает только когда как-то меняется конфигурация кластера: создаются новые контейнеры. Так что вполне можно разместить его на одном из узлов кластера. Тогда на этом узле будут запущены и swarm manage, и swarm join.
Swarm Join
Почти всё. Теперь можно запускать docker или docker-compose, заставив их подключаться к Swarm Manager. Либо через параметр -H:
docker -H {{ manager_host }}:3375 run ...
Либо через переменную окружения DOCKER_HOST:
DOCKER_HOST=tcp://{{ manager_host }}:3375 docker-compose up
Но есть ограничения. Особенно если вы выполняете эти команды на совершенно левом хосте, который не входит в Swarm. Нельзя билдить контейнеры, т.е. build в docker-compose.yml — запрещён. Вам придётся сборку делать отдельно, а собранные образы выкладывать на Docker Hub или свой Docker Registry.
Внешние volume будут подключены не в файловой системе, где вы запускаете команды, а в файловой системе ноды кластера, где будет запущен контейнер. Значит, если вам нужно подключить какие-то конкретные файлы, вам, вероятно, придётся позаботиться о том, чтобы они оказались на всех нодах кластера, прежде, чем запускать контейнеры. Ansible тут тоже может оказаться весьма полезным.
Линки между контейнерами, когда вы проставляете link между сервисами в одном docker-compose.yml, как ни странно, работают. Однако об этом нужно позаботиться заранее.
Compose, Machine, Swarm
В Swarm добавился новый тип сетейoverlay. Для контейнеров на разных хостах всё прозрачно, они видят друг друга в одной сети. Но для этого Docker Engine должен договориться с другими Docker Engine насчёт проброса трафика. Делает он это опять через Consul, или Etcd, или Zookeeper. Докер демону нужно добавить ещё один параметр запуска, туда, в /etc/default/docker:
--cluster-store=consul://{{ inventory_hostname }}:8500 
Вообще-то рекомендуют для работы overlay сети использовать другой Консул, не тот, что уже используется Swarm Manager. Но и так работает (не для production, как говорится).
Получается Уроборос. Докер демону для работы сети нужен Консул, который запускается в контейнере после старта демона. Но, работает. Видимо потому, что контейнер Консула не использует overlay сеть, Консулы через кучу проброшенных портов друг с другом общаются.
Ну ещё демону нужно заявить о себе. Нужен ещё один параметр:
--cluster-advertise={{ inventory_hostname }}:2275
После добавления параметров и перезапуска демонов, overlay сеть будет работать.
Overlay network
Когда мы деплоим что-нибудь в Swarm, нельзя заранее угадать, на каком именно хосте будет запущен контейнер. По умолчанию он старается запустить равное количество контейнеров (одного типа?) на всех хостах. Но если у вас в docker-compose.yml есть какие-то выделенные сервисы, тот же балансер, который должен висеть на порту по вполне известному адресу конкретного хоста, вам нужно, чтобы контейнер разворачивался на конкретном хосте. Это — можно.
У каждого Docker Engine в Swarm есть метки. Как минимум — имя хоста. Но можно добавлять свои метки. Метки — это строки вида ключ-значение. Ключ считается уникальным, поэтому нельзя навесить несколько меток с одинаковым ключом.
Чтобы добавить метку, нужно передать ещё один параметр запуска многострадальному демону (опять /etc/default/docker). Например, пометим хост с балансером:
--label balancer=yes
Теперь в описание сервиса балансера можно добавить переменную окружения для Swarm:
haproxy:
  image: dockercloud/haproxy
  restart: unless-stopped
  environment:
    'constraint:balancer==yes':
    DOCKER_HOST: 'tcp://{{ manager_host }}:3375'
  links:
    - backend
Осторожно, синтаксис — дикий. constraint:balancer==yes — это имя переменной окружения. А значение у неё — пустое.
Swarm Filters
Ещё раз, через Swarm Manager можно делать почти всё то же, что через обычный Docker Engine. Тот же dockercloud/haproxy, как видите, вполне умеет выдирать из Swarm те контейнеры, которые нужно балансить, только адрес менеджера ему нужно передать через переменную окружения DOCKER_HOST. docker -H {{ manager_host }}:3375 info выдаст подробные сведения о здоровье Swarm кластера: сколько узлов есть, сколько контейнеров на каждом запущено и т.п. docker -H {{ manager_host }}:3375 ps покажет, какие именно контейнеры запущены, на каком хосте именно, и какие порты на каком хосте открыты. DOCKER_HOST=tcp://{{ manager_host }}:3375 docker-compose scale ... создаст нужное количество контейнеров именно во всём кластере, равномерно размазав их по доступным узлам.
Swarm in Production
Порты 2275 и 3375, упомянутые выше, — без шифрования. Но можно настроить TLS шифрование и авторизацию между всеми узлами кластера.
Swarm overview
Ну и напоследок, в Docker Engine v.1.12, который ныне rc1, Swarm будет встроен прямо в Engine. Вместо запуска swarm образов с параметрами, нужно будет запускать команды docker swarm. Я не смотрел, как это работает. Надеюсь, служебных контейнеров понадобится поменьше :)

2016-10-17

О Берлине

Случилось провести три с половиной дня в Берлине, который столица Германии.
Berlin
Туда и обратно летели самолётами Аэрофлота. Туда — через Пулково. Обратно — через Шереметьево. В Питере пить как-то не получилось. В самолётах, вместо привычного горячего-салатика-булочки, выдали обыкновенный бутер с ветчиной.
В Шёнефельд прибыли поздним утром. До здания аэропорта от самолёта везли автобусом. Впервые на моей памяти международный рейс встречают автобусом. Засунули весь самолёт в какой-то отстойник, где уже томились какие-то индусы с другого рейса. Местные бюргеры сразу же, абсолютно самостоятельно, построили зигзагообразную очередь, чтобы эффективно и честно заполнить весь зал. Очередь на паспортный контроль оказалась.
Первый урок немецкого языка. «-gang» — двигаться пешком. «Ausgang» — выход. (Позднее выяснилось, что «Eingang» — вход). «Bürger citizen» — местный бюргер, в отличие от «All passports». «Flughafen» — аэропорт.
Двое таможенников расправились с полным залом чуть больше, чем за час. Вопросов не задавали. Ну и что тут спрашивать, если вот обратный билет, вот бронь на гостиницу, а виза вообще лишь на четыре дня.
Приключение первое: добраться из Шёнефельда (который вообще-то в соседнем Бранденбурге) до Берлина. Все мы такие умные, заранее (при наличии интернетов) посмотрели в гуглокартах возможные маршруты. Оказалось, что видов общественного транспорта в Берлине сильно больше, чем ожидалось. Кроме ожидаемого метро, которое называется U-Bahn, обозначается буквой U, и до аэропорта не ходит, есть ещё S-Bahn, обозначаемые буквой S, и ещё пара загадочных поездов с номерами RE7 и RB14. Только сейчас выяснил, что RE7 — это Regional-Express: поезда, гоняющие через пол-Германии. А RB14 — это Regionalbahn, местные пригородные поезда. Кстати «Bahn» — это просто «поезд». RE7 и RB14, хоть и являются поездами довольно дальнего следования, просто проезжающими через Шёнефельд, таки выполняют роль аэроэкспрессов.
Дополнительная сложность заключается в разнообразии билетов. Общественный транспорт Берлина и Бранденбурга объединён в одну сеть. Это называется VBB — Verkehrsverbundes Berlin-Brandenburg. По проездному билету VBB можно кататься в пределах Берлина и окрестностей на всех видах транспорта. Это, кроме уже упомянутых аэроэкспрессов, S- и U- поездов, ещё трамваи и автобусы (автобусы, кстати, двухэтажные). Эти проездные ещё и делятся на то, как далеко от центра Берлина вам дозволено кататься: AB, BC или ABC. Ну и по сроку действия тоже отличаются. Всё это многообразие нигде толком не описано, даже автоматы по продаже билетов ничего не объясняют. Знание (незнание) немецкого и других иностранных языков тут ни при чём, просто местная специфика с исключительно немецкой терминологией. Запоминайте, чтобы доехать от аэропорта до Берлина (и наоборот), удобнее всего проездной VBB на два часа для зоны ABC, называется он Einzelfahrschein и стоит 3,30 €.
В общем, купили мы эти билетики за три евро. Прокомпостировали. Для этого надо сунуть билет в одинокий столбик с лампочкой, встречающий тебя при выходе на перрон. Дождались ближайшего RE7, который ехал в нужную сторону. Сели, поехали. А поехал он куда-то не туда. Не на северо-запад, а куда-то на север. И совсем не на ту станцию, что сообщалась Гуглом и была написана в расписании. Французы с чемоданами, которые ехали рядом, тоже запаниковали. И вышли из поезда. А мы что-то протупили, и выйти не успели. Поезд поехал обратно. Минут через пятьдесят вернулись обратно в аэропорт.
Взялись ещё раз изучать расписание. И обнаружили сбоку листочки исключительно на немецком, сообщающие о временном изменении расписания RE7. Как раз вот в эти вот недели. Конечно же Гуглокарты ничего об этом не знали. Поискали следующий RB14. Поняли, что двухчасовой билет к тому времени протухнет. Купили ещё один билет. Дождались. Поехали. Встретили (единственный раз) контролёра — здоровенного немца без особых признаков униформы, но со штрафовыписывательной машинкой, в футболке и татухах. Он ткнул мизинчиком в наши билеты, кивнул и пошёл дальше. Доехали.
Проголодались и сунулись в ближайшую знакомую еду — Макдональдс прямо на вокзале. Макдональдс как Макдональдс. Только на кассе — индуски или бедные белые студенты. Странно разговаривающие по-английски. Но назвать название нужного бургера оказалось не проблемой.
Наелись. Вышли из вокзала. Столкнулись на выходе с парой пьяных мужичков, общающихся друг с другом на чистейшем русском матерном.
Русской речи то там, то тут слышно вообще много. Немецкой, понятное дело. Французской. Испанской. А остальные я не распознаю.
Добежали с чемоданом до гостиницы. Оплатили, заселились. Пошли искать, где пожрать нормально. Толпа была довольно большая, в результате ничего так и не нашли. Сначала были шокированы ценами. Пивка попить — 2,5 €. Поесть чего-нибудь приличного — минимум 6 € за непонятную бурду в индийских ресторанчиках (коих полно), 8-10 € за нормальное блюдо в нормальных местах. В конце концов разделились. Кто-то удовлетворился бутерами, точнее тем, что в Нью-Йорке называлось сэндвичем, а в Берлине называется панини — булка, разрезанная вдоль, куда в середину понапихали всякой еды, только овощи для вегетарианцев или что-нибудь колбасное для остальных. Кстати, вегетарианские и веганские блюда во всех меню явно помечены.
Ну а мы к вечеру забурились в какой-то итальянский ресторанчик. Где конечно же доза пасты оказалась килограммовой. Ну и отлично, на двоих. Заодно официант научил нас платить чаевые. Чек дают строго по ценам в меню. Можно оплатить карточкой. Но с карточки могут снять строго по чеку, и чаевые нужно добавить наличкой. А могут снять чуть больше, включая чаевые. Чаевые стандартного размера: 5-10%.
Кстати, очень очень много где cash only. Большинство автоматов принимают только налик, даже только монеты, и сдачи не дают. Любое мелкое кафе где-нибудь в музее тоже принимает только наличные. Банкоматы встречаются только на вокзалах и крупных торговых центрах, в единичных экземплярах, все одинаково жёлтенькие, непонятно какого банка, обычный банкомат.
Прошлись до Рейхстага. Посмотрели, как все валяются на полянище перед ним. Дошли до Бранденбургских ворот. Там громадные толпы туристов. Все фотаются. Странные туристические виды транспорта: лошадки, велорикши. Хвалёной европейской чистоты не наблюдали. Везде окурки и жвачки. Но куч мусора нет. Грязи как таковой тоже нет, впрочем, дождей не было.
Berlin
День второй. Соотечественники пошли дело делать в Центр имени Сони. Я покрутился вокруг. Решил, что IMAX — это хорошо, но фильмы на немецком — не очень интересно. Впрочем, они были и на английском, но абсолютно те же, что на Родине. На площади между зданиями Сони Центра, как раз под крышей-куполом, была проложена красная ковровая дорожка, до входа в кинотеатр. Тут намечалась премьера какого-то местного фильма. На следующей день по этой красной дорожке произошло шествие звёзд кино, говорят, там видели Тиля Швайгера. А ещё день спустя от дорожки и следа не осталось. В общем, фиг с ним, с кино. Пойду в парк, а потом в зоопарк.
Пошёл в Большой Тиргартен. Он действительно большой. И довольно дикий. По сути, лес, через который идут две автодороги и куча асфальтированных тропинок. По этим тропинкам, рано утречком, навстречу мне, ехали местные бюргеры на работу на велосипедах. Велосипедов много, велодорожек много, но гораздо меньше, чем в Амстердаме.
Всё бы ничего, но парк весь перегорожен. Такими типа временными прозрачными заборчиками из металлической сетки в человеческий рост. Вот прям вдоль и поперёк весь перегорожен. Вдоль каждой тропинки забор стоит. И въезд/вход на тропинку тоже может быть перегорожен створками на колёсиках, может быть на ночь. Было не очень комфортно идти против интенсивного велосипедного движения и не иметь возможности сойти на траву. Зачем вообще столько заборов?
Забор
В середине парка, где пересекаются две весьма оживленные автомагистрали, проходящие через весь парк, в центре транспортного кольца, обнаружилась Колонна Победы. А на её верхушке, вся такая золотая, богиня Виктория, более известная у нас как Ника. На плакатиках вдоль дороги имелись фотографии и описание. Оказывается, Алоисыч в 1938 году эту колонну переместил и сделал повыше. Так что, в некотором смысле, она должна была символизировать другие, будущие победы национал-социалистической Германии. Но ничего, стоит до сих пор, блестит золотом.
Колонна Победы
Вообще обнаружилось, что немцы очень интересно, с русской точки зрения, относятся к своей истории. Есть два момента, которые встречаются везде, в любой исторической ретроспективе в любом музее. Первое: национал-социалистический режим или период. Так и пишут. Слов «Гитлер» или «война» не употребляют. Второе: берлинская стена и её разрушение в 1989. Где проходила стена, показано на всех картах. Где возможно, стоят кусочки этой стены или просто линия на земле нарисована. Вдоль стены плодятся всякие музеи и тематические выставки, вроде КПП «Чарли», а уличные торговцы продают шапки-ушанки, красные звёзды и советские погоны.
В дальнем углу Тиргартена обнаружились бомжики. На вид как наши, небритые всклокоченные испитые рожи. Но с чемоданчиком на колёсиках, и спят в чистеньких спальных мешках. Один раз даже палатку видел. Там, вдоль зоопарка, проходит железная дорога, на невысокой бетонной эстакаде метра в два-три. Вот вдоль этой эстакады и поселились бомжи. Тут же и кучи мусора, как на Родине. Местные на них внимания не обращают, просто едут мимо на велосипедах.
Добро пожаловать в зоопарк
Ладно. Берлинский зоопарк. Самый крутой зоопарк, что я видел. Круче Амстердамского и Ленинградского. Входной билет в зоопарк и аквариум обошёлся аж в 20 €. Но оно того стоило.
Полчаса пялился на слонов. Никогда раньше не видел слонов в десяти метрах. Они очень даже милые. Тут стараются не ставить решётки между зверями и посетителями. Часто просто ров, иногда с водой, иногда с проводами, под напряжением, видимо. В худшем случае таки решётка, но со стеклянным закутком, чтобы смотреть беспрепятственно. Вот и до слона было лишь метров десять, не больше, лишь ров. Потом, когда отошёл к фламинго, со стороны слонов послышался грохот. Это слоник решил о дерево, что стоит посреди его загона, спинку почесать. С размаху боком. Чтобы деревья выдерживали такое издевательство, они там дополнительно огорожены, и не только у слонов.
Слон
У гориллы в загоне была какая-то штука, в которой она, сидя рядышком, увлечённо ковырялась. Будто планшет для ребёнка. И ещё какие-то тряпки эти умные обезьяны таскали. И смотрели на тебя: мол, чего пришёл, вали отсюда. Орангутанг мрачно наблюдал и старательно изображал из себя просто висячую оранжевую косматую тряпку. Когда я таки нашёл, где у этой тряпки глаза, он смутился и переполз в другой угол клетки.
У птичек в клетке было гнездо. А под крышей клетки висела видеокамера. И то, что эта видеокамера снимала в гнезде, тут же вживую демонстрировалось на телеке, смонтированном тут же рядом под навесиком. Наверное, кому надо, очень полезно.
Прички с камерой
В некоторых местах было видно, какие морковки строгают животным.
Готовка еды
Видел «урну» для сбора старых телефонов. Зачем?
Старые телефоны
Аквариум — в отдельном здании, куда можно зайти как из зоопарка, так и просто с улицы. Хороший аквариум. С рыбками, акулками, муренами. А ещё там были медузы. Маленькие, но их было очень много. Крокодильчики, черепашки. Конкурс: найди змею в террариуме, они всегда здорово прячутся.
Медузы
Зебры. Они действительно полосатые.
Пингвины. У них есть отдельный домик, где живут, кажется, императорские пингвины. Там у них даже снег лежит, в закрытом помещении с поддержанием климата. И можно посмотреть, как они плавают под водой. А на улице, просто в пруду, плавали менее именитые пингвины. Можно было просто протянуть руку и потрогать.
Пингвин
Вообще тут почти у каждого именитого животного есть свой хаус. Сейчас-то они гуляли на улице. Но зимой они живут в домиках. Есть домик у слоников, у жирафов, у кисок, у бегемотиков, у носорогов, у птичек, у бизонов, у ещё кого-то, у свинок (да, швайнхаус, дикие свинки типа кабанов имеются в виду).
Есть довольно большой загон, который у нас называется контактным зоопарком. Где можно погладить, пообнимать и покормить тех же козочек.
Верблюды, оказывается, тоже пьют воду.
Верблюд пьёт
Тюлени и морские котики были потрясающи. Несколько раз в день тут проходят шоу с их кормлением. Есть показательные кормления и других животных, расписание возле клеток висит. Но я их все благополучно пропустил. Но эти, морские, так офигенно плавают. Можно было подняться по лестнице и посмотреть на них сверху. А другие дрыхли на камушке на солнышке.
Тюлень
Бегемоты тоже дрыхли. Повернув свои блестящие задницы к посетителям. На них можно было посмотреть и из под воды. Но мне не повезло, двое дрыхли на суше, а третий где-то прятался в мутной воде. Только какая-то утка металась вдоль стекла, демонстрируя своё умение эффектно плавать.
Бегемоты
Детская площадка в зоопарке офигенная. Издалека напоминает вольеры для каких-то хищников. Можно оставить ребёнка на полдня, он не соскучится. А ещё есть маленькие детские экскаваторы, за 1 € можно поковыряться маленьким, но настоящим ковшом в песочнице, дёргая рычаги.
Детский экскаватор
Здоровенные пятнистые кисы очень милые. Ещё милее летучие мышки, которые живут в подвале домика кис. В кромешной тьме за стеклом носятся громадные тени.
Прошёлся по улицам Берлина обратно, к Сони Центру. Много Смартов. Ни одной Теслы. Розетку для зарядки авто видел лишь один раз, а в Амстердаме они на каждом шагу. В хорошем городе должно быть много каналов (с водой), Берлину их явно не хватает. Много каштанов и платанов.
В Сони Центре есть Леголэнд. Очень хотел туда попасть, но меня не пустили. Потому что дети до 16 лет — только в сопровождении взрослых, а взрослые — только в сопровождении детей. Уже думал, а не поймать ли какого-нибудь негритёнка на улице, думаю, за 10 € он бы согласился сходить в Леголэнд с незнакомым дядей. Но потом подумал, что Леголэнд в подвале пусть даже и Сони Центра — это фигня какая-то. И пошёл дальше.
Жираф перед Леголэндом
Тут же рядышком обнаружился музей кино. Нормальный местечковый музей. Старые кинопроекторы. Старые афиши. Внезапно, афиша Patzerkreuzer «Potemkin». Довольно большая и эффектная экспозиция, посвященная фильму Metropolis. Старые телевизоры. Вкладыши в сигаретные пачки (не в жвачки) с портретами актёров.
Долго ржал над афишами фильмов ГДР и ФРГ. Оказывается, многие ГДРовские фильмы я знаю. Например, тот же Гойко Митич и его чингачгуки. А в те же самые годы на афишах фильмов ФРГ вместо индейцев красуются полуобнажённые красотки.
Гойко Митич
Там была выставка достижений научной фантастики. Ничего особенного, просто костюмы и наброски инопланетян из разных фильмов, много проекторов, которые показывают отрывки. Забавно было видеть параллельно идущие эпизоды из «Войны миров» 1953 и 2005 годов. Ну и конечно же я сфотографировался с далеком, и меня не экстерминировали.
Селфи с далеком
День третий. Собрался в технический музей. Проходил мимо концертного зала. Всё русские имена: Замфира (в европах она продолжает выступать), некто Киркоров, какой-то Николай Басков.
На фасаде музея висит старый добрый Дуглас DC-3. Красота. А рядышком торчит из земли лопасть ветрогенератора. Ох и здоровенная.
Начало лопасти ветрогенератора
Пришёл слишком рано, поэтому пошёл гулять по парку. Оказалось, что часть парка является территорией музея. Пока музей закрыт, можно полюбоваться мельницами через забор. В парке было очень много старых рельс в кустах и полуразрушенных домиков. Как выяснилось позднее, музей стоит на месте бывшего крупного железнодорожного узла, и даже полукруглые помещения, в которых выставлена железнодорожная техника, являются бывшими депо. С этими милыми поворотными штуками, чтобы направлять паровозики на разные пути. А ещё в парке были качели. Большущие качели на цепочке. И взрослые не стесняются на них качаться. Я тоже непостеснялся.
Качели в парке
Музей открылся. К открытию подтягиваются толпы школьников. Рано утром, в будни. Школьники — сплошь какие-то пакистаногерманцы, девицы в хиджабах, попадаются афрогерманцы. На весь класс — лишь пара арийских лиц.
Музей большой. Музей классный. В старом здании паровые машины, станки и целые мастерские, приводимые в движение одной большой паровой машиной. Ременные передачи под потолком и всё такое. Ткацкие станки, машинки для вышивания, с управлением перфокартами. Старые телевизоры, патефоны, радиоприёмники. Целое крыло выделено вычислительным машинам, все производства Конрада Цузе. Наверху есть мастерские по изготовлению бумаги и по высокой печати. Местные школьники имеют превосходную возможность этим всем позаниматься, на настоящих старинных станках.
Машина Цюзе
В новом здании музея я застрял надолго. Корабли. Парусники и яхты. Здоровенный настоящий полноразмерный пароход, действительно с паровым двигателем. Хотя для парохода, наверное, вовсе небольшой. Можно по нему походить, позаглядывать в каюты, на камбуз, в гальюн.
Пароход
Выше — самолёты. Много самолётов. Самолёты целиком, включая тот самый Мессершмитт и Юнкерс Ю 52. При виде этого Юнкерса я почему-то вспоминаю «Касабланку». Интересный карманный автожир-планер. Куски и обломки самолётов, в дырках от снарядов. Дуглас не просто висит на фасаде здания, под ним есть довольно обширная обзорная площадка, где при желании можно пикники устраивать. Красота, в общем.
Мессершмитт
Юнкерс
Автожир
Дальше были транспортные средства. Маленькие первые неуклюжие паровозики. Паровозики побольше. Громадные паровозики. Первые электровозы. Последние маленькие паровозики. Любителям паровозиков будет очень хорошо.
Последний маленький паровозик
Где-то между делом затесались выставки про лекарства, фото и видеотехнику. Как только не извращались наши предки, чтобы получить удовольствие от движущейся картинки. Ну а я получил наслаждение от созерцания стереофотографий с лётного поля, показательных полётов хрупких самолётиков 1911 года.
Потом можно было выйти в парк. Там было водяное колесо, чтобы подымать воду в водонапорную башню, чтобы заправлять те самые паровозы водой. И две мельницы. Одна старая деревянная. Она, оказывается, вся целиком поворачивается по ветру, вместе со входом и лесенкой к нему. Понятно, откуда пошло «повернись к лесу задом, ко мне передом». Такая мельница как раз может такое проделать довольно легко. И стоит на основании довольно странной конфигурации, которое можно счесть за курью ножку. А другая мельница уже из кирпичей, нидерладская. У неё за ветром поворачивается только верхняя часть, примерно как башня у танка.
Зад мельницы
У музея оказалось ещё второе здание, чуть в стороне. За те же 8 € туда можно и нужно сходить. Была тематическая выставка по автомобилям. Мотоциклы и мерседесы прямо из фильмов про Индиану Джонса или Штирлица. Некоторые экспериментальные или уникальные модели вроде Януса. Советская Волга, которая оказалась вовсе не Волгой, а Опелем. Распиленный вдоль BMW, чтобы можно было рассмотреть все внутренности.
Распиленный BWM
И была тематическая выставка про Сеть, которая Интернет, и про комьпьютеры вообще. Та самая Энигма. Google Glass за стеклом. Настоящий NoPhone. Детские ноутбук и смартфон для рисования мелом. Cray-2. Сломанные (физически) жесткие диски из датацентров Google.
Меловой компьютер
Ну а напоследок в этом же музее есть развлекуха для детей. Как в Nemo в Амстердаме, или Джоуль-парк в Омске. Только несколько разнообразнее и структурированнее. Называется Science Center Spectrum. «Чудеса» оптики, акустики, электричества и прочего. Видеокамера и софт, который на лету распознаёт лица, пол, возраст и эмоции. Тепловизор. И прочие веселья.
Селфи с возрастом
Технический музей такой большой и такой замечательный, что я там провёл почти весь день. Сил хватило только добраться обратно до гостиницы.
Кстати, в гостинице все номера на этаже, если верить плану эвакуации, оказались одинаковыми. С одинаковыми душе-унитазо-раковинными модулями в уголке прямоугольного номера. Эффективненько.
Вечером сходили на свето-музыкальное получасовое шоу на канале за Рейхстагом. Посвящено было истории Германии вообще и истории Берлина в частности. Больше всего вспоминали берлинскую стену и её разрушение. Много раз упомянули фамилию Gorbatschow. Все те особенности восприятия истории, что я уже упоминал, были видны. Само шоу — это изображения нескольких проекторов на пару зданий на противоположном берегу канала. Затейливо, но я не очень впечатлился.
Маленький парк где-то по дороге
День последний. Решил пройтись по главной и, по сведениям местных, самой красивой улице Унтер-ден-Линден. От телебашни до Бранденбургских ворот.
Пошёл до телебашни максимально окольными путями, по всяким дворам и не очень крупным улочкам. Некоторые берлинские дворы оказались поразительно похожи на омские. Коробка, со всех сторон окружённая многоэтажками. Огороженная забором из сетки спортивная площадка. Пара качелек. Сдвинутые лавочки с пустой бутылкой от вчерашнего пива. Только многоэтажки все разнообразные, двор весьма обширен и куч мусора нет.
Лавочки
Везде, где идёт стройка, стоят и домики строителей. Только это не облезлые вагончики-прицепы на спущенных колёсах, а контейнеры стандартных размеров. И эти контейнеры соединяются в весьма многоэтажные конструкции. Иногда получается целый дом из контейнеров, размерами в половину того дома, что ремонтируется.
Домики-контейнеры
Телебашня большая. Теперь я знаю, чем вдохновлялись создатели Байтерека в Астане. За чудовищные 13 € можно подняться на обзорную площадку башни. Мне повезло, в этот день рано с утра не было очереди. А так, там есть система СМС уведомлений, своей очереди подняться можно ждать несколько часов. Турникеты стоят на вход и на выход. Видимо, есть ограничение на количество одновременно находящихся человеков наверху. Единственное место, где досмотрели рюкзак, прокатили его через рентген и заставили пройти рамку.
Сверху Берлин оказался довольно маленьким городом. Омск, пожалуй, попротяжённее будет. Он весь виден с башни. А дальше начинаются поля и ветряки. Ну и смотреть особо не на что. Он весь какой-то плоский. Только Тиргартен и выделяется.
Вид из башни
Пошёл по Унтер-ден-Линден и зашёл в берлинский кафедральный собор. В оригинале лаконичнее: Berliner Dom. Сейчас это музей, а не действующая церковь. Внутри, как и в Успенском соборе в Московском Кремле, — гробики местных королей. Можно подняться на крышу собора, и обойти её вокруг. Оттуда открывается весьма нехилый вид, ненамного хуже, чем с телебашни, и не через стекло. Немцы оставили копоть, а следы от осколков на статуях заделаны так, что видно, что тут были следы от осколков.
Вид на башню
Сам Унтер-ден-Линден не впечатлил. Шибко много магазинов, а шопинг мне не интересен. К тому же пешеходная аллейка посреди улицы сплошь перегорожена из-за строительства метро. Опять привет Омску. Заборчик строительства изображает поезд метро. Впереди сидит угрюмая бюргерша-машинист. В вагонах едут деды-хиппи, белые девушки с гитарой, девушки в хиджабах, парни в татухах и фуражках целуются. Толерантность со всех сторон.
Будущее метро
Ещё часок по краешку Тиргартена. Его что-то весь перегородили нафиг, для автомобилей и переходов. Ставили какие-то ларьки. Возможно, готовились к какому-нибудь Октоберфесту. Чемодан, вокзал, снова борьба с автоматом по продаже билетов, поезд до Шёнефельда, аэропорт.
Шёнефельд оказался малюсеньким аэропортом. Тесный коридорчик после досмотра на все гейты и все рейсы. Паспортный контроль внезапно возле самого гейта. Открылся за час до посадки. Два полицая в бронежилетах поржали над визой на четыре дня. Пропустили в маленький стеклянный загончик уже непосредственно перед гейтом. Откуда даже в туалет отойти некуда.
Самолёт. Аэрофлот. Сон в Шереметьево. Ненавижу летать на восток. Когда организм хочет только одного: спать, ему предлагают еду, которую он принимать отказывается всеми возможными способами. Я уже и не пытаюсь. Утро. Омск. Холодно, блин. Домой. Спать до вечера.
Панорама
Посетить Берлин — сделано. В Амстердам ещё хочется вернуться. В Берлин — нет. Он слишком скучный. И в Леголэнд не пустили :)