おきしみみ (oxij) wrote,
おきしみみ
oxij

Почти три месяца event_mask is 110111, not able to describe 4th event

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

Из того, что произошло за это время ярко выделяются:
* защита магистерской диссертации,
* поступление в аспирантуру,
* написание отчёта по государственному контракту в TeXе,
* катание по Европе поездами и последствия,
* любовь к NixOS;
* начало ведения другого блога.

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

Про магистерскую я надеюсь когда-нибудь рассказать в другом блоге. Вкратце, я научился кодировать в разрешимом подмножестве зависимой системы (брр, я столько раз писал это словосочетание, что муражки по коже пробежали) типов (Agda) некоторые любопытные утверждения о некотором ограниченном классе программ (подмножество систем управления чем-нибудь достаточно дискретным). Я всё мечтаю допилить это до состояния, когда этим можно будет хотя бы нормально поиграть, но в Агде очень не хватает deriving Eq для эквивалентности по Мартину-Лёфу, я экономил всё, где мог, а потому там пока всё не очень красиво и малоюзабельно (зато научно, ага).

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

Написание отчёта по госконтракту в TeXе это прямо веха в моей жизни, я считаю. Я так смачно натрахался с LaTeX2e, что словами не описать. По дороге возненавидел всё внутренности TeXа всей душой, но выпилил подобие ГОСТовских шаблонов для вёрстки документов и biblatex. Результатами я когда-нибудь тоже поделюсь (я хотел в сентябре, но, как обычно, времени допилить всё до приличного состояния нет, а в неприличном состоянии выкладывать стыдно). Нетипизированные языки программирования надо жечь.

Кстати, любопытно, в сентябре пришлось писать генерировалку doc'овских шаблонов для другого госконтракта. Из любопытства, возьмите достаточно большой вордовский документ, сохраните его в html. Загрузите обратно. За исключением изменения цвета текста (это баг ворда, да) вся разметка сохраняется. Даже ссылки на переменные и вычисляемые выражения в документе. Если почитать сгенерированный html и поэксперементировать с его минимизацией, то можно научиться генерировать красивые htmlные документы, в которых даже нумерация списков, оглавления и ссылки правильно генерируются самим вордом после их открытия им (правда в браузере их бесполезно открывать, вся разметка плывёт в жопу).

Я так нареверсинженерился того, что он там генерирует, что чувствую в себе силы написать компилятор из подмножества LaTeX в этот doc-html. Штука в том, что на этот раз я знаю как LaTeX устроен внутри и, извините, но компиляция документов сделанных при помощи стандартных пакетов и макросов LaTeX2e — занятие не для слабонервных. Если бы между texовским файлом пользователя и LaTeX2e был бы ещё какой-то вменяемый уровень абстракции, то ещё куда ни шло, но там сразу всё макроподставляется в грязнющий Plain TeX, полный всяких хаков, а это нереально декомпилировать обратно в адекватное описание того, что мы хотим получить. Судя по результатам реверсинженеринга, Word, в обмен на флексибилити, пытается держать внутри близкое к адекватному AST документа с которым хоть работать можно.

Короче, надо писать свой компилятор для TeXа.

Дальше. Я вроде писал, что у меня есть свой собственный дистрибутив. Так вот, был. Идея была хороша, из общего описания всех машин кластера генерируются squashfs-образы их систем, при пуске поверх squashfs при помощи aufs2 монтируется rwшный tmpfs. Чтобы закоммитить изменения нужно было запустить скрипт, который смонтировал бы ещё один tmpfs поверх, а предыдущий tmpfs зажал бы squasfsом, положил в специально отведённое место в /boot и добавил в смонтированные слои.
На практике, как оказалось, это работает не очень:
* локальные изменения перетирают изменения в настройках кластера и за конфликтами тяжело уследить (это можно было правильно победить, но лень);
* частые локальные изменения генерируют много слоёв в aufs, засирают неймспейс файловых систем в ядре;
* целиком пересобирать образы каждый раз очень бесит.
Я было стал переписывать систему, чтобы победить все эти недостатки сразу. Думал, думал, писал, писал, писал. И понял, что я пишу то, о чём уже слышал. Есть такой пакетный менеджер с очень неудачным трудно гуглибельным названием и операционная система, которая его использует. Мне лень тут пересказывать куски из его документации, читайте сами. Но эта штука решает почти все традиционные проблемы, связанные со сборками пакетов и деплоем.

