Позднее Ctrl + ↑

Disco House?

Надо сказать, что некоторое погружение в клубную культуру и ночную жизнь — оно положительно сказывается на. Потому, что благодаря этому я знакомлюсь с людьми, которые, например, слышать не слышали про psychedelic trance, а сами играют то, чего слышать не слышал уже я. И вот, эти знакомства становятся полезными с музыкально-образовательной точки зрения. Например, сегодня мне подарил свой промо-микс DJ Zenkoff (резидент Театро), что было, безусловно очень приятно, но учитывая, что это диско-хаус, я сначала подумал, что слушать это я не буду. Каково же было моё удивление, когда я обнаружил, что слушаю его уже третий раз и хочу ещё!.. А завтра, если всё будет хорошо, я начну знакомиться с миром техно.

Автообновление в e2: технология

Я уже писал о том, как работает автообновление в e2. Однако там я говорил о пользовательском experience, а не о технической реализации. Сегодня расскажу о том, как это всё работает изнутри. (Сразу скажу, что работает это весьма успешно, несмотря на то, что реализовано очень коряво.)

Стержнем всей системы является файл verlog.txt, который я тут усердно веду, вписывая в него каждое изменение. Эта страница на сайте e2 генерируется именно на базе файла verlog.txt. Помимо текстового описания обновлений в нём содержится информация о том, какие файлы изменились в данной версии (если этого не указано, значит изменился только core.php). Когда e2 обращается к серверу за информацией о доступных обновлениях, он передаёт ему свою текущую версию, а сервер отвечает куском верлога от его версии до последней доступной.

Например, вы пытаетесь обновиться с v1099; последняя доступная версия сейчас — v1109. Вот, посмотрите, что выдаёт сервер. Если хотите, можете это unserialize’нуть и print_r’нуть. Дак вот, теперь e2 знает, что качать. Сами файлы последнего дистрибутива всегда лежат по адресу e2.ilyabirman.ru/download/updates/путь-к-файлу. Если вы вдруг хотите посмотреть, как в последнем дистрибутиве выглядит design_single_note.php, то возьмите и посмотрите. Теперь e2 попытается скачать все файлы, которые изменились между вашей версией и последней доступной. Если хотя бы один файл скачать не удалось, либо скрипту осталось выполняться меньше 5 секунд, то обновление отменяется. Если же всё хорошо, то старые файлы заменяются новыми.

После этого начинается самое интересное. При генерации следующей страницы e2 видит, что его версия больше той, которая прописана в реестре (при установке и после окончания обновления движок прописывает в реестр собственную версию). Это значит, что новое ядро выполняется в старой среде. Тогда запускается служба perform_update, задача которой состоит в том, чтобы выполнить все остальные действия по обновлению e2: изменить структуру БД и реестра или, например, удалить файлы, которые больше не нужны. Но откуда она знает, что именно нужно делать?

Дело в том, что эта служба сама уже выполняется из нового core.php. А каждый core.php, так уж получилось, знает, чем он отличается от всех предыдущих. Я знаю, что это коряво, но работает — и это главное. То есть, ещё раз, в самой службе perform_update просто-напросто написан примерно вот такой код:

...
if ($from < 894) { /* Делаем одно /* }
if ($from < 932) { /* Делаем другое */ }
if ($from < 1026) { /* Делаем третье */ }
...

Поскольку такого рода изменения нужно вносить не очень часто, то эти строки не так уж сильно увеличивают размер core.php, но всё-таки увеличивают. Начиная с версии v1027 e2 больше не умеет автообновляться с версий, выпущенных до Release 1:

v1027. e2 больше не будет автообновляться с pre-release-версий (то есть, если у вас стоит e2 v850 и более ранних, то обновляться теперь придётся вручную). Это позволило выкинуть из кода около 9 килобайт мусора, который оставался только для возможности такого обновления. Просто предполагается, что это никому давно не надо.

Напомню, что система обновления в e2 работает начиная с v294. Для диапазона v294...v850 9 килобайт — это не так страшно.

После того, как все эти if’ы пройдены и все изменения сделаны, в реестр прописывается новая версия e2, поэтому следующая генерация страницы уже не приведёт к вызову службы perform_update.

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

Во-первых, проблемы могут возникнуть во время замены старых файлов новыми. Пользователь мог не прочитать инструкцию и забыть прописать права 777 ко всем файлам и папкам e2. Если не удалось заменить ни одного файла, то это ещё хорошо — тогда просто не получится обновиться. А что произойдёт, если удалось обновить только часть файлов? Этого никто не знает. Конечно, в этом случае всегда можно сказать: «надо было читать документацию». Это явно не самое лучшее решение. Да и вообще, это могла быть не вина пользователя, например, во время обновления отключили электричество.

Во-вторых, проблемы могут возникнуть во время работы perform_update. Например, несколько if’ов были успешно пройдены, а потом в каком-нибудь произошла ошибка. В этом случае в реестре останется прописана старая версия e2, поэтому при следующем вызове все if’ы, включая успешно пройденные, будут проходиться заново. Это почти наверняка не страшно, так как там не делается никаких действий, которые нельзя было бы сделать 2 раза подряд (например, если дважды записать в реестр одно и то же значение, хуже никому не будет, а дважды добавить в таблицу одну и ту же колонку просто не даст сама СУБД). Но это очень коряво.

