Записи за месяц: December 2012

С наступающим…

…новым 1937 годом :)

type и class

В Delphi можно написать:

type HexString = string;

Так мы отметим специальный тип строк, который хранит в себе hex. Но для компилятора они ничем не отличаются от обычных. Вот это скомпилируется нормально:

var a: HexString;
  b: string;
begin
  a := b;
end;

Что, если мы не хотим разрешать такое копирование? (А обычно мы должны не хотеть! Разные по смыслу вещи нельзя присваивать, это опасно). Компилятор можно попросить создать “независимый тип”:

type HexString = type string;

Теперь строку типа HexString нельзя присвоить строке типа string, и наоборот.

Похожий приём работает с классами, только чуть иначе.

type
  HexStringList = TStringList; //можно присваивать HexStringList -> StringList и обратно!
  HexStringList = class(TStringList); //можно присваивать только HexStringList -> StringList, но не обратно!

Классы, в отличие от простых типов, поддерживают наследование. Более “частный” класс можно положить в переменную более общего, но не наоборот. Если мы объявляем тип без “class“, то мы просто создаём для него другое имя: оба типа на самом деле одно и то же. А с помощью “class(TStringList)” мы говорим компилятору “HexStringList – это частный случай StringList, он от него наследует”.

Но что, если мы напишем так?

type HexStringList = type TStringList;

Или так?

type HexStringList = type class(TStringList);

Ответы на это в следующий раз!

Don’t write what you don’t need

Опять программирование. Когда пишешь одну функцию, часто подмывает заодно написать с десяток – и обратное преобразование, и с параметром, и Анси-версию, чтоб уж сразу была библиотечка всего такого на потом. Программисты обожают библиотечки. У каждого программиста своя работа со строками и своё буферизованное чтение в запасах.

Но понемногу я пришёл к выводу, что это вредно.

Даже не тем, что тратится лишнее время. Функции могут однажды пригодиться, и потом, это мелочи, тут нечто гораздо более страшное.

Написав ненужный код, вы его не тестируете. Его не на чем тестировать: в текущем проекте он нигде не используется, ведь если бы он использовался, то это был бы нужный код! И если вы серьёзно хотите, чтобы я поверил, что вы оторвётесь от работы над проектом и напишете юнит-тест для каждой функции, которые вам сейчас толком и не нужны, то тренируйтесь врать. Я – точно не напишу. Мне лень.

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

Возможно, вы узнаете об этом через год, отлаживая загадочные баги в новой программе, использующей старую, давно проверенную библиотеку. Наткнётесь на ошибку в коде функции, удивитесь: “Да как оно вообще работало?” А оно и не работало.
Даже если вы не тестируете новые функции специально, нужные функции сами собой проверяются в ходе работы программы. Пусть это не полноценное тестирование, но большинство путей кода всё-таки оказываются покрыты. Дополнительные же функции не вызывались ни разу, поэтому баг может быть где угодно, даже на самом виду.

Но мало того, когда вы захотите исправить ошибку, вам вдруг станет страшно. Вы подумаете: “А что, если?..”

Что, если эта функция кем-то используется? Ведь неспроста она оказалась в библиотеке. Никто не будет писать функции просто так. Значит, какой-то из проектов вызывает эту функцию и притом работает.
Если вы её сейчас исправите – не сломается ли он?
Да, у вас тут индексация с нуля, а не с единицы, как сказано в комментарии. Вызывая функцию правильно, получить хороший результат невозможно. Значит, кто-то вызывает её неправильно, по ошибке передаёт как раз нужный ошибочный индекс. Если вы функцию почините, тот проект сломается.
Неизвестно, какой. Неизвестно, когда и где. Но что сломается – это почти наверняка.

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

Chuunibyou demo Koi ga Shitai

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

Разумеется, герои сами в эту сторону идти не хотят (а кто захочет?!), так что автор загоняет их пинками. А ну отказались от детских фантазий! Со скорбными лицами! Приняли решение повзрослеть! Совершили ошибку! Мучайте себя, мучайте!

Если считать, что написание книги – это доказательство тезиса примером, то автор успешно доказал свой: что свежих идей у него нет. Все эти разбивающиеся о трезвость жизни волшебные фантазии, эти рассыпающиеся от бессилия спеллы Декомори, это радостное “магия в нашем сердце” в конце, это всё НА-ДО-Е-ЛО.
Не знаю, какой там Шуклин в этом видит “всплеск”.
Магии в проруби?

Про тююнибё в этом сериале было только пятнадцать секунд вступления.
– Знакомо ли вам слово “тююнибё”, господа? Да-да: та самая ужасная и удивительная болезнь, что поражает молодёжь примерно к восьмому классу средней школы – когда проснувшееся вдруг сознание своей индивидуальности вкупе с неистово пылающим воображением заставляют школьников вести себя – ну вы знаете, как. В жизни не читавший ничего, кроме манги, школьник признаёт теперь только английские оригиналы книг. А другой из принципа пьёт только кофе без молока, хотя на вкус одно от другого не отличит. Третий считает, что у него магические способности, и целыми днями только о своих фантазиях и говорит. Ну вот и наш герой…
…увы, не имеет ко всему этому никакого отношения.
КОНЕЦ.

