LE Blog

Инженер с поэтической душой

30.03.2016 firtree_right Быстрый пинг

Предисловие

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

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

Задача

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

man ping

Simply Yes No

Ход решения

  1. Линуксовый пинг продолжается бесконечно, поэтому нужно ограничить число пакетов. Опция _-с_.
  2. Можно сделать пакет меньше с помощью опции _-s_.
  3. Можно уменьшить интервал между посылаемыми пакетами (но не меньше 0.2 секунд, если пингует не суперпользователь) с помощью опции _-i_.
  4. Или же интервал можно сделать адаптивным, чтобы он сам ускорялся, если ответ пришёл быстро с помощью _-A_.
  5. можно не выводить ненужную нашему скрипту информацию с помощью _-q_ и перенаправить стандартный вывод ошибок в никуда.

Что мы получили:

$ ping -A -s16 -c3 -q ya.ru 2>/dev/null
PING ya.ru (93.158.134.3) 16(44) bytes of data.

--- ya.ru ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 400ms
rtt min/avg/max/mdev = 1.923/2.075/2.339/0.187 ms, ipg/ewma 200.281/1.973 ms

Пока всё ещё многовато читать. Хорошо бы вытащить только число полученных пакетов. А оно у нас как раз после первой запятой в строчке рядом со словом «received».

$ ping -A -s16 -c3 -q ya.ru 2>/dev/null | grep received
3 packets transmitted, 3 received, 0% packet loss, time 401ms
$ ping -A -s16 -c3 -q ya.ru 2>/dev/null | grep received | awk -F', ' '{print $2}'
3 received
$ ping -A -s16 -c3 -q ya.ru 2>/dev/null | grep received | awk -F', ' '{print $2}' | awk '{print $1}'
3

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

$ timeout 1 ping -A -s16 -c3 -q ya.ru 2>/dev/null

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

#!/bin/bash

cnt=3
to=1
rcvd=$(set -o pipefail; timeout $to ping -A -s16 -c$cnt -q $1 2> /dev/null | grep received | awk -F', ' '{print $2}' | awk '{print $1}')
if [[ $? != 0 || $cnt != $rcvd ]]; then
    exit 1
fi

Дополнительно

  1. man ping
  2. Полная версия fastping.sh, в которой можно задать число пакетов и таймаут, но они имеют дефолтные значения.
  3. Пинг на стероидах — fping.

16.03.2016 firtree_right Как я встраивал reCAPTCHA v2 в свой антикварный бложек

Предпосылки

Мы живём в интересное время. Когда я увлекался довольно серьёзно руби он рэйлз, лет шесть-семь назад, была версия руби 1.8.7 и версия рельсов 2.3. Все неспешно переходили на руби 1.9.1 и рэйлз 3.0. Сегодня, пять лет спустя, стабильная версия руби — 2.2.3, а про рельсы уже агитируют переходить на 5.0, хоть и бета. Когда же я начал свой первый проект на ноде — три года назад, — версия node.js была что-то типа 0.22. А сегодня уже 5.8!

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

Антиквариат

До последнего перерыва, рассказ о начинке моего блога мог бы легко заполнить парочку в меру интересных статей, а сейчас это представляет интерес только для археологов. Что касается движков для блога вообще, то про когда-то популярный ЖЖ все уже забыли. Стремительно набирает моду вести канал в Телеграме. А товарищ мой — Илья — в когда-то давно в качестве платформы для блога сделал самый правильный, как мне сегодня кажется, выбор — генератор статического сайта.

Что ещё? Технология оупенайди, на которой у меня были прикручены комментарии, умерла. Рекапча, которую я прикручивал в комментарии Ире, была куплена Гуглом и ещё пока жива, но уже выпустили вторую версию, и я боюсь, как бы они таки не закрыли первую, как Гугл это умеет делать. Но даже тогда джем, который я использовал, чтобы встроить капчу, волшебным образом исчез из библиотек, и мне пришлось таскать его с собой в папочке vendor. Про вёрстку я даже не говорю.

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

DIY

reCAPTCHA v2

Когда я решил использовать новую капчу, я даже не стал искать библиотек. С вероятностью 80% они не заработают на моей старинной системе, и с вероятностью 30% перестанут поддерживаться очень скоро. Просто читаем документацию, встраиваем капчу в форму отправки комментария, а на сервере прямо в методе создания комментария пишем, например:

url = URI.parse('https://www.google.com/recaptcha/api/siteverify')
req = Net::HTTP::Post.new(url.path)
req.set_form_data 'secret' => 'SECRET_KEY',
                  'response' => params['g-recaptcha-response'],
                  'remoteip' => request.remote_ip
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
res = JSON.parse(https.start { |p| p.request req }.body)
if res['success'] ...

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

