LE Blog

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

31.01.2018 firtree_right Январь

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

♯♯♯

Вся нелюбимая мной школьная программа литературы состоит из историй про людей, внутренний мир которых пытается прорваться через то, что от них ожидают другие. Мне кажется, что редкий литературный персонаж доживает до состояния, в котором можно задаться вопросом: «Что я чувствую, и вообще, какой я?» Сложность внутреннего мира существует только косвенно, в виде конфликта с аспектами окружения. А его богатство распознаётся только по рисунку кругов на воде после исчезновения утопленника из вида. Заглядывать с толком в себя — сравнительно новый способ направления внимания. Нет испытанных методов, что с этим делать. Пока нет. Ужасно интересно, что будет дальше.

♯♯♯

Когда Твиттер построил себе бразильский офис, они организовали голосование, как назвать переговорные. По корпоративной традиции, это должны быть названия птиц. Наш нынешний техдир в то время там работал. Рассказал, что они специально выбрали названия птиц, пришедшие в бразильский португальский из языков тупи-гуарани, от коренного населения. А потом хихикали над тем, как неместные пытаются назначить встречу в João de Barro, в Pintassilgo или в Tuiuiú.

♯♯♯

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

красные мужчины

В связи с отступающим охуением, начал возвращаться к спорту. Без клубов, по ~15 минут, но зато каждый день. Спасибо найковскому приложению, где можно выбрать план зарядки по параметрам, и женский голос бодро, но деликатно проведёт меня через упражнения каждое утро! Из индивидуальных тренеров эта робо-дама на втором месте в моём личном рейтинге. Ещё удивительно, насколько повседневная жизнь состоит из паттернов. Особенно телесных. Вот предлагает мне Василина (я думаю, вы бы тоже дали имя голосу в телефоне, если бы у вас жена жила в другой стране) сделать упражнение. А какой-нибудь приглашённый на сегодняшнюю зарядку специальный гость Рональдо выкрикивает у неё из-за спины: «Осталось десять секу-унд!» А я даже не знаю, будет мне это легко или сложно, пока не начну делать. Не представляю, на что моё тело способно. Как будто у меня диковатое домашнее животное.

♯♯♯

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

07.09.2016 firtree_right Телеграм-бот для Яндекс.ПДД

Введение

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

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

Chat bot

Хуки в продакшне

У ботов Телеграм есть два способа работы: когда бот сам обращается за обновлениями по определённому адресу (polling) и с помощью веб-хуков, когда сервера сами дёргают заданный хук для передачи данных боту. В продакшне, конечно, удобнее работать с хуками, а при разработке — нет, поскольку сервер запускается на локальной машине. Кроме этого я рекомендую завести другого бота для разработки, чтобы те, кто пользуются вашим ботом в продакшне, не замечали, как вы разрабатываете. Возможность сделать это я нашёл пока только в одной библиотеке: node-telegram-bot-api с помощью недокументированной функции processUpdate. Делается это довольно просто. При инициализации бота в файле lib/bot.js:

if (process.env.NODE_ENV === 'production') {
    bot = new TelegramBot(config.botToken, {polling: false});
    bot.setWebHook(config.host + config.url);
} else {
    bot = new TelegramBot(config.devBotToken, {polling: true});
}

А затем уже в серверной части, которая, хоть и запускается всегда, имеет значение только для продакшна, в файле lib/web.js:

app.post(config.url, function (req, res) {
    options.bot.processUpdate(req.body);
    res.status(200).send({}).end();
});

Весь остальной код для бота работает в обоих случаях одинаково и в изменениях не нуждается, что совершенно прекрасно!

Оповещение об остановке

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

Если вы запускаете приложения с помощью pm2, то этот менеджер использует для остановки процесса тот же сигнал SIGINT, что мы используем, когда останавливаем сервер в разработке с помощью Ctrl-C. Очень удобно! В файле index.js

process.on('SIGINT', function () {
    Promise.all(config.permitUsers.map(function (userId) {
        return bot.sendMessage(userId, 'Бот временно выключается. Только спокойствие!', {
            reply_markup: {
                hide_keyboard: true
            }
        });
    })).then(gracefulClose).catch(function (err) {
        console.log(err);
        gracefulClose();
    });
});

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

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

  1. Полный на текущий момент код Телеграм-бота для Яндекс.ПДД;
  2. API Яндекс.ПДД;
  3. Как установить приложение node.js на ubuntu 16.04.