OpenVPN docker image with full IPv6 support

As I mentioned earlier, I’ve developed my own tool for managing OpenVPN servers. I’ve been running several instances without any issues, and last weekend, I finally decided to add full IPv6 support. This includes both connecting to the server via IPv6 and routing IPv6 traffic within the tunnel.

Initially, I spent several hours troubleshooting how to get an IPv6 setup working in Docker. Many documents claim that Docker is entirely incompatible with IPv6, while others suggest you can enable IPv6 but must manually manage networks, NAT, and other configurations. However, this isn’t entirely true.

Basic IPv6 support has been available in Docker for years (see ipv6 option), but you used to need to handle subnets and routing manually. Now, Docker can manage all the necessary iptables configurations, including SNAT/masquerading for IPv6, if you enable the experimental and ip6tables options.

A detailed guide on the docker setup can be found here.

As for OpenVPN, I’ve added IPv6 support to the gerasiov/openvpn image (with the recommended setup described in the README), so anyone can easily set up their own IPv6-capable OpenVPN server in just five minutes.

Docker OpenVPN image

For several years I was using kylemanna/openvpn as OpenVPN server. Unfortunately author does not update it anymore. It has old OpenVPN version, several problems (like renew command not working) and bad cli in common.

So one day I sit and rewrite it (on python, so image grew from 20MB to 55MB, I believe that not a problem).

GitHub page: https://github.com/gerasiov/docker-openvpn

Docker image: gerasiov/openvpn:latest (hub)

I have several more features to add:

  • Server certificate renewal
  • Configurable certificates expiration time
  • IPv6 support

But it’s already useful enough.

WiFi fast roaming with OpenWRT

Having trouble with your home WiFi network when moving between access points? I did. After spending several days debugging, I found that my network was working fine with ‘psk2’ (WPA2) mode, but failing with ‘sae-mixed’ (WPA2/WPA3).

Here’s the recipe that works for me:

  1. Install the dawn and wpad-openssl packages on your OpenWRT router.

  2. Modify the dawn configuration to specify broadcast_ip, shared_key and kicking options.

  3. Add the following options to the relevant WiFi interfaces on all access points:

config wifi-iface 'wifinet1'
	option ssid 'OpenWRT'
	option device 'radio0'
	option key 'mysecretpassword'
	option network 'lan'
	option mode 'ap'
	option encryption 'psk2'
	option ieee80211w '1'
	option ieee80211k '1'
	option ieee80211r '1'
	option bss_transition '1'
	option wnm_sleep_mode '1'
	option ft_over_ds '1'
	option ft_psk_generate_local '1'
	option time_advertisement '2'
	option time_zone 'GMT0'

P.S. When you want to debug roaming with your Android phone the one of the most powerful solutions is WiFiman app.

Автоматически заполнить 3-НДФЛ

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

В этом году у меня таких записей накопилось больше двух сотен, так что я понял, что вбивать их руками не вариант и решил автоматизировать это. Для начала потребовалось вытащить машиночитаемый отчет из Tinkoff Broker API. (Довольно бестолково написанном в этом месте.) И затем накидать робота, который будет открывать nalog.ru и вбивать нужные мне данные в форму.

Получившийся результат выложил на https://github.com/gerasiov/3ndfl Используйте, исправляйте, радуйтесь сэкономленному времени.

Борьба со спамом в 2020 (rpamd, SpamAssassin и нейросети)

Уже 15 лет (ужас какой!) использую для фильтрации спама SpamAssassin, и что-то стали возникать к нему притензии. С одной стороны, кажется, спама в интернете стало сильно меньше, чем в конце нулевых. По моим ощущениям, мне стало в месяц приходить ~300 писем вместо нескольких тысяч. (Возможно дело в том, что крупные почтовые сервисы его довольно успешно фильтруют, благодаря своим ресурсам, и “обычные пользователи” стали сильно менее доступны для спамеров.) С другой же стороны, стал замечать, что SA успешно отфильтровывает примерно половину спама (с достаточно консервативными настройками без false-positive). С третьей стороны не байесом же единым, за последние десять лет и нейросети выросли и какой-нибудь SVM кажется кто-то должен уже был внедрить (по крайней мере Саша Петров мне еще в своей дипломной работе его прикручивал и вроде как неплохие результаты получал, хотя до продакшн решения не доделал).

В общем решил я посмотреть на то, что у нас нового появилось в этой области: количество инструментов увеличилось, но всё это просто классификаторы (практически все на наивном байесе, хотя некоторые, вроде как заявляется, и более точные, чем тот, что внутри SpamAssassin), в отличие от SA, который еще с кучей эвристик, нацеленных именно на анализ почты (корректность заголовков, работа с RBL, скоринг для хостов, сетей и автономных систем, участвовавших в передаче письма, DMARC, DKIM, SPF и прочее).

Но на фоне всего этого болота заметил довольно развитый и живой проект rspamd. По сути примерно такой же комбайн, как SpamAssassin, только вместо перла C и lua, ну и комьюнити сильно меньше. Зато встроенный milter, вроде как более “правильный” байес, встроенная реализация dkim (можно выкинуть opendkim), встроенный грейлистинг (он вообще сейчас от спама помогает?) и даже есть экспериментальный нейросетевой классификатор.

В общем показалось, что штука довольно интересная, чтобы ее попробовать – поставил и показалось, что работает оно гораздо лучше, чем SpamAssassin.

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

Ну раз так, то устроем side-by-side сравнение на живом трафике!

Дано:

  • Свежая чистая инсталляция почтового сервера: postfix + dovecot.
  • На postfix полностью отключены все аутлупы по rbl и фильтрации HELO, которые я использовал раньше.
  • rspamd 1.9.4 с чистой базой и дефолтными настройками. (add_header = 7)
  • SpamAssassin (через spamass-milter) с +/- дефолтными настройками (включил по максимуму разные модули, в том числе pyzor, razor и txrep) и тоже чистой базой. (required_score 7.0)
  • Немножко скриптов, которые отправляют на дообучение (в оба сервиса) те письма, которые были классифицированы неправильно (в тот момент, когда я перекладываю письмо в папку Junk или обратно).
  • Почтовый поток порядка нескольких тысяч писем в месяц, из которых две-три сотни – это спам.
  • Система “Спамографопостроитель 1.0”, которая рисует в реальном времени гистограммы оценок по всем полученным письмам.

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

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

А пока: давайте наблюдать!

PS. Дорогие спамеры, не могли бы насыпать мне побольше образцов спама на spam@gerasiov.net. Пожалуйста!

Выписка из интернет-банка Авангард, Тинькофф, Сбербанк и др. в формате OFX

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

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

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

Список банков/плагинов есть на странице самого ofxstatement в README. Можно установить необходимый плагин руками. В частности репозиторий ofxstatement-russian содержит плагины для Авангарда, ТинькоффБанк, АльфаБанк, Сбербанк. Ну или можно поставить в Debian/Ubuntu пакеты ofxstatement и ofxstatement-plugins (если используете стабильный дистрибутив, то плагины лучше ставить из backports, там они более актуальные).

За выборы