Да, это противоречит паттерну MVC, да, это противоречит ООП. Но посмотрите на саму капчу: она не учитывает положения формы на странице, когда открывает своё окно. А также не работает задокументированная фича data-tabindex. Полно хороших библиотек и поделок увядают так и не исправив своих ошибок. Такова реальность программиста сегодня. Красивая библиотека для встраивания в проект на рельсах не сделает эту капчу лучше, но исправлять описанные выше ошибки можно тоже обезьяньими заплатками.

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

10.03.2016 firtree_right Эзотерический джаваскрипт

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

Что случилось?

Началось всё, я так понимаю, ещё в 2009 году с обсуждений на форумах sla.ckers.org потенциальных возможностей межсайтового скриптинга. Но там ещё был другой синтаксис. Впечатливший же меня пример написания джаваскрипта обнаруживается только в 2012 году. Были и раньше другие заходы. Например, джаваскрипт из японских смайликов. Я же узнал об этом от товарища, который прислал мне ссылку на the daily wtf.

Позволю себе немного пересказать, а дорогому читателю предлагаю прямо открыть консоль и попробовать. Вся эта штука основана на конвертации типов в джаваскрипте при сложении или приведении к булевым значениям. Программировать на джаваскрипте можно всего лишь с помощью восьми символов: [, ], (, ), {, }, ! и +. Вот, что выдаёт мне консоль в ответ на ввод:

> +[]
0
> !+[]
true
> !!+[]
false
> +![]
0
> +!![]
1
> +!![]+!![]
2
> +!![]+!![]+!![]
3

И вот у нас уже есть числа и булевы константы. Теперь нам нужны буквы:

> !![]
true
> !![]+[]
"true"
> ![]
false
> ![]+[]
"false"
> +!![]+!![]
2
> +!![]+!![]+[]
"2"
> ({})
Object {}
> []+{}
"[object Object]"
> ({}[+[]])
undefined
> ({}[+[]])+[]
"undefined"
> +{}
NaN
> +{}+[]
"NaN"

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

> +"1e1000"
Infinity
> +"1e1000"+[]
"Infinity"
> +"1e100"
1e+100
> +"1e100"+[]
"1e+100"

Все буквы (a, b, c, d, e, f, i, j, l, n, o, r, s, t, u, I, O, [, ], <пробел>, +) можно доставать из строк, с помощью квадратных скобок и чисел. Но мы уже давно можем сделать eval — исполнить произвольный код из строки:

> (![]+[])[3]
"s"
> (![]+[])[3]+([]+{})[1]
"so"
...
> []['sort']['constructor']
function Function() { [native code] }
> []['sort']['constructor']('return alert')()
function alert() { [native code] }
> []['sort']['constructor']('return alert')()(1)
/* должен выскочить алерт */

Дело остаётся за малым — получить все остальные символы, с помощью которых можно написать программу. Чтобы уже совсем не чувствовать стеснения. И тут нам на помощь должна прийти функция unescape, которая из знака «%» и аски-кода делает символ. Но у нас пока нет для этого символов «%» и «p». Где же их взять?

> []['sort']['constructor']('return location')()
Location {hash: "", search: "", pathname: "/blog/posts/48", port: "", hostname: "lonelyelk.ru"…}
> []['sort']['constructor']('return location')()+[]
"http://lonelyelk.ru/blog/posts/48"
> ([]['sort']['constructor']('return location')()+[])[3]
"p"
> ({}+[])[0]
"["
> []['sort']['constructor']('return escape')()('[')
"%5D"
> []['sort']['constructor']('return escape')()('[')[0]
"%"
> []['sort']['constructor']('return unescape')()('%'+'7a')
"z"

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

02.03.2016 firtree_right Лось

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

Терминал

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

лось в терминале

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

