Category: it

Category was added automatically. Read all entries about "it".

|, me, hikki, ok

Хайлайт

Тхис жж ис врыттен ин тхе хопе тхат ит вилл бе усефул,
бут ВИТХОУТ АНЫ ВАРРАНТЫ; витхоут евен тхе имплиед варранты оф
МЕРЧАНТАБИЛИТЫ ор ФИТНЕСС ФОР А ПАРТИЦУЛАР ПУРПОСЕ.
РЫД АТ ЁОУР ОВН РЫСК!
Я предупредил.

Все упоминаемые в данном жж действующие лица вымышленны и не имеют связи с реальными людьми или событиями.

Все мои тексты и рисунки в этом жж, если в самом посте явно не оговорено иное, распространяются по лицензии Creative Commons License
Однако, рисунки из постов с тегом idraw, если в самом посте явно не оговорено иное, распространяются по лицензии Creative Commons License.

Содержательная часть этого жж примерно на три четверти состоит из моих явных и неявных излияний на тему «X — это говно», где X — это почти всё, что угодно, начиная от зубной щётки и POSIX-совместимых API, и заканчивая современной системой высшего образования и интерпретацией археологами архитектуры какой-нибудь древней пирамиды.
Ещё иногда вдруг начинаю писать про [конструктивную] математику (про Haskell там, зависимые типы и всё такое), но в результате всегда получаются серии постов об ужасах жизни, пьяницах-наркоманах-гопниках и войнах с бюрократией.
В объедках иногда встречаются излияния на тему японского визуального искусства, заметки об использовании UNIX-подобных операционных систем и всякий случайный мусор, приходящий мне в голову.

Пишу редко, но если пишу — то много. О уровне моего Чувства Собственного Достоинства можно не сообщать, я прекрасно осведомлён.

Ещё немного бесполезного текста есть в био.

А вообще это — пост для связи, где комменты скринятся.
|, me, hikki, ok

Почти три месяца 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 — десертная ложка на термопасте. Летом в них я воду кипячу. Остальные машины раскиданы по дому.

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

Что касается катания по Европе и последствий, то это самое вкусное, оставлю на следующий десерт. А в заголовке другого блога есть моя фотография из Франции, например.
|, me, hikki, ok

Езда на медведях как метод объектно-ориентированного программирования

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

После наболевшего от прожужжанных «паттернами» ушей ехидного предыдущего поста, последовавшего эпического срача в твиттере, поста zahardzhan и приезда сильно увлеченного объектно-ориентированными свистелками иностранного профессора, я даже на несколько дней засомневался в том, что адекватно воспринимаю происходящее, поскольку мои ответы на вопросы «что не так с X?» собеседников не устраивали. Однако, на прошедшей неделе я случайно для себя открыл замечательный метод рассуждений, позволяющий делать забавные умозаключения о современном state of art, и сейчас я немного их сюда повыписываю, стараясь аргументированно указать видимые мною недостатки.

Я бы рад снова начать с «паттернов», но ведь скажут, что я помешанный. Потому начну с (не) биологии. Итак.

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

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

Мне кажется, что в программировании наблюдается весьма схожая ситуация. Современный аппарат для доказательства корректности программ дорос до уровня, когда приложив немного усилий на самообразование, можно начать выигрывать на порядки во времени отладки. Число свойств, которые я не могу поручить проверить компилятору, уменьшается чуть ли не ежедневно. Но большинство программистов считает, что доказательства о программах — это к Дейкстре и Хоару, требуют много ручной работы, и там всё равно остаются ошибки (и зачем тогда стараться, да?). А адепты биологического подхода предпочитают все современные достижения просто игнорировать.

Языки, построенные на стековых виртуальных машинах, в этом плане очень показательны. С точки зрения разработчиков на них, авторы языков вроде Haskell и Agda сделали «ужасную» вещь — они отобрали у программиста все его привычные инструменты.