Итак, как и обещал, о выборах. Точнее о “выборах” и почему бойкот, к которому призывает Навальный мне кажется более правильным действием, чем участие в этом … процессе.
Для начала некоторая аксиоматика, от которой я отталкиваюсь в своих своих рассуждениях:
1. На выборах в первом туре победит Путин.
Обсуждать это можно сколько угодно, но ни один из допущенных “кандидатов” кроме него не имеет шансов. Ок, Грудинин вместо Зю – отличный ход. Если бы это произошло год назад и этот год он провел в реальной агитации. А так 10, максимум 15 процентов. Собчак? Ну да, 6 процентов в прошлый раз голосовали за Прохорова + немножко электората Жириновского. Слабо верится, что она преодолеет 5 процентов. Ну может процента 3 возьмет. Явлинский, про которого пишут яблочники (как с дореволюционным стажем, так и новоприобщившиеся дети Каца) – это вообще жуткий нафталин. Во-первых, человек в возрасте с проблемами со здоровьем. Во-вторых, та же самая фигня: никакой работы. Даже про Митрохина что-то слышно, но не про Явлинского. Могли бы Вишневского выдвинуть или там Шлосберга, у них, как мне кажется, на настоящий момент политического капитала чуть ли не больше, а потенциал так точно есть, в отличие от. (Что вы говорите? Шлосберга уже исключили? А нет? Значит показалось, у них там постоянно какая-то внутрипартийная грызня.)
А теперь сверху набрасываем типичные фальсификации в день голосования…
2. Единственный у кого был шанс (уж не знаю как насчет победы, но на второй тур думаю да) это всё-таки Навальный.
Да он неоднозначная личность. Да он националист/вождист/популист/убил_лося/украл_весь_лес, но у него есть отличная узнаваемость, у него есть достаточная харизма и неплохо подвешенный язык. А самое главное – он единственный, кто работал последний год и строил реальную штабную и “партийную” работу, единственный кто постоянно пользовался инфоповодами для того, чтобы заявить о себе и пнуть власть, а когда инфоповодов не было, создавал их сам и весьма удачно.
Опять же учитывая вбросы и админресурс – это бабушка надвое сказала. Но, мне кажется, это реально (опять вспоминаем, что даже Прохоров умудрился набрать 6% в прошлом году).
3. Остальные допущенные кандидаты – статисты.
Скоре это даже следствие из предыдущих двух пунктов, но тем не менее.
Разве что Ксюша мне лично кажется довольно искренней во многих своих поступках, хоть и не удачных порой. Но она в любом случае вольно или невольно играет роль Прохорова.
4. Власти нужна явка.
Плюну в лицо тому, кто посмеет утверждать, что это не так. Я не буду даже про обилие наружки на тему выборов (а что там в телевизоре я просто не знаю), просто перечислю, кто меня за последнее время пригласил на выборы (по большей части адресно по имени-отчеству):

  • Собянин – 5 раз (2 раза в СМС и 3 раза письмом).
  • УИК – 4 раза через почтовый ящик (как, наверное, они это всё сами ненавидят, заполнять от руки эти идиотские пригласительные).
  • Какие-то Воробьевские псевдо-газеты – раза 3.
  • Сбербанк online – каждый раз при входе.
  • Приложение “Стрелка” МосТранАвто – 4 раза с нотификейшенами в андроиде.
  • Приложение “Мой проездной” от ВТБ – 2 раза, тоже с нотификецшенами.
  • Григорий Явлинский (его штаб) – 2 раза по телефону и 1 раз письмом (его правда можно понять, тем более он не только не только голосовать приглашает, но и ищет волонтеров, наблюдателей и т.п.)
  • ЦИК РФ – несчетное число раз рекламой в Фейсбуке, Ютубе, Твиттере, Гугле, Яндексе и т.п. (сколько же бабок на это спустили?)
  • ГосУслуги – было письмо точно и еще на сайте постоянно баннеры лезут.
  • ЦИК снова – вспонил, были же еще СМС, больше 2 штук, скорее всего по номеру из ГосУслуг и e-mail.
  • МосИзбирКом – СМС 1 штука (видимо из-за регистрации на pgu.mos.ru)
  • МЧС – а нет, эти гады просто достали прогнозом погоды.

Ну короче вы в той же подводной лодке и должны видеть и осозновать весь этот ад. Про массовое принуждение к голосованию, которое творится по всей стране и прекрасно видно на Карте Нарушений я даже не буду писать.
5. Власти нужна любая явка (в смысле любых избирателей).
Этот тезис спорный. Именно его пытаются опровергать (в первую очередь сторонники Явлинского). Да, конечно, тут сложно что-то доказать, но с другой стороны, в половине сообщений на КН, которые я немножко мониторю, в письмах и сообщениях встречается “голосовать можете за кого угодно, главное прийти на участок”. Опять же идет не мобилизация “подконтрольных”, вроде клиентов соцобеспечения, а всех поголовно, в том числе студентов (которые весьма стремный с точки зрения политтехнологий контингент, мало ли чего выкинут). Но самое главное, что подтверждает это утверждени – это следующий тезис.
6. Сложнее всего фальсифицировать явку.
Я не один раз был в составе избирательных комиссий в разных статусах. Явка считается очень просто: сидишь себе тихонько и ставишь галочки в бумажке. Фальсификации, вбросы, неправильный подсчет – это всё непонятная суета, там не уследили, тут вбросили, тут бюллетени из одной пачки в другую положили, здесь наблюдателей выгнали с подсчета. А явка – это люди. Если наблюдатель сидит и считает и у него получилось 200 человек, то никак не может быть официальным результатом 600, хоть ты тресни. Ну на 20 человек можно было ошибить, ну на 50, но никак не в 2-3 раза.
Именно поэтому я могу с уверенность говорить, что на президентских выборах в 2011 году на участке где я наблюдал были вбросы. (Какие именно, кто как и когда я узнал/понял много позже. Еще позже я понял, какими действиями я мог бы попытаться что-то изменить, хотя, скорее всего получил бы банальное удаление с участка, как у меня было в статусе ПРГ два раза!) Я знаю, сколько людей реально пришло, я знаю, сколько было написано в протоколе и из этого получаю величину вброса. Так как я знаю, за кого у нас вбрасывают (в том числе потому что видел во время подсчетов пачки вброса, где все голоса были за Путина), то плюс-минус честно будет вычесть эти “голоса” именно у него. И внезапно оказывается, что он получил на моем участке не 56%, а чуть меньше 40. А старичок Зю не 21, а почти 30. И всё играет новыми интересными красками. И это еще не учитывая карусели из работников администрации, которые точно были (о чем мне лично признавались с хохотом эти работники). И при условии, что считали бюллетени честно (но у нас фальсификации были именно на вбросах и приписках, а не на подсчете как таковом, насколько я могу судить).
То есть еще раз:
Посчитать явку легко!
По разнице между реальной явкой и официальной очень легко оценить масштаб вбросов и понять реальную картину на отдельном участке!
Из таких картинок с отдельных участков можно более-менее оценить цифры по региону и понять реальный порядок голосов.
Если вы приходите на участок – разница между реальной и нарисованной явкой уменьшается, картина смазывается. Не приходите – растет. Потому что на многих УИКах официальные цифры по явке будут спущены сверху (опять же исходя из моего опыта) и на них будут тянуть любой ценой (вбросами, приписками, каруселями и т.д.).
Поэтому: приходя на участок и голосуя за кого угодно, вы работаете на явку и на Путина, а вовсе не на абстрактную “демократию”.
А тех, кто чувствует себя не в своей тарелке, оттого, что он не голосует лично, я еще раз призываю: идите в наблюдатели. Это достаточно интересный опыт, это личностный рост, самоуважение и… “папа, что ты делал, когда нашей страной 38 лет правил этот лысый, закомплексованный маразматик с ядерной кнопкой?”
Комментировать можно в FB.

Vugera VG-20S и 64ГБ MicroSD

Очень меня радует видеорегистратор Vugera VG-20S. В первую очередь качеством картинки и своей компактностью. К сожалению, по официальной спецификации, максимальный поддерживаемый объем карты памяти у него 32ГБ. Чего хватает часов на 8 что ли. В общем сильно меньше, чем дневная поездка куда-то далеко.

В интернете информации о реальной ситуации не нашлось, но я попробовал в него вставить карту на 64 ГБ (Lexar MicroSDXC 300x 64GB UHS-I LSDMI64GBBNL300) отформатированную в FAT32 и она вполне себе завелась, регистратор успешно работает. Решил вот сюда про это написать для гугла.

Back to the Windows

“простым смертным” надо просто клик хере и у них 99% функционала работает, а на остальное им пофигу. А нам чуть что так либо виртуалка либо на свободный раздел либо несовместимость форматов либо ещё какая хрень. А годов уже далеко не двадцать и жизни осталось не бесконечность. — Никита Ющенко про виндузовый рай

Началось всё с того, что у меня в ноутбуке стоит SSD Transcend TS256GMTS400. (При чем не от производителя ноутбука, а купленный на амазоне и установленный самостоятельно.) Вроде бы работает нормально, но изредка (иногда раз в неделю, иногда пять раз за день) вдруг подвисает на пять-десять секунд, после чего происходит пачка таймаутов операции чтения на ata, выполняется hard link reset и всё работает дальше как ни в чем не бывало. При чем обычное чтение всего устройства проходит без проблем.
Возможно в фоне ядро вызывало TRIM на устройстве, а эта операция на некоторых SSD приводит (или раньше приводила) к заметным проседаниям производительности (вплоть до вот таких подвисаний). Не знаю деталей, посмотрел я на версию прошивки, глянул в интернете, вроде на скриншотах много где указана версия старше, при чем значительно, так что надо обновлять. Более-менее привычная задача.
Тут-то всё и завертелось…
Вначале я залез на сайт производителя. (Ну если быть совсем честным, я туда залез чуть раньше, когда пытался понять какая версия прошивки сейчас актуальная, и уже тогда начал подозревать…) Производитель явно не отличается дружелюбностью. В разделе Support/Download для данного SSD лежит одна единственная ссылка на нечто, называемое SSD Scope. Какая-то утилита, которая работает под виндой и выводит “состояние здоровья” вашего накопителя. Правда на скриншотах было видно, что один из пунктов в интерфейсе называется “Firmware status/upgrade”. Так что, выходило, что надо качать и ставить этот софт под винду.
Так как это прошивка для SSD, подключаемого по M.2, да еще и того, на котором стоит система, то обойтись виртуалкой с пробросом в нее физического устройства скорее всего не получится (а даже если и получится, то как-то слишком рискованно). Переставить SSD в другой компьютер тоже проблематично: и интерфейс редкий и разбирать X240 крайне много мороки (чертовы китайцы!). Значит нужна живая винда. =(
Надо сказать, что на тот момент у меня на ноутбуке даже были какие-то остатки предустановленной винды. Проблема только в том, что из коробки винда стояла где-то на sda3, при этом sda1 был EFI boot раздел с ейным загрузчиком. Когда я поставил SSD, я первым делом сделал EFI boot раздел на sdb1 (то есть на этом самом SSD), sda переразбил, снеся всё ненужное, а виндовый загрузчик положил на sdb1. И даже заставил эту винду загружаться. Проблема только в том, что потом, в какой-то момент, я переносил данные с другого ноутбука, и, совсем забыв про винду, перезаписал в числе прочего и EFI boot раздел целиком. Так что винда у меня вроде как была, но её загрузчика уже не было.
Ну ок, починять свой загрузчик винда умеет аж со времен Windows NT 4.0, значит надо забутиться с инсталляционного носителя и восстановить, делов-то. Не тут-то было. Во-первых, как выяснилось, у винды до сих пор туго с загрузочными USB. Нельзя просто взять и записать ISO образ на USB, как уже давно делается в приличном обществе. Надо либо запускать встроенный мастер создания инсталляционного носителя (который будет качать все 4 ГБ из Интернета), либо использовать сторонние инструменты вроде rufus (которые берут данные из iso образа, но всё равно копируют файлы весьма медленно). Ну и, понятно, работает это всё только под виндой, благо у меня есть некоторое количество виртуалок, пробросить внутрь которых USB накопитель не представляется сложным.
Попробовал восстановить загрузчик… Два раза… Оба раза было так: загружается инсталлятор, я ему говорю, что хочу починить свою винду, он радостно говорит “у вас поврежден загрузчик, щас починю”, после чего рисует какой-то BSOD и… больше с этого USB диска уже загрузиться не получается, потому что, судя по всему, загрузчик он чинит сам у себя. “Разрешите я выстрелю себе в ногу, сэр!”
Черт с ним. Решил поставить винду с нуля. Фиг. Не нравится ей что-то. Пишет что на данный раздел установить винду невозможно, потому что диск имеет разметку GPT. После некоторого чертыхания, удаление раздела, затирания данных на разделе и т.п. таки удалось уговорить инсталлятор, что ставить можно и нужно и винда-таки поставилась…
Уже во времена приснопамятного Windows NT 4.0 виндовый загрузчик был достаточно умный. Он поддерживал менюшки, chainload других загрузчиков и всё такое. Конечно инсталлятор не мог понять всякие там линуксы, биэсди и прочее, тупо затирал MBR своим stage 1 bootloader, и в меню добавлял только другие найденные инсталляции той же винды. Но то был прошлый век. Сегодня у нас всё технологичнее, есть UEFI, с его стандартизованным процессом выбора загрузчика и т.п. Но фиг там. Винда заставила меня биться в истерике… первый раз…

21 век. Космические корабли, всё такое… Для совместимости и интероперабельности в области загрузки персональных компьютеров изобретен стандарт (U)EFI, со специальным разделом, куда разные ОС могут складывать свои загрузчики, чтобы потом их запускать из начальной микропрограммы EFI.
А долбаный Windows 10 ПРОДОЛЖАЕТ УДАЛЯТЬ ЗАГРУЗЧИКИ других операционных систем. Но так как теперь по стандарту они ему не мешают, он, для надежности, при инсталляции переформатирует все найденные EFI Boot разделы!

Реальность оказалась еще более фееричной. После того, как починил загрузку рабочей системы, я вернулся к исходной задаче, то есть к перепрошивке SSD. Загрузился в винду, поставил SSD Scope, перешел в раздел с информацией о прошивке… “Для вашего устройства есть более новая прошивка, скачать?” – радостно спросила меня программа. “Конечно да”, – ответил я. После чего ничего не произошло. Но в Диспетчере задач (а надо сказать, что диспетчер задач и прогрессбар файловых операций – это две реально отличные новые фишки в восьмой винде) было видно, что что-то оно-таки качает. Через некоторое время вдруг всплыло окошко “Новая прошивка скачана. Открыть?”
На самом деле об этом можно было догадаться раньше. Как можно из винды обновить прошивку накопителя, с которого, возможно, эта винда и загружена? Конечно инженеры Трансценда тоже об этом подумали. И, конечно, решили, что безопаснее будет, если пользователь загрузится с чего-то другого. Например с USB. К сожалению, это не прошивка BIOS и не устройства на какой-нибуть legacy шине, типа PCI, поэтому из DOS этого сделать не получится. Windows PE, конечно, более-менее подойдёт, но весит много, сложна в лицензировании и не все просто с поддержкой аппаратуры. Какую ОС выбрать для такого носителя, чтобы она +/- везде загрузилась и увидела все устройства без всяких там миллионом драйверов? Ну да, вы правильно догадались. SSD Scope просто скачал мне архив, в котором лежал образ специального Линукса, руководство и программка под винду, которая умеет переформатировать флэшку и записать на нее выбранный образ. Так со мной случилась истерика второй раз.
Но и это еще не все. Воспетая Никитой стратегия “клик хере” не сработала, флэшка записывалась, но при загрузке с нее не оказывалось ни иксов, ни программы прошивки. Разбираться не стал, выдрал прошивальщик с файлами из архива, загрузился по сети в GParted Live, запустил прошивальщик и… он сказал, что щас всё с SSD сотрёт полностью. Не знаю, что в такой ситуации делают “простые смертные”, а мне пришлось еще сдампить всё содержимое вначале на диск, а потом после перепрошивки обратно на SSD.
В общем задача решена: SSD, вроде, больше не подвисает, но лулзов и потраченного времени, как по мне, так несколько слишком. Единственное что не могу понять, так это какая из всего этого мораль, видимо придётся додумывать читателям.