В будущих версиях я думаю немного улучишить всю эту схему. Во-первых, я хочу, чтобы код для perform_update не входил в core.php, а скачивался с сервера обновлений вместе с самими новыми файлами. Потому, что в ядре ему делать нечего. Во-вторых, я хочу, чтобы e2 вёл журнал процесса обновления и, в случае, если он был прерван, мог продолжить его с того же места. В-третьх, я хочу, чтобы в ситуации, когда движок находится где-то в середине процесса обновления, все режимы кроме login и все службы кроме login и perform_update падали в STOP, а perform_update выполнялась только если пользователь залогинен.

К сожалению, когда я придумывал схему автообновления для e2, я не предусмотрел возможность обновления самого кода системы автообновления без обновления всего остального. В Windows, например, такая штука есть. Помните, когда вы заходите на Windows Update, вам сначала предлагают скачать последнюю версию самой обновлялки? e2 так не умеет, поэтому обновляться до каждой следующей версии приходится средствами предыдущей, что иногда сильно осложняет задачу.

Так что вот, учитесь на чужих ошибках, пока дают!

Под фанеру

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

Хит продаж

Возможно, вы замечали, что всевозможная лапша быстрого приготовления обычно идёт в куче разных вариантов. На упаковке написано «со вкусом свинины», «со вкусом курицы», «со вкусом грибов»... Я подумал, что хитом продаж должна стать новая лапша с надписью «со вкусом лапши». На упаковке должны быть крупно написаны слова «впервые», «наконец-то», «долгожданная» и так далее. Лапша со вкусом лапши! Представляете?

Знаки валют: исправление

Пришло письмо от Артемия Лебедева, в котором он указывает мне на мою неправоту. В своей заметке «Знаки валют» около 7 часов назад я утверждал, что:

Знаки валют всегда и везде ставятся перед числом

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

Пример: Mac Mini за 529 евро

В поисках подтверждений, я полез в свои фотографии, сделанные в Германии, и обнаружил ещё один пример:

Ещё один пример того, что знак евро ставится после суммы
Не самая лучшая фотография, но ведь я же не ценник фотографировал

Таким образом, становится очевидно, что я был неправ, утверждая, что знаки всех валют ставятся перед суммой. Обратите внимание на это и вы. В своей заметке я исправил «знаки валют» на «знак доллара», чтобы быть правым до конца.

Знак доллара

В новом параграфе Лебедев пишет, что лучший знак рубля — сокращение «руб.», написанное через пробел после числа. С этим трудно не согласиться.

Если бы он ещё понял, что знак доллара нужно ставить перед числом без пробела, так как он не является сокращением «долл.», цены бы ему не было.

Ну, вы ведь знаете, что Лебедев утверждает, будто по-русски нужно писать не «$100», а «100 $»?

Как бы соблазнительно ни выглядел доллар слева от суммы, писать его в русских текстах можно только справа. В русском языке единица измерения, стоящая перед значением, означает примерно столько: «долларов сто».

Лебедев не понимает, что $ — это знак, а не сокращение. Когда написано «$100» я это читаю «сто долларов», и мне нисколько не мешает, что знак $ стоит перед числом. И ни одному человеку в мире это не мешает. Знак доллара всегда и везде ставятся перед числом, и без пробела; если после знака не идёт число, он смотрится дико, и прочитать его в таком подвешенном состоянии невозможно.

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

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

Знак $ придумали не мы, и не нам решать, как им пользоваться. Он должен использоваться только так, как это принято в мире и никак иначе. Хочешь писать «чисто по-русски» — не используй этого знака вообще, его нет в русском языке. Иначе с такой адаптацией под русский язык можно ещё, например, начать знаки ® и ™ ставить перед указанием названия, чтобы по-русски читалось удобно: «зарегистрированный товарный знак Кока-кола», «торговая марка Windows Vista».

Но постойте, Лебедев не просто хочет писать $ после числа, он ещё и хочет отделять его пробелом! И вот как он аргументирует своё требование этого уродливого пробела:

А не писать пробел перед знаком доллара, это все равно что писать 50руб. Так себе может позволить упражняться в типографике только продавщица продмага с трафаретом и шариковой ручкой.

Логика здесь отсутствует напрочь. Во-первых, как я уже сказал, знаки и сокращения — это разные вещи. Во-вторых, как тогда объяснить тот факт, что «100%» пишется слитно? Следуя указанной логике, можно прийти к абсурдному выводу, что это «всё равно, что писать „100процентов“». Бред, не правда ли?

Поэтому, читая параграфы Лебедева, не всегда стоит верить ему на слово.

Добавлено позднее: Продолжение истории

Загадка

Начну издалека.

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

Например, легковой автомобиль — это такой автомобиль, который легковой. Ага. При этом важно, что легковой автомобиль является автомобилем. Или, например, Красная площадь. Красная площадь — это площадь. Офицерская линейка — это линейка. Фрезерный станок — это станок. То есть, рассказывая о том, что такое фрезерный станок, можно начать со слов «Фрезерный станок — это станок, который...»

Удивительно то, что попадаются вещи, для которых это не работает. Телефонная трубка — это не трубка. Нижний Новгород — это не Новгород. Отбойный молоток — это не молоток. Макароны по-флотски — это не макароны. Морская свинка — это не свинка. Об одной из таких удивительных вещей мы сегодня и поговорим. И эта вещь — стол справок.

Понятно, что стол справок — это никакой не стол. Стол справок чаще всего представляет собой кабинку с окошком. Внутри этого стола справок сидит, например, девушка. Её роль в этой всей истории — сидеть и давать справки.

Зададимся вопросом: на чём же она сидит, эта девушка? Что же это такое, на чём она сидит? Ответ вполне очевиден — это стул справок. Однако, если стол справок — это не стол, то ведь может так оказаться, что и стул справок — это вовсе не стул. Но что же это, в таком случае?

Вот так загадка!

Ранее Ctrl + ↓