А после стали понемногу добавлять всякие «странные вещи», типа ADT, монад, Typeable, type families и индукцию по структуре (вместо неограниченной рекурсии). «Jonny the programmer» недоволен, как писать программы — непонятно, Джонни чертыхнулся и пошёл дальше писать на дотNet. Но те, кто таки поддался соблазну, внезапно обнаружили, что 80% полезных участков кода даже не требуют Тьюринг-полноты, а 19% из оставшихся не требуют отказа от строгости в типах (например, потому что они вдруг становятся рекурсивными). Да и вообще, плюсы вписывания всего, что только можно, в этот новый базис приятны: о программах можно автоматически (ыц!) рассуждать, можно их автоматически (ыц! ыц!) трансформировать (смотри, например, на трансформацию в векторные операции у Data Parallel Haskell), действительно сложные и неразрешимые вещи (IO и рекурсивные типы, например) можно чудесно изолировать и статически гарантировать эту изоляцию (то есть автоматически (ыц! ыц! ыц!) её проверять). Правда остаётся ещё один процент программ, где нужно очень аккуратно работать с ресурсами, или где всё действительно должно быть Dynamic и типы бесполезны, и обозначенные языки туда (пока?) лучше не совать.

Однако, оказывается, что эти «странные вещи» ещё и позволяют очень просто делать то, что раньше считалось сложным. Тут Джонни начинает крутить головой по сторонам, облизываться и требовать, чтобы и в его любимом языке дотNet появился вывод типов, и анонимные функции, и какие-нибудь монады, и ещё ADT, и ещё континюэйшоны, а теперь хорошо бы ещё и тайпклассы, да, да и это тоже было бы не плохо, и вывод типов (ой, он уже есть, но теперь есть тайпклассы и надо его сделать умнее), о, и ограниченные типы тоже хочу, и ещё нормальную редукцию мне, а не только макросы, и от зависимых типов не откажусь... В итоге, в погоне за упрощением методов выражения ограниченного класса типичных идиом, вместо solidного языка получается каша из фич, надёрганных из разных мест (например, делегаты и анонимные функции в C#).

Но Джонни теперь может в три раза короче описывать парсеры, так какие проблемы? Такие, что, если в язык, в котором было нельзя автоматически рассуждать о программах, добавить штуки, о которых можно автоматически рассуждать, то о языке рассуждать всё равно не получится. В общем, досыпали синтаксического сахара, а польза близка к нулю. Что же делать, если Джонни вдруг понял, что иногда уж очень хочется сбросить на компилятор однообразную работу.
— А! А давайте введём специальный тип модулей, в которых будем использовать только те инструменты о которых можно автоматически рассуждать! — в порыве энтузиазма восклицает Джонни.
— Мистер, ваше предложение означает, что эти модули вы будете писать на Haskell.
— Ой.

«Биология» в программах — это то, от чего хочется избавиться, но, это не значит, что «биология» — всегда плохо. Бывают программы, где выразительности современных систем типов недостаточно (двигатель всё время замерзает) и приходится/проще работать без типов вообще (гонять на собачьих упражках), или нужно очень мудро управлять ресурсами (есть только степь с травой и нет бензина), или, наконец, видимо есть какой-то ментальный барьер, стимулирующий для быстрой и грязной работы выбирать язык с утиной типизацией, а не со строгой. Другое дело, что по асфальту на собаках ездить глупо. И я вообще сомневаюсь, что бывают программы, которые не смогли бы ничего выиграть от доступа к нормальной системе типов. Иначе говоря, я сомневаюсь, что бывают программы, в которых все полезные свойства, которые хотелось бы проверить, неразрешимы.

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

А вот теперь снова про «паттерны».Collapse )
|, me, hikki, ok

Паттерны проектирования, гриды и прочая безответственность

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

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

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

Забудем на минуту общечеловеческие значения слов «простой» и «сложный». В этой необщечеловеческой классификации история и философия являются более сложными дисциплинами, чем физика и математика, поскольку в первые две дисциплины особенно не воюют за логическую связность и уменьшение количества параметров, в то время как последние две только этим и занимаются (наверное, от части такая формулировка была навеяна этой критикой философии науки).

В таком же смысле лямбда-исчисление и теория типов значительно проще, чем объектно-ориентированное программирование и паттерны проектирования. При этом, мне кажется, между первым—третьим и вторым—четвёртым куда больше сходства, чем может показаться на первый взгляд. В каком-то интервью (которое я не смог загуглить) вроде Simon Peyton-Jones говорил, что там, где ООП-кодеры начинают совать UML, хаскелисты расчехляют дополнительные стрелки в типовых аннотациях (вот ещё тред почти про это же на sof). Также и большинство паттернов занимается эмуляцией поведения шашечек из функционального мира (выборочно иду по часто упоминаемым из списка паттернов в Википедии): Adapter — замыкания, Interpreter — GADTs + eval, Listener (тут обман, его в списке в Вики нет) — замыкания, Mediator — ещё раз замыкания, Nullable — пахнет Maybe monad transformer, Proxy — тайпклассы и снова замыкания, Visitor — и тут снова тайпклассы. Ля-ля-ля, все всё давно поняли, а я — Капитан О.

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

В общем, наблюдается ярко выраженная любовь человечества к дисциплинам с огромным количеством мелких деталей, где можно строить из себя умного, вообще по сути ничего не понимая. В этом свете, любовь к преподаванию ООП на всяких «языках, используемых в индустрии», типа там C++, или Java, становится мотивационно оправданной: когда больше нечего сказать, можно пофилософствовать почему условие
(a < b) || (a == b) || (a > b)

для a и b целочисленного типа, может никогда не выполниться.

Надеюсь, я достаточно прямо выразил свою простую мысль: ООП, UML, паттерны и прочая «инженерия ПО» — это (за мелкими исключениями) философия, философия — не математика, программирование — математика. Любовь к такой философии легко объяснить отсутствием достаточного уровня абстрактного мышления, ибо ковыряться в деталях всегда проще, чем построить общую теорию. А работать-то не хочется.

Кстати, в этом смысле достаточно поучителен тот (исторический) факт, насколько сильно отличаются по количеству правил первые формализации систем типов для ООП-языков, и их современные версии. Об этом почему-то не часто вспоминают.

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

В заключение хочу отметить, что со времени последних постов, полных уважения к философии, я пришел к выводу, что всякие философы, любители UMLя, паттернов и прочей мути — вовсе не вредны для общества. Смотрите сами, если бы по мгновению волшебной палочки вдруг все фишеры и спамеры исчезли из сети, то люди так расслабились бы, что появление очередного вида мошенничества могло бы вызвать катастрофу глобального масштаба. Философия, РАЕН и ООП с паттернами просто необходимы обществу, чтобы у адекватных его членов не скисли мозги.
|, me, hikki, ok

CHDK

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

Например, там был пост о том, как какие-то товарищи написали распознавалку движущихся объектов, работающую прямо на фотоаппарате Canon. Сама распознавалка меня не впечатлила, зато она была построена на базе проекта CHDK. А эта штука, в свою очередь, оказалась страшно крутой.

CHDK это такой SDK для хаченья фотиков серии Canon PowerShot. История на офсайте говорит, что штука сия была создана вопреки прошивкам канонов, чтобы снять ограничение на создание фоточек в RAW, ибо железка у Canon такую возможность имеет, а официальные прошивки — нет.

Насколько я понял, по диагонали пробежав документацию, то при загрузке камеры прошивка от Canon, при некоторых условиях, ищет на SD-карте бинарник с обновлениями, загружает его в память и отдаёт ему управление, а после завершения его работы грузится ОС камеры.
CHDK притворяется бинарником с обновлениями, при своей загрузке резервирует верхний кусок оперативной памяти устройства и «слегка» правит основной код ОС, добавляя туда свои «хуки».
Эти хуки вмешиваются во все нажатия клавиш камеры, в процесс фотографирования, сохранения полученных фотографий, etc. В результате на устройстве как бы работают сразу две ОС.

Так вот, совершенно случайно, у меня имеется камера Canon IXUS 860 IS. Потому на игры с CHDK на ней ушёл целый день. Я не профессиональный фотограф, фотографией не увлекаюсь и не собираюсь начать. Лично меня привлекла возможность добраться своими грязными лапами до забавной железки с армовским процессором.
Но возможность произвольно менять выдежку, ISO и три тысячи других настроек, сохранять результаты в RAW, запускать скрипты на uBASIC и LUA меня порадовала. Ещё эта штука рисует на экране чертовски информативный OSD.
Если даже меня впечатляет, то фотографы небось вообще кипятком писают.

Только я как-то обработкой изображений не увлекаюсь, и, в принципе, делать что-то конкретное с CHDK лень, однако есть пара идей.
1) Если вклиниться в USB-стек, то можно, например, сделать из фотика веб-камеру (непонятно, правда, зачем).
2) Сделать набор весёлых пост-процессингов. Например, фоткаем деньги, разбросанные по столу, а оно говорит сумму разбросанного.

Ещё есть отчаянное желание засунуть туда интерпретатор хаскеля или сделать eDSL для компиляции в армовские бинарники, которые CHDK сможет запускать в качестве скриптов. Но от таких идей надо лечиться, я считаю.

Экспериментируя с тулзами для создания стерео-картинок в камере, сделал Collapse )

Краткое руководство для получения стерео-эффекта:
0) открываем картинку из под ката на полный экран,
1) ставим на расстоянии 10см. перед глазами указательный палец,
2) теперь, если (не убирая пальца) посмотреть на монитор, то палец раздвоится,
3) передвигая палец находим такое его (а может быть ещё и головы) положение, когда правый квази-палец находится над правой Тамаки, а левый — над левой,
4) теперь фокусируемся на пальце,
5) медленно убираем палец с линии взгляда (например, сгибаем его), но не меняем точку фокусировки (то есть нужно смотреть в точку, где был палец, а не на монитор, который становится видно после исчезновения пальца),
6) на экране должно быть видно три Тамаки, где средняя — стерео-версия.
После некоторой тренировки палец становится не нужен, можно сразу поставить глаза в нужное положение.
Если стерео-Тамаки сильно размыта, то нужно, не теряя концентрации, медленно отодвинуть голову от монитора (или, наоборот, придвинуть ближе).
Ещё можно попробовать сфокусироваться на плинтусе, который находится за стерео-Тамаки.
Кроме того, теоретически, можно убрать размытость просто заставив глаза правильно деформировать хрусталик, но на практике это очень трудно сделать, ибо мозг привык фокусироваться на то, на что смотрим, а не смотреть в одну точку, а фокусироваться на другой. У меня такая магия получается очень редко, отодвинуться от монитора гораздо проще.

Сама стерео-Тамаки даёт приятное представление о качестве самой фигурки. Такие дела.
|, me, hikki, ok

Хеппи нью йеар

В субботу некто мой «сосед» внезапно напомнил, что у меня 8ого числа день рождения.

Собственно поскольку завтра (в смысле сегодня) у меня военная кафедра, которая уже слегка местами начинает надоедать, то мне почему-то захотелось подвести итоги года что ли..

Итак в топологическом порядке:
* Летом и осенью я успел поработать в администрации СПб, что, несомненно, принесло море жизненного опыта.

* На вырученные деньги купил себе хардварный модем зухель и сервер, который нынче занимается сортировкой почты, файлохранением в размере 1.6 Террабайта, ботосодержанием, виртуализацией, прочими глупостями... и, кроме того, обогревом помещений.

* Онямэ теперь смотрю значительно меньше.
Видимо, окончательно определился-таки с тем, что мне нравится.

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

* Стал агрессивно слушать классику и всякую ня-музыку.

* Прорезались зубы мудрости.

* Агрессивно стал посещать театры, оперу (не ту что быдло-браузир)...
(на фото «семейка» стульев в промежутке между коридором с гардеробными и бенуаром в Мариинке)
40,46 КБ

* Переболел красноглазием :3

* Перепробовал до кучи разных открытых ОС... всякие разные дистры линуха (заодно подсадив половину знакомых на арч), план 9, миникс, блюботл...

* Возродил идеи реализации своей собственной.

* Увлекся лямбда-исчислением.

* Сдал зимнюю сессию. \-.-/

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

* Тетрадь по английскому превратил в рассадник няк.
58,74 КБ65,03 КБ

* На своем любимом десктопе послал все DM куда подальше... сначала там был wmii, сейчас па-дэ-дэ танцует xmonad и его ~100 сделанных под меня шоткатов с моим же проектом xmsl (XMonadStatusLine) (который пока существует только на моем винчестере, ибо столь сыр, что недостоин быть ГПЛьнутым, хотя он уже круче xmobar, который есть бяко).
(кликабельно. xmls - это панелька внизу)


* ГОТИЧНЫЕ ЛОЛИ РУЛЯД!

* Пересмотрел свой взгляд на написание исходного кода, после того как написал > 2000 строк, а потом, подумав 4 дня, в итоге урезал сурс до 320 строк, увеличив при этом производительность в 19 раз и добавив самоверфикацию. Теперь я 2 дня - неделю рисую схемы в тетради, пишу маленькие примеры того, как я хотел бы это использовать, и лишь потом запускаю vim.

