?

Log in

Ильшад Хабибуллин

Свежие записи

5/9/2015 15:27 - Saint-Petersburg: fprog september



Очередная встреча любителей функционального программирования - 10 сентября, в 19.00, в офисе JetBrains. https://spb-fp-meetup.timepad.ru/event/239460/


Приходите, будет, как обычно, интересно. Вот пример того, что обсуждается (это фото с позапрошлого заседалова):


Метки:

6/5/2014 12:59

Ну вот, думали хуже уже не будет. А конца нет пока вонючей слизкой коричневой жиже, и она все наступает. Я в эти дни ощущаю себя евреем, живущим в Берлине конца 30-х годов. В самом логове Третьего Рейха. За меня еще не стоят на улице Роз (да и будут ли стоять?). Не хочу социальных контактов, ни новых, ни старых, боюсь что вот этот старый друг, с которым каждый год выпивали кружечку пива, тоже надел повязку с древним обманчиво-симметричным, неудобным для нейронов символом, и погрузился в общий котел безумия, и вместе со всеми туда же срет, ссыт и пукает, и наслаждается всеобщим воссоединением дерьма и этим чувством, знаете, что прикоснулся к чему-то великому. Дерьму.

18/1/2014 18:06 - Немного поэзии

Памяти шахидов

205.2

Копия на Evernote

31/12/2013 01:44

2013 год начался высоко над уровнем моря. Тех альпинистов, которые пропали на склонах Эльбруса, я, по-моему, видел уходящими в пургу чуть пониже Скал Пастухова. Да я и сам тогда чуть не облажался. Утро было солнечным, вот все и поперли наверх. А потом херь началась. Шторм замел следы рартрака за минуту. Места там уже совсем не лыжные, скорее только для восходителей. Трассы/подьемники и прочая инфраструктура далеко внизу. Оооочень далеко внизу, вокруг нихера не видно, справа ледник, слева можно ненароком уехать хм... вникуда. Кое-как спустился. Много льда, коньки там нужны, а не лыжи.

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

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

Напарник, опытный фрирайдер, чуть не остался без пальцев. Гора заставляет себя уважать.

Ровно в последний день, и ровно под конец дня (удачно-то как, а?), повредил колено почти на ровном месте и самый последний спуск с горы был на снегоходе спасателей.

Clojure, много Clojure. Вообще, сильно ушел в Clojure.

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

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

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

На самом деле, что планировал в конце предыдущего года (по бизнесу, по личному развитию/обучению) - почти ничего не достиг. Но достиг много другого. Ну или не достиг, а получил, не знаю как думать.

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

17/10/2013 23:19 - WSGI - значит трезвый

Тем временем беспорядки продолжаются. Столкновения между фанатами Руби и Питона перерастают в массовые побоища. Количество жертв постоянно растет. Наш корреспондент ведет репортаж прямо с места событий:

- Почти все заборы покрыты лозунгами "Джанга для джангистов, Питон для питоноводов!", "Хватит кормить Рельсы!", "WSGI - значит трезвый!" Люди доведены до отчаяния пришельцами из PHP и Visual Basic. У многих в руках Emacs с пустым открытым буфером, в котором нет ни одной строчки кода. Повторю, Ни Одной Строчки Кода. Есть и пользователи Vim. Некоторые наблюдатели полагают, что их даже больше. С разных сторон баррикад слышны нецензурные выкрики в адрес Гвидо Ван Россума и Юкихиро Мацумото.

Протестующие также обеспокоены бездействием со стороны gcc. Однако внятных политических требований ни одна из сторон пока не выдвинула.

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

Защитники Категориальной Абстрактной Машины и Высокого Матана пока отказались комментировать происходящее, заявив только, что, цитируем буквально: "Вопрос не стоит и выеденного яйца".

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