Навальный собирает деньги. Пост интересный.

Wakan

Wakan 1.80.8 переводит 1 мегабайт текста за 4 секунды!
Стабильная версия, 1.67, на него же тратила 26.5 минут.

Ещё он понимает Аозора-Руби. Можно вставлять текст в таком: 大人《おとな》びた雰囲気 – формате, и вот эти скобочки превратятся в подпись над 大人. А ещё Вакан может сохранять свой собственный автоматический перевод в виде руби! Это значит, что можно загрузить книжку, нажать “Auto-Translate”, и Вакан расставит чтение всем тем словам, которые вы ещё не выучили. И эту книжку потом можно читать в любой из тысяч поддерживающих руби читалок, и слова будут подписаны!

Прототип / Primer

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

Научно-фантастическая головоломка с машинами времени – это очень круто.
Но, к сожалению, Праймер – это не очень круто.
Потому, что у него отсутствует “научно-фантастическая” часть.

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

“Я специально не дал этому объяснения”, – говорит режиссёр, – “Герои тоже не знают ответа. Я хотел показать, что они запутались, не понимают, почему и что происходит”.

Ну здравствуйте! Либо дудочка, либо кувшинчик. Либо фильм о том, как чувствуют себя путешественники во времени – либо головоломка. Праймер очень непонятный фильм, и только одно заставляет разбираться в нём: наличие правильного ответа. Такого, при котором каждому факту найдётся место.

Этого ответа в Праймере нет. В глубине своей Праймер – гуманитарный, а не естественно-научный фильм. Это студент филологического факультета, который выучил все термины математики и в каких сочетаниях их можно использовать. Его слова нельзя сразу отвергнуть, как чушь. Возможно, он гений. Либо просто говорит что попало. Праймер – второе.

Похожее чувство было от Remember11, но там… Но там Remember11! Там нашёлся правильный ответ. Неожиданный, сложный, но действительно объясняющий всё, и даже мелкие детали, на которые без него не обращаешь внимания. Пятьдесят на пятьдесят, что авторы его и имели в виду.

Раз два, раз два, раз два

Сегодня международный день проверки микрофона: 12.12.12.
А 20-го будет международный день перемены порядка байт: 2012.12.20.

Марш 15-го декабря

Мне кажется, власти идиоты. Они не согласовали марш ни по какому маршруту.
Достаточно было его согласовать – и никто бы не пришёл, потому, что митинги всем надоели. А теперь народу будет в несколько раз больше, чем могло бы быть.

Если же не считать, что власти идиоты, то этот ход – одно из двух: либо наступление, либо поддавки.
В первом случае власти хотят закрепить успех. Они надеются, что люди сломлены, и не чувствуют за собой силы, а потому под запретом марш окончательно угаснет. Если это случится, власть победила.
Во втором случае оппозиции брошена приманка, на которую мы должны клюнуть: собраться толпой и что-нибудь натворить. Это нужно, чтобы выставить нас дикарями в глазах “зрителя телевизора”, или чтобы получить формальный повод на дальнейшие санкции.

Тогда как действовать?

Нельзя приходить на марш “с разных сторон”, как хотят лидеры, это ошибка. Перекрыть все подходы к Лубянке не сложнее, чем перекрыть один подход. А люди разбредутся кто куда, и марша, проявления силы, не случится. Мы проиграем по пункту один.
Хорошо бы двигаться единой колонной, без транспарантов и слоганов, просто в форме прогулки, от точки к точке. Если на пути встаёт полиция, всем вместе двигаться в любом свободном направлении. Тогда будет меньше формальных поводов кого-то арестовать и арестованных будет сложнее очернить.

Даже отъявленные лжецы должны на чём-то строить свою ложь, иначе они не смогут поверить в неё. Им будет сложнее врать про “нарушал общественный порядок”, если мы будем предельно вежливы и неконфликтны. Никакой революции, просто прогулка.

Но гулять – мы имеем право.

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

Тогда нарушителей не будет, но автозаки в два счёта будут забиты. Людей – больше, чем автозаков.

Отаку-ко ацумарэ!

С тех пор прошло два года, так что надо бы эту историю рассказать.

Кирино, Куронеко и Саори в “Имоте” познакомились через японский вконтактик, создав группу “Девочки-отаку, объединяйтесь!” И вот, летом 2010-го показывали этот сериал, а зимой мне однажды было скучно, и я решил созвать сходочку Ычана.
Но не в /b/, а в /a/ – я хотел созвать анимешников.
И назвал тему, конечно, “Девочки-отаку, объединяйтесь!”

Логика тут была следующая. Во-первых, понять референс к имоте могут только хорошие люди. Во-вторых, если правда придут девочки, что, я буду жаловаться?

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

Тема не утонула, народ в ней общался, и человек пять-шесть даже собрались идти на встречу. Мы договорились встретиться у выхода на Лубянке.
А дело было зимой. Надев пальто, я поехал по холодной Москве к месту встречи… и приехал последним.

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

Можно уже догадаться, чем кончилось.
Пришёл один человек.

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