* Обзавелся телефоном нокия 5200.

* Вообще перестал понимать рекламу в метро (меня это несколько удручает): какую связь имеет красный волейбольный мяч и ипотека я вообще без понятия.
58,60 КБ

* 27 марта сменил фамилию. Теперь, как только получу новый паспорт, я буду «Ян Малаховски» (ага, без «й» на конце). Или «Jan Malachowski» в языковом оригинале.
Теперь мое имя наоборот - ня. А конец фамилии - ски. Так что я теперь одним только именем каваен чуть более чем на половину. =_=

* Пересмотрел свои взгляды на процесс взросления.
Раньше каждое восьмое число четвертого месяца вводило меня в депресняк, сейчас, пожалуй, я даже немного рад. Не то чтобы я тороплюсь постареть, но, почему-то, теперь подругому смотрю на старичков, гуляющих по паркам и зеленым аллеям.
С другой стороны, будущая перспектива (пускай и весьма маловероятная) стать родителем меня пугает. Страшно подумать, какой труд был вложен в мое воспитание и что пережили мои родители за эти уже почти 20 лет: пробитые лбы и затылки, брызги расплавленного свинца в лицо, болевые обмороки, остановки дыхания, ломанные пальцы, руки, ноги... даже перспектива «ребенок-наркоман» выглядит на этом фоне не столь ужасающей. Потому не могу не выразить им свое глубокое уважение и искреннюю благодарность за все пережитые мучения, лишения и переживания.
|, me, hikki, ok

SCTP. горькая правда

просвещение.
не так давно увидел публикацию RFC за номером 3286 для SCTP (Stream Control Transmission Protocol), сегодня погрузившись в сурсы и хаки для ipfilter решил его таки прочитать [1]

краткое содержание:
как всем известно, сегодня почти вся информация в сети передается по стеку протоколов TCP/IP, который на транспортном уровне имеет собственно TCP и UDP, которыми и обеспечивается существование современного интернета. кратко говоря первый обеспечивает "безопастную" передачу данных (без потерь), а второй "быструю" не замечая этих самых потерь.
VoIP, потоковое радио и потоковое видео для своих целей обычно используют UDP, потому как потеря 0.01 секунды звука в потоке не столь страшна, как потеря линии разговора.
а HTTP, SSH, POP3... используют TCP...

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

так вот протокол SCTP изначально разработанный для VoIP призван решить эти проблемы.
*пакет SCTP может иметь несколько адресатов и несколько обратных адресов (удобно для организации конференций)
*пакет SCTP может передаваться по принципам p2p, что, несомненно, несколько повысит его прожорливость по трафику, зато сведет почти в 0 потери
*SCTP сообщение-ориентированный и не требует лишних уровней обработки
*канал SCTP способен держать в себе потенциально неограниченное количество каналов-детей (удобно было бы сделать ftp на его базе, чтобы не создавать дополнительных соединений для данных)
*SCTP имеет встроенную защиту от Dos-атак, которым подвержены TCP и особенно UDP

т.е. сейчас этот протокол идеален для потокового медиа, а в будущем он может серьезно потеснить пару TCP+UDP и на поприще передачи данных. я прямо так и вижу реализацию torrent-ов на этой базе.

теперь о грустном. реализация этого протокола сейчас есть только в Unix-подобных ОС. мне достоверно известно, что она есть у меня в Linux 2.6 и во FreeBSD. другие системы я не смотрел.
Как известно Майкрoсoфт не собирается делать очередной апдейт для ВинXP, т.к. есть Виста, на которую нужно всех срочно пересадить. И в Висте реализации SCTP тоже нет, но она хотя бы теоретически возможна (в ХП теоретически невозможна).

Чем это грозит? Костылями.
Прямо так и вижу слоган "Хотите качественное VoIP - пересаживайтесь на Висту.", НО Виста - говно и это все знают, Линукса лемминги ("несознательные пользователи") боятся...
Теперь о производителях портируемого софта. Представьте какие встают костыли делать одно и то же для Линуха по SCTP, а для Вин по UDP! Думать страшно... и все из-за того что некоторые компании выпускают что-то недоделанное и не собираются этого доделывать, а некоторые пользователи их в этом поддерживают.