eye=(o O @ . - \* \~ °)
let left=${RANDOM}%${#eye[*]}
let right=${RANDOM}%${#eye[*]}

cat << EOF

 _  _        _  _  _
| || | ____ | || || |
\    |/    \|      /
 \____ ${eye[$left]}  ${eye[$right]} ______/
      |    |________
      |             }=
      | __  ____  _ |
      ||  ||    || ||
      ||  ||    || ||
      ""  ""    "" ""

EOF

Базовая работа с массивами. Встроенная в баш функция случайного числа. Обязательно предварять косой чертой «*» и «~», чтобы они не стали списком файлов и домашней директорией. По-моему — красота!

Spec runner

И, конечно же, для любителей разработки через тестирование нужен правильный репортер:

elk-spec

Здесь нужно пользоваться эскейп кодами для управления положением каретки, то есть курсора. Мало кто помнит, но курсор можно двигать во все стороны на любое количество позиций. Данный пример я собрал для раннера тестов на жасмине. Да, да, я разрабатываю в том числе на node.js и тестирую с помощью jasmine. Ключевая функция для рисования лося вот:

function printElk() {
  if (specCount > 1) {
    print('\x1b[5A');
  }
  if (specCount % 2 === 0) {
    print(Array(specCount + 1).join(' ') + '     ^^' + eyes() + '^^\n');
    print(Array(specCount + 1).join(' ') + '  _____ U\n');
    print(specTrail + '~(  _  /\n');
    print(Array(specCount + 1).join(' ') + '  || ||\n');
    print(Array(specCount + 1).join(' ') + '  ^^ ^^\n');
  } else {
    print(Array(specCount + 1).join(' ') + '      ^^' + eyes() + '^^\n');
    print(Array(specCount + 1).join(' ') + '  _____ U\n');
    print(specTrail + '`(  _  /\n');
    print(Array(specCount + 1).join(' ') + '  // \\\\\n');
    print(Array(specCount + 1).join(' ') + ' ^^   ^^\n');
  }
}

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

Бонус

Это не про лося, но тем не менее. Вообще, я считаю, что всегда лучше потратить немного времени, чтобы сделать всё удобно и интересно. Мелочи решают!

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

export PS1="\[\e]0;\u@\h: \W\a\`if [ \$? = 0 ];then echo \[\e[32m\]^_^\[\e[0m\];else echo \[\e[31m\]o_O\[\e[0m\];fi\`[\u@\h: \w][\$(rvm-prompt v)][\$(nvm_version)]\$(parse_git_branch)\$ "

Это моя строка запроса. В её начале мы видим или зелёный довольный смайлик, или красный удивлённый. Благодаря вот этой части:

\`if [ \$? = 0 ];then echo \[\e[32m\]^_^\[\e[0m\];else echo \[\e[31m\]o_O\[\e[0m\];fi\`

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

Материалы для самостоятельного изучения

  1. $RANDOM.
  2. elk_reporter.js.
  3. Управление курсором в баше.

01.03.2016 firtree_right Февраль

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

♯♯♯

Открыл для себя уже не новую игру про дополненную реальность — «Ингресс». Игра заключается в том, чтобы мотаться по городу и не только по городу, но и куда подальше, захватывать порталы и сообща создавать поля. Две фракции, которые отличаются только легендой и цветом, но с точки зрения игровой механики делают одно и то же. Если хотите, могу прислать вам инвайт — мне за это беджик дадут, если вы дорастёте до второго-третьего уровня :) Только чур за зелёных играть! Для меня это примечательно по двум причинам. Во-первых, я никогда не любил такие игры, где нельзя всё сделать идеально и навсегда. Всё, что я делаю в этой игре, могут поломать, испортить и всему помешать. Это совершенно невыносимо, но и притягательно оказалось. Во-вторых, возможности игры в одиночку достаточно ограничены. Для всего интересного нужна команда. Например, чтобы натянуть такое вот поле в 29 слоёв, хоть и всего на несколько часов (об этом мне только мечтать и мечтать ещё):

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

♯♯♯

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

♯♯♯

Получил, наконец-то, нормальную вводную в «Дизайн человека» (Human Design). Мне раньше система казалась чрезмерно навороченной. Но сейчас всё так совпало, что стало прикольно. Вообще, я открыт к любым наукам и моделям о человеке. Есть множество систем разного качества, возраста и объёма подкрепляющих эмпирических наблюдений. Мне было бы вполне нормально думать про, например, свою крапивницу-аллергию, как про «нестабильный ветер», если бы при условии, что когда я делаю упражнения и ем еду, которые стабилизируют «ветер», мои симптомы успокаиваются или проходят совсем. Или список болезней и вызывающих их «грехов» был бы тоже прикольным, если бы работала обратная связь хотя бы в каком-то объёме. С интересом всё пробую на себе. Пока, например, в медицинском отношении на первом месте, конечно, хирургия, на втором — таблетки, а на третьем — питание. А в «Дизайне человека» на текущий момент зацепила именно позиция про приятие и изучение себя, какой есть. Это может быть система описания человека, которая опережает своё время, как периодическая система Менделеева, а может оказаться полной туфтой, вызванной естественным желанием восприятия увязывать в причины и следствия и связывать между собой всё, что попало. А считаю я так, возможно, потому что я по профилю 5/1 :)

17.02.2016 firtree_right Смена настроек /etc/hosts в одно касание

Зачем?

В какой-то момент я стал носить на работу ноутбук и отказался от двух компьютеров: домашнего и рабочего. В редких случаях приходится делать небольшие действия по работе, находясь дома. Для того, чтобы добраться до нужных машин внутри рабочей сети, я использую ssh-тоннель с пробрасыванием портов. Например, есть два сервиса: server1:8080 и server2:5000. Когда было два компьютера, то было всё просто. Рабочий компьютер находился внутри сети и видел оба сервера с их сервисами по правильным адресам, а домашний адресовал оба имени серверов на localhost, где сервисы оказывались на тех же портах после поднятия тоннеля. Но с ноутбуком нужно было как-то переключаться.

Для смены настроек я использовал самый простой, как мне кажется, способ: редактировал файл /etc/hosts. У меня было два набора строчек: для дома и для офиса. Один всегда закомментирован. Файл открывался с помощью sudo vi, и внутри можно использовать замену, используя номера строк, которые видны:

:2,7s/^#/
:9,13s/^/#/

Первая команда означает «со второй по седьмую строчку удалить „#“ в начале строки», а вторая — «с девятой по тринадцатую строчку поставить „#“ в начале строчки». Но когда делаешь одно и то же много раз, всегда хочется это автоматизировать.

Changesettings

Как?

Для начала мне хотелось избавиться от номеров строк (мало ли, какие добавятся или исчезнут строки). Поэтому я решил выделять зоны файла для офиса и дома комментариями «#officestart», «#officeend» и, соответственно, «#homestart» и «#homeend». Теперь интервал для замены можно было выделять через них:

:%s/#officestart\zs\_.\+\ze#officeend/smth_smth_smth/g
:%s/#homestart\zs\_.\+\ze#homeend/smth_smth_smth/g

В данных командах \zs и \ze означают начало и конец паттерна, который мы хотим заменить командой s в интервале %, то есть во всём файле. То есть мы меняем не всё, что нашли, а только часть. А сам паттерн — это _.+, что означает «один или более любых символов, включая конец строки». Буква g в конце означает, что может быть несколько таких блоков, что необязательно.

На что же мы будем заменять найденный паттерн между комментариями? Во-первых, нам совершенно точно понадобится замена внутри замены. А во-вторых, нам не поможет символ ^ для обозначения начала строчек, т.к. у найденного паттерна всего одно начало перед всеми строчками. Поэтому мы будем использовать знание структуры файла /etc/hosts: в случае IPv4 каждая незакомментированная рабочая строчка начинается с цифры, а закомментированная, как и положено, с «#». Для дома получаем команды:

:%s/#officestart\zs\_.\+\ze#officeend/\=substitute(submatch(0), '\n\(\d\)', '\n#\1', 'g')/g
:%s/#homestart\zs\_.\+\ze#homeend/\=substitute(submatch(0), '\n#\(\d\)', '\n\1', 'g')/g

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

От команд к скрипту

Осталось сделать из этого удобную штучку. Лично я оформил это следующим образом. В файле ~/.bash_profile:

alias imhome="sudo vim -u NONE -f -s $HOME/.vim/homehosts /etc/hosts"
alias imwork="sudo vim -u NONE -f -s $HOME/.vim/officehosts /etc/hosts"

Соответственно, файлы ~/.vim/homehosts:

:%s/#officestart\zs\_.\+\ze#officeend/\=substitute(submatch(0), '\n\(\d\)', '\n#\1', 'g')/g
:%s/#homestart\zs\_.\+\ze#homeend/\=substitute(submatch(0), '\n#\(\d\)', '\n\1', 'g')/g
:wq

~/.vim/officehosts

:%s/#officestart\zs\_.\+\ze#officeend/\=substitute(submatch(0), '\n#\(\d\)', '\n\1', 'g')/g
:%s/#homestart\zs\_.\+\ze#homeend/\=substitute(submatch(0), '\n\(\d\)', '\n#\1', 'g')/g
:wq

Таким образом, команды imhome и imwork спрашивают пароль и меняют настройки. Это иллюстрирует, почему был выбран редактор vim в качестве инструмента. Любые sed и awk будут потом требовать sudo tee для того, чтобы записать файл с нужными правами. А здесь мы запускаем всего одну команду.

Материалы для самостоятельного изучения

  1. Поиск и замена в vim.
  2. Использование выражений при поиске и замене в vim.

03.02.2016 firtree_right Вот это я называю «перерыв»!

Что было

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

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

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

Wakeup

Что будет

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

01.02.2016 firtree_right Январь 2016

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

♯♯♯

Чтобы как-то вернуть нормальные функции головы, я решил затеять графоманский проект и подводить итоги каждого месяца (или просто писать, что было интересного). Год обещает быть богатым на события и изменения. Надеюсь, не обманет. Хотя и ссу, конечно, тоже. В связи с чем возобновил ещё и рукописный дневник и подумываю возобновить программерский бложек. Удачи мне!

♯♯♯

Безусловное приобретение месяца — совершенно волшебный инстаграм актрисы мастерской Петра Фоменко Ирины Горбачёвой. Не могу оторваться. Придётся идти в театр теперь.

♯♯♯

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

♯♯♯

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

♯♯♯

Вроде всё. Такие дела.

26.09.2015 firtree_right Люби себя, сука!

Восьмой месяц занимаюсь в клубе «Другой бой». То, что мне обещали ребята, что меняется тело — полностью верно. Совершенно по-другому себя чувствую. Кроме того, для личных спортивных целей мне впервые удалось осознанно набрать массу, чего не получалось у меня никогда за мои 35 лет. Наел, конечно, в добавок себе бока. Мне кажется, никто в мире не строг так со мной и не презирает меня за малейшее несовершенство, как я сам. Самое главное пока испытание я прошёл: купил себе рашгард и не прекратил тренировку. У нас статистика такая, что 50% перестают ходить сразу после покупки рашгарда.

♯♯♯

В обществе незнакомых людей, особенно если это прекрасные девушки, чувствую себя как железный дровосек. Раньше для подвижности суставов дровосека я использовал алкоголь. Но потом попадал в совершенно ядовитый стыд, даже если ничего ТАКОГО не делал. Потому что никто в мире не строг так со мной и не презирает меня за малейшее несовершенство, как я сам. Но алкоголь сошёл на нет по ряду причин за последние два года. Потому дровосек пребывал в некотором оцепенении. Надеюсь, что это могло прокатить за некоторую загадочность. Я, конечно, могу рассказать девушке, как именно она умрёт, если в комнате появится чёрная дыра размером с монету (или массой с монету — совсем другое дело). Или я даже знаю несколько фраз для подката на английском типа такого: Hey, girl! Are you my appendix? Because I don't understand what you do, but I have this weird feeling in my stomach that makes me want to take you out. Но поскольку никто в мире не строг так со мной и не презирает меня за малейшее несовершенство, как я сам, всё это отметено как несоответствующее ситуации и слишком задротское. Стоял молчаливый и таинственный.

♯♯♯

Сегодня после функциональной тренировки на почве бокса в парилке разговорился с мужчиной. Он занимался боксом 3 года и профессионально музыкой. Потом сломал руку, бокс бросил, а музыку — нет. Красной линией через весь разговор проходило то, что жёны и девушки заставляют мужчин лезть из кожи вон в спорте (но не его). Что Спиваков (кстати, второразрядник по боксу) ходит в качалочку в 70 лет, потому что из него жена верёвки вьёт (но у собеседника не такая). Что марафон и Айрон мэн парни бегают, потому что в кругу их девушек некруто, если у тебя парень не бежал Айрон мэн (но не у его девушки). А сам он к тому моменту провёл в зале уже 3 часа (час бассейн, час бег, час качалочка). ТРИ, Карл! А я всё это слушал и думал, что даже если ты и проецируешь это на близких (приписываешь им это), то всё равно не самом деле никто в мире не строг так с тобой и не презирает тебя за малейшее несовершенство, как ты сам.

18.03.2015 firtree_right Тело

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

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

Начать налаживать контакт с телом мне очень помог пилатес. Два года я учился неспешно без насилия заниматься спортом. И со временем мне захотелось исследовать более подвижные и динамические нагрузки, определить свои реальные границы и поиграться с ними. Добавить больше потока. И более мужского спорта, конечно, захотелось. Многие из знакомых мне мужчин с тонкой душевной организацией (not gay!), но не таким хрупким телосложением, отзывались уважительно о клубе «Другой бой». В этом году дозрел и я. В отличие от того опыта единоборств, что я имел сам и видел, когда исследовал тему, в этом клубе всё просто отлично с состоянием ума во время тренировки. Это важно!

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

Это я всё к тому, что сегодня, в среду вечером в центре Москвы пройдёт открытый урок. Милости прошу, кому интересно. Форма для записи справа.