- "Мы считаем, в частности, что проблему не стоит формулировать именно так,"- комментирует один из них, пожелавший остаться анонимным, - "но очень, очень многие люди всерьез полагают, например, что все проблемы в разработке веб приложений, в частности - из-за Рельсов, например, из-за паттернов и привычек, привнесенных ими. Конечно, проблемы есть, например, и их много. Однако, в частности, сами же протестующие делают равно то, в чем обвиняют своих противников. Посмотрите на ту же Джангу, например. Разве я не прав? И там и там - state, you doing it wrong, OMG ORM, complexity вместо simplicity, например, и многие другие проблемы, накопившиеся, в частности, за долгое время бездействия."

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

13/9/2013 20:55

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

30/8/2013 10:25 - Пару слов на обществоведческую тему

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

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

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

Такой ум вызывает у меня белую зависть. Потому что мне бесконечно далеко до них.

Другая тема такого же масштаба, случившаяся в сверхновой истории страны, по моему мнению, набирает свои обороты прямо сейчас. Речь идет о ЛГБТ. Говоря о "масштабе" - я имею в виду важность, многогранность, далеко идущие последствия. На одной стороне - Настоящее, Неподдельное, Безусловное чувство, знание, понимание Свободы. На другой стороне - обычное многовековое российское ордынство.

Вот такие два события. Что касается выборов мэра Мск - тут я затруднаяюсь оценить. Может да, может нет. Это событие понятнее, прямолинейнее и даже приятнее для всех сторон. Почти тоже самое можно сказать и про Болотную. По моим ощущениям - все-таки это нечто гораздо более локальное. События же с Pussy Riot и ЛГБТ - глобальны. Не в пространственном смысле, и скорее во временном, причем - исчисляя не десятилетиями, а столетиями и даже тысячелетиями. Может быть, это в том измерении, в котором живет общественное бессознательное.

24/8/2013 04:28

+8.2% после заявления Балмера об уходе. Охренеть жыщъ.

12/8/2013 23:07