По сути, Nix — это такой ленивый функциональный язык программирования, в котором есть специальный строгий тип derivation (по сути «пакет»). Эти деривейшоны (пакеты) генерируются из других деривейшонов (пакетов) функциями, принимающими зависимости (естественно, деривейшоны) пакета в качестве аргументов. Форс деривейшона — сборка пакета. Сборка происходит в изолированном окружении, где доступны только содержимые других явно указанных деривейшонов (аргументы функции). Никаких /usr и /usr/local в NixOS нет.
В итоге, забыть указать какую-то зависимость просто невозможно, пакет просто не скомпилируется. Идентефикатором деривейшона является хеш описания дерева зависимостей, начинающихся с него самого. Изменился исходник, способ сборки или зависимость — изменился идентефикатор.

Энвайромент юзера и системы явно составляются Nixом из списка нужных деривейшонов. Юзеры обычно делают это ручками (типа, мне нужен wget, я прошу Nix добавить мне его в энвайромент, если оно уже скомпилировано, то он просто его добавит, если нет, то скомпилирует и добавит, после этого, если другой юзер попросит добавить ему такой же wget (а не с другими зависимостями, например), то это произойдёт моментально), NixOS позволяет делать описание для всей системы, а nixos/modules по абстрактному описанию системы сгенерируют ещё и все конфиги в /etc и initrd (в том числе и конфиг для самого Nix, где рассказывают сколько ресурсов можно жрать во время сборки, например), например.

Можно откатываться на предыдущую версию пакета/всей системы, если что-то пошло не так (более того, версии системы добавляются в меню в GRUB и всегда можно загрузиться в предыдущую, если эту сломал), можно собрать две версии одного пакета, одну версию с разными зависимостями, установить пакет только для одно юзера (без прав rootа, кстати) и прочие плюшки, которые тут все просто не перечислить. Короче, Nix — это пакетный менеджер вашей мечты, просто вы этого пока ещё не знаете, прочтите их мануалы. Я в начале немного сомневался в удачности дизайна их системы, но, прочитав всю доступную документацию, понял, что там просто вещи не очень удачно названы (тот же «Nix» чего стоит, например, хрен выгуглишь), а по сути всё очень близко к идеалу. Настолько близко, насколько это вообще возможно без выбрасывания нафиг устоявшихся методов работы с системой (shell, не экзоядерное ядро, init, древовидная файловая система как таковая вообще, и без транзакций в частности).

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

Так вот, последние несколько недель в свободное время я хачил NixOS под свои нужды (как оказалось, там уже почти всё есть, хачил там-сям, по мелочи). Сделал ещё один уровень абстракции над nixos/modules, который из моего описания кластера генерирует отдельные описания всех машин для nixos/modules, а уже из них оно генерирует содержимое корня и всю ту шелуху, без которой юниксы не работают.

Сегодня, собственно, я закончил переводить последнюю машину в кластере на этот магический дистрибутив. На десктопе тут пока Arch, в универе Debian, но, я чувствую, что это ненадолго.

Фотография стенки рядом с центральным сетевым узлом в доме:
фотография двух сетевых свичей и модема
Стамегабитный свич полностью занят, в гигабитный воткнуты только те, кто делают между собой сетевой RAID1. На переднем плане чифтековский корпус одной из машин (6 винчестеров 3.5 + 3 пятидюймовых корзины для приводов, вместо которых тоже винчестеры), на нём внешний eSATA-бокс для винчестеров, не поместившихся внутрь. Между этим корпусом и стенкой стоит ещё одна машина с большим обёмом RAM, но всего двумя корзинами для винтов (я не хотел ещё один большой корпус, ставить некуда). eSATA-box подключён к ней. Также можно видеть зукселевский модем без крышки. На его CPU лежит чайная ложка, на микросхеме, отвечающей за WAN — десертная ложка на термопасте. Летом в них я воду кипячу. Остальные машины раскиданы по дому.

Если бы в моей деревне был нормальный интернет, то все свои хостинговые нужды я обслуживал бы сам :(

Что касается катания по Европе и последствий, то это самое вкусное, оставлю на следующий десерт. А в заголовке другого блога есть моя фотография из Франции, например.
Tags: если бы я помнил какие тут у меня были, метки
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments