Author Archives: himself

On responsibility

To further train myself in this skill, I’ll write some of the posts in english from now on. If you spot an error – and I mean any error, not only grammatical errors, even bad phrasing will do, – please be sure to correct me.
Now to the topic…

Responsibility comes uninvited. It’s not a thing that can be measured and limited to any desirable extent. You cannot throw it off by saying “I don’t want to be responsible for this so don’t rely on me” – and that’s where life differs from the world of software licenses (in which similar claims are pretty usual things).
In real life if somebody relies on you, it’s already too late to state your “limitation of liabilities”. If you’re being relied on, that means you’ve already done enough to provoke this; so by saying “hey, don’t rely on me” you’re basically saying “looks like I’m too scared to face the consequences of my previous actions, but I want to look like a responsible guy nevertheless”. And that’s exactly what’s the irresponsibility is. Even if you did everything you could to make people not to rely on you – with no success though, – you still can’t say that “it’s not my problem anymore if I let somebody down, because they were warned”. That is the real irresponsibility.

If you really don’t want anybody to depend on you, don’t do anything that might make them think they could. And if you did then go all the way and support them till the end because it’s already your problem from the time you’ve first messed with it.
Your actions and not your words define your responsibility.

(a bit more)Maybe my point will be easier to understand, if I introduce some explicit example. The case that brought the whole topic into my mind.
As some of us know, Raymond Chen is a popular Microsoft blogger who writes about Windows history, system internals and backward compability stuff. He’s easily one of the most popular and widely-known Windows-related bloggers out there. His articles are always superb, and constitute, to my opinion, an excellent reading for everybody from system administrators to kernel programmers.
But again and again Chen continues to state that the whole blog thing is but a mere storytelling for fun and nobody should rely on any information there.
Well, I see his point, some of the topics concerned are out of Chen’s jurisdiction and far beyond his profile; he can only make guesses in these, so the information in his blog can possibly be unreliable (although, as far as I know, nothing came up until now). But then again, he’s the blogger who gained so much trust and popularity; all of this was not given to him in an instant, – he earned people’s trust by writing good, reliable and informative posts – and now he wants his readers not to believe him out of blue? But if he really wanted not to be depended on, he’d just never write anything potentially misleading. He’d never publish a book made of his blog posts!
And even if he really did not want anybody to depend on him, it does not matter. He still can’t get off with that lame excuse. Of course nobody’s going to blame him for his mistakes (it’s his own blog, after all), if such are to be found, but by taking a role one takes the responsibility coming with that role. It’s impossible to separate one from another.

"Ой, простите, это я во всём виноват"

От одной крайности до другой не так уж далеко.
В проекте N, над которым работают, как минимум, трое программистов, затесалась ошибка. Ошибку отловили техники, и доложили о ней с гонцом в программистский отдел:
– Товарищи, в проекте N задетектирована ошибка. Когда делаешь A, но не делаешь B, вместо C происходит D. Как насчёт порыться в коде на этот предмет?
– Не надо рыться, я знаю – это у меня ошибка. Я давно подозревал…
– Ох чёрт! Быть того не… Да это ж… минуточку… похоже, это я…
– Стойте, не торопитесь, проблема у меня. Пара минут, я исправлю.
– Да ты что, ошибка совершенно точно моя. Ведь знал же, что этим кончится…
– Какая она твоя, когда я её уже полгода на примете держу?
– Погодите-погодите…

Излишняя ответственность иногда вредит не хуже безответственности. Если ваш собеседник слишком быстро принимает на себя вину, возникает искушение так и оставить её на нём – раз уж сам вызвался.
Да, а ошибка была вашего покорного слуги ;)

ever17 – ende

Концовка великолепна.
Однако, по Гамбургскому счёту, ничего не объяснили. Следующие вопросы успешно финишировали, не сумев найти свои ответы:
1. Почему семь?
2. Почему Цугуми подыгрывала? Что она делала со стеной в версии Мальчика?
3. Кто сломал подводный комплекс с Такеши?
4. Почему не все Cure-носители идентичны?
5. Как БВ-17 услышал Сару-34?
6. RN3AOH, ты будешь смеяться, но – кто пнул банку?
7. Откуда взялись два Такеши?
8. Откуда взялся водоплавающий Мальчик?
9. “Дрожь веток времени”.

А теперь подробнее. С этого момента я настоятельно рекомендую тем, кто ещё не играл в ever17, пойти и сделать это. Вы не пожалеете.
(поехали спойлеры)

1. Счётчик.
Если подумать, какие вещи мог учитывать счётчик? Есть варианты:
– Людей (5 штук в каждом варианте) – наверняка
– Прочих живых существ (1 штука) – высокая вероятность (счётчик тупой, людей от крыс не отличает)
– Прочие разумы (1 штука) – низкая вероятность (счётчики так не умеют, куда им)
– Сору (1 штука) – средняя вероятность (разработчики счётчика прикольнулись)
Причём счётчик должен всегда держаться одного метода подсчётов.
Итак, мы уверены, что счётчик считал людей. Это пять. Чтобы получить цифру семь, есть варианты:
– Крыса + БВ
– Сора + БВ
– Крыса + Сора
Первые два варианта практически невероятны, поскольку счётчик не имеет права считать БВ. Он его не видит. Значит, счётчик считал Сору и Крысу, но тогда совершенно непонятно, откуда на нём оставалась цифра 1, когда все погибали. Сора, что ли, туда константой забита?
И как он умудрялся падать до пяти? Ну ладно крыса, ту он мог потерять из виду. Но Сора-то, Сора!

2. Цугуми.
Насколько я понял, Цугуми понятия не имела об инсценировке. Точнее, не участвовала в её организации. Тогда что заставило её подыгрывать? Ведь она же честно повторила всё вступление – пнула Такеши, отдала костюм Мальчику – хотя и видела, что ситуация полностью повторяется. Она даже прибыла в LeMU в том же самом платье. Неужели у неё денег не было? Нет, она явно помогала. Тогда зачем все эти подозрения и ненависть к прочим инсценировщикам? Ведь она заодно?
Дальше, в Мальчиковой точке зрения Цугуми (в своём костюме) копалась в панели на стене. Что она там забыла? Что она делала? Будь это версия Такеши, я бы сказал, что она пытается проникнуть в Leiblich, но в версии Мальчика она должна была просто ждать своей встречи.

3. Комплекс.
Кто сломал его в первый раз? Про кого БВ (или мальчик) говорил “Не выходи! Пожалуйста, не выходи! Пожалуйста, оставайся там!”?

4. Cure
Цугуми в эндинге боится выйти на свет, но её хомяк сидит на плече её костюма без особых проблем. Точно так же Кабураки ходит по палубе, нимало не смущаясь (хотя он тоже Cure).
Да, и Ю-хару-34, должно быть, Cure (поскольку не умерла от сердечного приступа – разовое лечение тут не поможет). Да и Такеши просто обязан быть Cure, потому, что иначе это будет 1. Слишком грустно, и 2. Нелогично – как он избежал смерти, если Cure не прижился? Впрочем, Такеши ещё не успел обработаться вирусом целиком, так что ему на солнце быть можно.

5. Лифт 17-34.
Да, Коко умеет общаться с БВ. Да, БВ слышал голос Коко, когда вытаскивал Сару из лифта в 34-м. Но как он мог слышать голос Сары, вытаскивая Коко из лифта в 17-м?

6. Кто пнул банку?
Итак, кто? БВ не умеет пинать банки. Коко не умеет пинать банки. Допустим, в версии Мальчика это инсценировали. А в первый раз? Собака Коко? Крыса? Единственные подозреваемые. Но нет: отсчёт времени слышали все.

7. Два Такеши.
Цитирую по памяти кусочек за Мальчика (прятки):
“Я бросился в зону отдыха, но там меня уже ждал Такеши. Чёрт! Схватив (кого-то там) за руку, я рванулся обратно в коридор, и наткнулся… на Такеши с распростёртыми объятьями.”
Такеши телепортируется? До некоторого момента я пытался объяснить это скачками героев между параллельными ветками времени. Но такая теория, похоже, оказалась несостоятельной. Тогда что?

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

9. Дрожь веток времени.
Стараниями БВ мы получаем любопытный эффект в играх со временем. А именно:
– БВ чинит прошлое, и вызывает парадокс (отменяет самого себя)
– БВ понимает, что всё плохо, и чинит прошлое снова (провоцируя вызов самого себя)
– [17 лет]
– БВ появляется, и отправляется чинить прошлое.
– Смотри пункт один.
Таким образом, мы получаем нечто, что мне хочется назвать словом “flicker”: две ветки времени (парадоксальная и хорошая) на равных правах раз за разом сменяют друг друга. Что это значит для времени я не знаю, но, так или иначе, ветки равноправны, и хэппи-энда не будет.
Ладно, ладно, я придираюсь. Хэппи-энд будет! Мне так хочется.

Про то, что сама идея использования БВ для изменения прошлого несостоятельна в многоветочной интерпретации времени, я почти молчу – эту вселенную мы принимаем на веру. В конце концов, после воскрешающего вопля “Папа!” и плывка Хокуты на 120 метров вглубь, к мелочам уже можно не придираться – это сказка. Очень красивая сказка, сказкам не обязательно происходить в нашем мире.
Но вот логика в сказках всё равно должна быть b-)

Об иностранном

Ужасно, что принято замалчивать ошибки в речи иностранцев. Вроде как чувство такта.
Ерунда это, а не чувство такта. Почём мне знать, что я ошибся, если мне не скажут?

What

Дорогие друзья.Дорогие друзья.
У меня опять приступ знакомого, наверное, каждому анимешнику заболевания под кодовым названием “полоса отстоя”.
Аниме кажется мне скучным и тухлым. Всё лучшее уже отсмотрено. Остались только унылые сериалы про обычных японских школьников, никогда не сдающихся и спасающих мир; приторно-позитивные девочковые панцу-файтинги в далёком будущем параллельных вселенных (о, как бесконечно далеки они от моего великого Маи-Химе *сарказм) и затянутыё квёлые откау-комедии, где маленькие девочки писклявыми голосами откалывают убогие шутки, понятные только толстым погрязшим в аниме (да! ещё более, чем я, погрязшим!) дядям из далёкой Японии.

Подскажите что-нибудь хорошее посмотреть, а?
На всякий случай, вот. Оценки там довольно неуравновешенные, но хоть какой-то список.

Внезапно

Залез на страничку Ю Асакава, сэйю Комачи Цугуми из ever17. С удивлением обнаружил:
Azumanga Daioh (TV) as Sakaki
Love Hina (TV) as Motoko Aoyama
School Rumble (TV) as Itoko Osakabe

Это что, всё была она одна?!

Похоже, в моём списке “любимых сейю” появился пункт номер два.
Пункт номер один – это Юи Хориэ
Love Hina (TV) as Naru Narusegawa
School Rumble (TV) as Eri Sawachika

Подозрительное совпадение списков “ого, она снималась и тут” я оставляю на совести самого себя.

Узник Азкабана

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

Гарри Поттер

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

Эмм… вы уж простите мне моё деревенское мнение, но у Ле Гуин и Джеймса Барри то же самое получилось много лучше.
Хотя нареканий книга совсем не вызывает, поскольку просто ни на что и не претендует. Ну как можно придираться к такой ерунде? Читается она легко – ну и слава богу.
Просто для детской сказки она слишком скучна и прозаична, а для взрослой фантастики – слишком глупа и натянута.

Впрочем, быть может, я чересчур придирчив. Не зря я вспомнил о Барри: “Питер Пэн” в детстве (лет в шесть) казался мне “сказочным” (чего, при схожести стиля повествования, начисто лишён “Гарри Поттер” ). Стоило бы перечитать его, пожалуй, чтобы сравнить ощущения. Может чувство “сказочности” просто меняется со временем.

Ну а Ле Гуин здесь по очевидным причинам: та же самая история у неё рассказана так, что она нравилась мне и в шесть лет, и в восемнадцать.

И вообще, подозреваю, клише “прирождённый талант беспородного ученика завоёвывает ему славу и признание в среде профессионалов” – одно из самых избитых в фантастике.
Ладно, прочту ещё пару книжек – посмотрю.

UPD. О, я понял – “Гарри Поттер” это “Код Да Винчи” для детей. Только лучше. “Да Винчи” был мне неприятен, а “Поттера” я вполне читаю, и даже испытываю тлеющую симпатию.

ever17

Концовка за Сору сделана (ещё до ICFP), но она мне не очень понравилась. Сора была лучше, пока она была “просто подругой”. Да и Цугуми куда адекватней себя вела в первой ветке.

Кстати, я засёк эпический обман со стороны этой… мелкой…
“Пён-пён-такепён”…. как же!
Нечисто здесь.

ICFP 2007 или "Как лодку назовёшь…"

Конкурс ICFP 2007 торжественно завершился. Команда, в которой я играл, EFG (Epic Fail Group, “команда эпического провала” ), в полном соответствии со своим названием, заняла почётное 64-е место из 869-ти.

Я к этой цифре отношения почти не имею, поскольку ничто из моих трудов (кроме, возможно, устных советов) так и не принесло команде ни копейки.

Да и вообще, единственное, что принесло нам копейку – это случайно обнаруженный внутри файла… (далее)

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

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

А теперь подробнее.

Авторы ICFP обожают придумывать своим заданиям любопытные предыстории. Вот и на этот раз, случилось так, что на планету Земля из космоса грохнулся маленький Эндо расы Фуун. Тело Эндо совершенно не приспособлено к жизни в условиях ночи, дождя, гопников и химических удобрений. Ему хочется солнца, лета, девуш… ну и ещё он хочет быть не пришельцем, а коровой (чтобы переносить нашу гравитацию). Без всего этого он немедленно же умрёт, а чтобы этого не случилось, поломанный его корабль законсервировал Эндо, и пытается изменить его ДНК, чтобы, во-первых, превратить Эндо в корову, а заодно поменять ночь на день, дождь на солнце а гопников на девушек. Такая могущественная у Эндо ДНК.

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

ДНК фуунов изменяет фууна (и мир вокруг него) в два этапа:
1. ДНК компилируется в РНК.
2. РНК исполняется, и получается картинка.

Корабль передал организаторам ДНК Эндо (7 с половиной мегабайт). Если скомпилировать этот ДНК, получатся ночь и гопиники. Менять ДНК нельзя. Но можно дописать к нему что-нибудь, причём чем меньше – тем лучше (у корабля садятся батарейки от длинных ДНК).

Процесс превращения РНК в картинку несложен – по крайней мере, у нас проблем не возникло. Это просто написание интерпретатора семибайтных команд по отрисовке.

Вся закавыка была в первом этапе. ДНК превращается в РНК следующим образом:
1. Считывается закодированный в ДНК паттерн – кусок строки с “дырками”.
2. Считывается закодированный в ДНК шаблон – кусок строки со “слотами”.
3. Считывается ещё немного данных. Если они подходят под паттерн (то есть буквы совпадают с буквами паттерна, а там, где у паттерна “дырки”, может быть что угодно) – всё, что прочитано, отбрасывается, а вместо этого к ДНК слева приписывается считанный шаблон, в котором “слоты” заполняются совпавшими кусками данных.

Например.
Паттерн: (ABCD____EF)
Шаблон: (TEXT * TEXT)
Данные: ABCDKLMNEFGHIJKL
Результат: TEXT ABCDKLMNEF TEXT GHIJKL

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

Правильно – повторить.
Примерно два миллиона раз.

Написать парсер этого чуда было несложно. Основная проблема была в скорости. Тупое “копирование” строк приводило к невероятно медлительной обработке, поскольку паттерны в большинстве своём были такие:
AB__…(семь мегабайт пропусков)…_CD
Соответственно, если паттерн совпадает, мы должны вставить его в шаблон. То есть, скопировать семь мегабайт данных в памяти. Один раз это, может, и ничего, но два миллиона раз скопировать по семь мегабайт – результата не дождёшься. А ведь это только одна компиляция, а в процессе поиска решения компиляции идут одна за другой.

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

(начало, длина)
(начало, длина)
(начало, длина)

Когда мы пытаемся прочитать очередной символ, мы смотрим, какая пара у нас выбрана “текущей”, и читаем из неё. Дойдя до её конца, мы переходим на следующую пару.
В таком случае, чтобы “скопировать” семь мегабайт данных, достаточно просто найти их начало в этом списке, найти их конец, и скопировать только цепочку списка между ними (а она “лёгкая”, там же нет данных – только указатели на них).
Например:

(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало3, 3 мегабайта)

Копируем:

(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало3, 3 мегабайта)

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

Реализовывать эту гадость было ужасно неудобно (ДНК фуунов совершенно не рассчитывалась под такие извращения), но я, плакая от усталости, всё-таки сделал это. И что бы вы думали?
Уже на двадцатой итерации длина цепочки ссылок была порядка нескольких тысяч элементов.
То есть, длина цепочки росла даже не линейно.
То есть, ДНК фууна устроено таким образом, что этот подход просто неэффективен. Он действительно чудовищно быстр на первых итерациях (где цепочка ещё маленькая), но с каждым следующим проходом получается так:
1. Была цепочка длины 3.
2. Скопировали, получили цепочку длины 6.
3. Скопировали её, получили цепочку длины 12.
…ну и так далее.
При этом длина суммарных данных в цепочке близка к первоначальной. Когда мы работаем со строкой, мы тратим много времени на копирование символов, но в итоге строчка получается примерно того же размера, и доступ к ней очень быстр. Когда мы работаем с моим списком, мы моментально копируем огромные блоки, но ДНК написан так, что дробление информации на кусочки неограниченно растёт. В результате с некоторого момента всё работает ещё хуже, чем в “наивной” схеме.

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

ДНК фууна был любопытен ещё и тем, что в нём скрывалась куча приколов.
Например, добавив к РКН маааленький префикс из инструкции, можно было заставить его генерить не картинку “грустного Эндо около сломанного звездолёта”, а инструкцию:

Если вы видите эту картинку, значит носитель этой ДНК потерпел крушение на неизвестной планете. Пожалуйста, ничего не трогайте в ДНК, и вызовите службу поддержки с Альфа Центавры.

Если вы совсем-совсем никак не в состоянии связаться со службой поддержки, используйте следующий префикс, чтобы получить руководство пользователя ДНК:
[небольшой префикс]

Если носитель ДНК находится вдали от искуственных источников освещения, а естественный источник сейчас освещает противоположную сторону планеты, активируйте этот префикс, чтобы развернуть планету к Солнцу нужной стороной:

И самое главное:
НЕ ПАНИКУЙТЕ

Ещё существовали префиксы на DNA Self-Test (картинка с текстом “Checking memory read… OK; Checking memory write… OK; Checking integer overflow… OK “, причём ДНК на полном серьёзе всё это тестировала, а в картинку выводились результаты тестов – 25 штук).

Самое интересное обнаружилось незадолго до окончания соревнования. Кое-кто из нашей команды нашёл в исходном коде ДНК строчку “Portable Network Graphics”. Дампнув содержимое в файл, он убедился, что это действительно встроенный PNG-файл. В нём на белом фоне было написано:
Human Audio follows.

И действительно, дамп следующего куска ДНК оказался wav-файлом. Голос в нём произнёс:
“IICIFPCCI….”
Похоже, это был ещё один префикс.

Единственная проблема со всеми этими префиксами, как я уже сказал, в том, что за отсутсвием эффективного компилятора большинство из них просто невозможно было запустить. Не говоря уже о, собственно, сборке Эндо (ведь именно в этом было задание). Для сравнения, полная сборка Эндо – два миллиона итераций, тогда как парсивший один из префиксов всю ночь мой компьютер успел сделать только 490 тысяч итераций. Самый короткий префикс тратил 130 итераций – то ли Self-Test, то ли страничка “НЕ ПАНИКУЙТЕ”.

Надо бы подвести всем этим рассуждениям какую-то черту…
Играть было увлекательно. Тяжело, но увлекательно.

А теперь я, пожалуй, вернусь к ever17, и посвящу ему следующий пост.