Внезапно обнаружил, что теперь в Emacs можно спокойно работать в таком непопулярном режиме:

  • открыл dired

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

  • открыл файл, поработал с ним

  • закрыл через убийство ((global-set-key "\C-q" 'kill-buffer) в init.el для этого), снова видя перед собой dired

  • прыгаем на другой файл / лазим по дереву директорий

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

Отличие Emacs'а от других иструменов в том, что файл открывается "поверх" изображенной директории. Мне это всегда нравилось.

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

Как было раньше: если открыть dired'ом в одном буфере одну директорию, а в другом другую, потом открывать в них файлы, то после kill-buffer файлов вы увидите не ту директорию, которая там была до этого, а последнюю открытую. Нужно явно открывать эту директория, не прибегая к убийству буфера с файлом (что в принципе правильно с точки зрения общепринятых сценариев использования emacs: буферы не убиваются вообще).

Теперь же буферы ведут себя умнее и так ровно так, как ожидается. Словно у вас рядом открыто 2 имэкса.

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

26/7/2013 20:05

Это неловкое чувство, когда по пьяни залезаешь в информационное море по колено, накидаешь в закладки браузера всякой х*йни типа "надо бы потом почитать/послушать/посмотреть", а на следующий день недоумеваешь, нахуя тебе Снуп Дог, статья "Открытия" в журнале "Эсквайр", подробная биография Евгена Коновальца и фильм "Пастырь"...

Красс Намордников: литературный дневник

23/7/2013 20:13 - О судьбах Smalltalk'а замолвите слово

21/7/2013 07:06

Как jQuery-программирование-на-селекторах поощряет неудачный дизайн: состояние аппликации хранится в DOM (т.е. представлении). Оттуда берется, и туда же и кладется. Это вместо того, чтобы иметь DOM на выходе вашего, условно говоря, pipe (т.е. рендерить результат). А на входе этого условного "pipe" будет модель данных, где-то там в середине - обработка (бизнес логика).

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

Только вот на дворе совсем не середина нулевых, и если писать современный фронтэнд - то jQuery ничего не дает такого, потому что нечего выискивать селекторами из документа. Представление у вас - на выходе, а не на входе.

14/7/2013 18:23

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

Functional Design Patterns

Хорошо он выступает. На слайдах кложурь, но на язык не завязано.
Метки:

7/7/2013 23:41

nahua

8/2/2013 17:12

Консистентность - как много в этом слове. Иногда мне кажется, это как Рим, куда ведут все дороги.

20/12/2012 12:36 - Концептуальные фреймворки

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

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

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

20/12/2012 10:14 - 12-Factor

Годный набор базовых правил для построения веб приложений, SaaS-на-Руби-в-облаке-на-Heroku, который вы с друзями пишете по вечерам в Старбаксе на углу в окресностях Сан-Франциско. Чек-лист, с которым полезно свериться и понять, насколько адекватен используемый вами набор технических решений или, скорее, насколько он соответствует требованиям времени. А если нет, то возможно, вас ждут сложности, которых можно было бы избежать, не выдумывая ничего нового?

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

Хватит предисловий, перейдем к делу.

1. Одна кодовая база, много развертываний.

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

2. Явным образом заданные и (по возможности) изолированные зависимости.

Разработчикам не следует полагаться на неявные зависимости, которые "скорее всего" установлены на целевой системе. Нихрена не установлены. Указывайте их явно, перечисляйте кропотливо. И лучше, если все это запускается в изолированном окружении, которое, в числе прочего, "не пропускает" в ваш рантайм другие версии тех же библиотек, установленные system wide. Не даром эти две вещи так часто идут рядом - инструмент для разрешения зависимостей и инструмент для создания изолированного окружения. Когда это правило не соблюдается, вдруг из ниоткуда возникают большие и совершенно непродуктивные траты времени на попытки развернуть систему. И профессионализм инженера подчас не особо-то и помогает снизить эти траты.

Примеры: Clojure: Leiningen, Python: Pip + Virtualenv, Ruby: Gemfile + bundle exec.

3. Храните конфиги в переменных окружения

Конфиги удерживают все то, что разнится между развертываниями: рабочим, тестовым, локальным и т.д. Это не должно быть в коде - ну это ясно. Интересно утверждение про переменные окружения, в противопоставление конфигурационным файлам. Аргумент про то, что такой путь - language-agnostic кажется мне не столь значимым. Тем не менее такое правило есть, и я не буду растягивать пост здесь, а предлагаю подробнее почитать на официальном сайте 12-Factor, ссылку на который приведу в конце этой статьи.

4. Backing services должны быть переключаемыми.

Хорошее правило. Недавно мне приходилось запускать доступ к Microsoft Azure на локальном компьютере, а иначе проект вообще не запускался, и это было крайне неудобно (позже эта часть проекта перешла в мои руки и я просто переписал его на более "хакерские" инструменты, следуя правилам 12-Factor, которым лично я давно стараюсь следовать в значительной их части).

Но на самом деле, правило не об этом. А о том, что ваш код не должен делать различий между тем, используете ли вы локальный Postfix для отправки почты, или обращаетесь к сервисам вроде Postmark. То же про очереди, базы данных или хранилища файлов и т.д. Есть локальные, есть сторонние. Нужно обеспечить возможность быстро переключаться между ними. Параметры доступа  - это конфиги, а не код. И это не про разные настройки для локального экземпляра и рабочего. Это, скорее, про возможности менять их везде, если я правильно понимаю.

5. Строгое разделение между стадиями сборки, релиза и развертывания.

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

6. Stateless processes

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

7. Связь с фронтендом через порт.

Никаких контейнеров вроде Tomcat. Приложения должны быть self-contained. И точка.

8. Масштабирование через процессы

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

Особо интересно дополнительное утверждение в этом правиле: процессы не должны себя демонизировать. Никаких PID-файлов. Все через удобные, развитые менеджеры процессов, такие как Supervisord, Upstart, Foreman и проч.

9. Шустро и быстро: запускать и останавливать.

И иначе elastic scaling превращается из эластик в черти что. Мало того, приложения должны проектироваться так, что SIGTERM ничего не ломает и даже наоборот, предпочтителен как наиболее быстрый способ остановить вашу штуковину.

10. Минимальный разрыв между разработкой и рабочим развертыванием.

Разрыв бывает:
  1. Временной: время между кодированием и тем моментом, когда изменения коснулись конечных пользователей.
  2. Персональный: одни инженеры кодируют, другие ответственны за развертывание.
  3. Инструментальный: разные тулзы на разных стадиях.
Про первые два все понятно: эджайл - он эджайл. А вот сведение инструментального разрыва к минимуму - это и про backing services тоже. правило звучит так что, не следует полагаться на адаптеры к базам данных, абстрагирующие работу с ними. Все легко устанавливается пакетными менеджерами.

11. Логи - это не файлы. Это stream.

Фреймворки и серверы приложений записывают логи в файлы, поэтому мы привыкли думать о логах как о файлах. Но это лишь один из способов их вывода. Приложения никогда не должны управлять тем, куда и как сохраняются логи. Вместо этого, каждый процесс выводит свой поток событий в stdout и о ином не беспокоится. Во время разработки инженер наблюдает его в консоли, а в постановочном или рабочем развертывании event stream отдан окружению, в котором запущен процесс, и может быть передан специально преназначенным для этого инструментам, таким как Logplex, Fluent.

12. Административные процессы запускаются в том же окружении.

Скрипты для миграции базы данных и проч. работают в том же изолированном окружении с теми же зависимостями, что и основной код. Например, в питоне следует оформлять скрипты через entry points. Они будут в том же virtualenv bin.

---
Это был краткий пересказ  своими словами, спасибо за внимание. Подробнее - на 12factor.net

13/12/2012 02:00

Все вокруг про какое-то Послание говорят и пишут. Я не на шутку взволновался. Наконец-то? Дождались?

Помню, в 90-е годы я боялся "А вдруг на самом деле вокруг других звезд не крутится никаких планет? Вдруг сам факт наличия планет, вращающихся вокруг звезды - это не правило, а исключение, причем единственное (наша солнечная система)?" Логика говорила, что этого не может быть, но чертик, такой маленький чертик на плече сидел и подзуживал: "а вдруг? Недаром религии, боги-аллахи, ангелы-черти, адам с евой, божье создание и проч. И мы тут единственные, и шансов нет на иное потому как и планет-то больше нет нигде."

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

И вот, теперь, Послание.

Новый виток в Судьбе Человечества.

Я неспеша сварил себе чашку кофе, сделал глоток, поставил чашку возле ноутбука, снова открыл его и приготовился - не мир, а лично персонально я - вступить в Новую Эру. В Новую Эпоху, эпоху где мы, земляне - уже не единственные создания во Вселенной. Что там, в Послании из иного мира? На каком языке? может, на лямбда-исчислении или комбинаторах (а че, хороший способ абстрагироваться от реализации всего чего только можно). Доказательства теорем? Рисунки? Или на современном человеческом языке (хм, насколько я знаю, наши радиоволны нихрена никуда не долетают). Или на одном из вымерших, древних человеческих языков, который был принесен на нашу планету извне?

Но все оказалось банальнее.

Полез я обратно, тут ничего интересного.

2/12/2012 23:35


Как правило, код на Clojure получается компактнее, чем код для тех же задач, написанный, например,  на питоне. Как-то так, почему-то так выходит) Короче, проще, меньше и по смыслу, и по количеству строк.

Но то ли желая сделать его еще красивее для взгляда на монитор с расстояния 2 метров, толи просто от лени, часто используют 'use' без ключа :only. В результате, когда смотришь на такой код, не существует ни одного нормального способа понять, откуда взялся тот или иной символ. Это очень, очень плохо. Никуда не годится.

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

28/11/2012 00:34

Же не ма па сис жюр Кроме шуток, закраудфаньдте десяток-другой баксов на благое дело - путь пишет:

Redline - JVM-based Smalltalk.
Разработано LiveJournal.com