Author Archives: himself

Токио – день первый

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

Про Японию: вы не поверите, насколько здесь всё правильно и качественно. Я не поверил. А я заранее знал! Если окно в поезде, то белоснежно белое, если стекло, то абсолютно прозрачное. Стыки заклеены резинкой, даже шва не видно. На каждой конечной поезд моют. У нас даже в новых поездах тут дырень, тут прокладка неплотно прилегла, тут обшарапано, тут кто-то расписался для потомков.

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

Япония – это наша несбывшаяся мечта, Союз Советских Капиталистических Республик. (далее)

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

У нас если надо – протопчут тропинку, в Японии, похоже, ни одна тропинка не появляется сама собой, а если появляется, её замечают, продумывают, добавляют на план, укрепляют, ставят поручень, ступеньки, и назначают там ежедневную уборку. Сколько я ехал и смотрел за окно, ни одно место не выглядело самопроизвольным. Даже лес растёт по какому-то высшему плану и сам себя подравнивает. Посреди поля стоит никому не нужная ограда, так на ней искусственно выращивают плющ, чтобы это была не “никому не нужная ограда”, а “офигенная внезапная ограда с плющом среди поля”.

С другой стороны, Токио не выглядит мегаполисом. Да, тут офигенно много людей. Гигантские транспортные хабы, каждая станция – это подземные и надземные миры какие-то целые, то восемь подземных ярусов с разными ветками, то огромные коридоры с выходами на разные платформы. Но.

Представьте себе деревню. Узенькие улицы, сплошные пешеходы, изредка проедет повозка, останавливаясь каждые два шага. Городская площадь с тремя магазинами.

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

Общаться по-японски ещё сложнее, чем я думал, а ведь я заранее опасался. Обычно меня понимают, но с непривычки я всё время сбиваюсь на английский, и получается такое месиво! Хотя обычно реагируют очень вежливо и с готовностью бросаются на помощь – найти, куда выкинуть бутылку из-под колы (тут всё выкидывается в разные места), подсказать, где нужный мне адрес (в Японии омега ультра глупая система адресации), объяснить, как в их магазине заказывают собу. Пара человек меня испугались, ну как же, я лысый и опасный.

Иногда долго не получается что-нибудь объяснить. Например, один человек в магазине ранобе не понимал Нисио Исина. Я ему:
– Нисио Исин но хон ва доччи но section десё ка?
– Хай??
– (ок, упрощаю) Нисио Исин.
– Хай??
– Сакуся, Нисио Исин?
– Хай???
Тут пришёл помощник и сразу всё понял. Но этот человек тоже был хороший, он мне на другой вопрос понятно ответил.

Покупаю переходники. Ах да, в Японии ВНЕЗАПНО какие-то клинические розетки из Ада. Только у меня успело всё разрядиться, как приезжаю я в отель, а там штепсель воткнуть некуда. Пришлось ехать в Акибу прям в первый день.
Говорю продавцу: бла-бла, так и так, приехал, у вас тут переходники, не могу зарядить (фраза была умной, меня Эйен научил, как говорить. Я бы сам не сочинил!)
Продавец: Ага, во. (Даёт переходник. Подходит!)
Я: Ёццу кудасай! (Четыре дайте)
Продавец даёт одну.
Я: Ёццу. Ич ни сан ши.
Продавец кивает и даёт одну.
Я ему: ОК, чётто матте, МИРО. (Достаю с полки ещё три штуки и даю ему доп. деньги).
Продавец согласен. Ну и то хорошо.

Поскольку нужда привела в Акибу, гулял по Акибе. Там просто ФЕЙСПАЛМОВЫЕ объёмы аниме-рекламы и магазинов. Отовсюду какая-то анимешная музычка, здания под десятиэтажные потолки забиты анимешными товарами, на стенах висят гигантские плакаты. Отаку во все поля. Иностранцев полно.

Нашёл здание, в котором каждый этаж посвящён какому-нибудь извращению, ну например, третий этаж – использованные трусы. И так десять этажей. Там на окнах написано. Я дважды прошёл мимо, но зайти не рискнул.

В другом здании два этажа были рыбачьи автоматы, тут их называют “UFO catcher”. Просадил тыщи 4 йен в них (это тыщи полторы рублей). Уж такие там хорошие призы, анимешные. И улитку из баке хотелось получить, и эту из кейона, ну вы сами знаете, какую. Но фиг там, ничего вытащить вообще нельзя. Но автоматов очень много, и какой только тематики нет, так что ходишь-ходишь, и опять на что-нибудь прикольное натыкаешься. В итоге я только брелок простенький с баке-Ханекавой вытащил.

Вообще всё это здание было забито игровыми автоматами. На других этажах игры друг против друга, или вот автоматы, где синхронно под музыку танцевать надо. Я не рискнул.

Был в Yellow Submarine, там продают карты типа Magic the Gathering и фигурки для сборки-склейки, так два этажа. Ничего особенного, хотя знамениты.

Akihabara Radio Kaikan сейчас почему-то лишена своей знаменитой надписи над входом, хотя на крыше всё равно гордо написано “Секай но АКИХАБАРА РАДИО КАЙКАН”, а снизу ещё и переведено: “Akihabara Radio Kaikan OF THE WORLD”, да.

И вот, иду я по такой всей анимешной и громкой Акихабаре, и тут из-за левого плеча в громкую связь говорят:
“В нашем магазине вы можете купить электронику, товары для быта, музыкальные и DVD проигрыватели и многое другое. Ждём вас со стольких по стольких в павильоне таком-то”.

И я сначала не понимаю, что это у меня вдруг электричество в голове пробки выбило. Ну реклама и реклама. А потом берусь за голову и оглядываюсь, потому, что до меня доходит, что она НА РУССКОМ. Причём на хорошем русском, звучит ну ровно как обычное объявление в московских моллах.
Что там делала реклама на русском – я до сих пор не знаю.

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

Билет нужно вставлять на входе и на выходе, и если ошибся, на выходе можно билет докупить на требуемую сумму, либо допродать, наверное. Не проверял, но японцы такие правильные, что должно быть можно. А когда билет на выходе прикладываешь, то его сжирает, и билета не остаётся – и никаких сувенирчиков.

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

Пока всё, завтра на Комикет пойду, тогда заодно и о магазинах ранобе расскажу.

ОглавлениеКомикет – часть 2 ->

Ангел Дураким

Какие интересные подробности у появления церкви мормонов! Оказывается, мормонскую библию продиктовал в 1823-м году ихнему пророку “Angel Moroni“. Кто не в курсе, “Moron” по-английски “кретин”. А “Moroni” – не совсем грамматически правильное множественное число от “moron”.

Тут уже становится любопытно, а не содержит ли и само слово “mormon” такого же скрытого послания?

И ещё одно. Читая про мормонов, увидел такую картинку:

Почему пророк в костюме, а ангел в одеяниях? Чтоб выглядел “по-ангельски”? Так их раньше рисовали в накидках потому, что все ходили в накидках! Ангелы от людей не сильно отличались. По логике, ангелы в наше время должны быть в современной одежде и подстрижены коротко. Они же от бога прилетели, а не из прошлого! У бога на небе не “вечная древняя греция”.

Что же мне делать, что же мне делать, чтожемнеделать, через 10 часов самолёт, надо что-то решать :)
Вроде я себя чувствую получше после амоксициллина.

Отличные новости

Похоже, у меня нет метастаз в лёгкие, это просто пневмония :) </sarcasm>

День, когда WordPress подавился метадатой

Сегодняшняя история програмистская. Кому компьютеры скучны, можете смело пропускать.

Как все знают, у меня есть отдельный блог на boku.ru. Записи туда по большей части копируются отсюда – в виде исключения я пару раз выложил там скучные рассказы, чтобы включить их в архив, но не афишировать.

Блог сделан на WordPress. Копирование записей устроено так: специальный скрипт генерирует RSS из дневника на Diary, а плагин FeedWordPress забирает RSS и импортирует в WordPress.

Категории при этом сохраняются, внутренние ссылки мой собственный плагин заменяет на местные, а если пост на дайри изменился – изменяется и пост на boku.ru, так что всё устроено достаточно удобно.

Но есть проблема. (далее)

Код FeedWordPress выглядит примерно так:

function WhatToDo(post)
  localPost = FindLocalCopy(post);
  if localPost==null then
    //New post!
    AddPostMeta(localPost, 'syndication_item_hash', post.Hash);
    return doCreateNewPost;
  else
  if not FindMeta(localPost, 'syndication_item_hash', post.Hash) then
    //Post changed!
    AddPostMeta(localPost, 'syndication_item_hash', post.Hash);
    return doUpdatePost;
  else
    //No changes.
    return doNothing;

Если пост на дайри не менялся, FeedWordPress не будет заново его импортировать и не создаст новой ревизии местного поста. Это хорошо. Но перед тем, как записать пост в базу, WordPress прогоняет его через ряд плагинов, которые меняют его содержание:
Пост на дайри (из RSS) –> (замена ссылок на местные) —-> (исправление форматирования) –> Пост на boku.ru

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

Но как это сделать? Ведь пост уже импортирован, и с точки зрения FeedWordPress, его содержимое не менялось (на дайри он остался тем же).

Для этой цели я влез в файлы FeedWordPress, и временно покромсал описанную выше процедуру. Она стала выглядеть так:

function WhatToDo(post)
  localPost = FindLocalCopy(post);
  if localPost==null then
    //New post!
    AddPostMeta(localPost, 'syndication_item_hash', post.Hash);
    return doCreateNewPost;
  else
  if not FindMeta(localPost, 'syndication_item_hash', post.Hash) then
    //Hack: Post is always changed!
    AddPostMeta(localPost, 'syndication_item_hash', post.Hash);
    return doUpdatePost;
    //TODO: Restore normal version.

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

Поправив таким образом FeedWordPress, я залил новые файлы на сервер и стал искать баг в своих плагинах. И нашёл. Исправил. Убедился, что теперь посты преобразуются правильно. Всё сохранил, применил, закрыл… а отключить хак забыл.

И ушёл.

Вторая половина этой истории началась через месяц, когда я зашёл на блог на boku.ru. Все страницы с последними постами не работали.

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

php error: maximum memory allocation exceeded

Какой-то из скриптов жрёт память? Но почему? Что я менял?

И тут я вспомнил, что забыл отключить хак.

Но постойте, а что такого? Проверки раз в полчаса – это 48 проверок в день, жалкие полторы тысячи ревизий за месяц. WordPress может обслуживать десятки тысяч постов, для MySQL лишние несколько тысяч ревизий – пустяк.

Если я напишу ещё полторы тысячи постов – вордпресс даже не поперхнётся. А полторы тысячи ревизий вывели его из строя?

Да ну! Не так он написан.

Тогда почему любая страница, которая обращается к последним постам – вылетает с переполнением памяти? База данных находится на диске – что вообще вордпресс грузит в память?

Метадату.

Каждый раз, загружая очередной пост для печати, вордпресс делает примерно следующее:

rows = exec_sql('SELECT * FROM post_metadata WHERE post_id=id');
while rows.MoveNext() do
  metadata[rows['name']]=rows['value']

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

Обычно таких записей 8-10, иногда до 15 – мелочи, в общем.
У последних записей в моём блоге их было по 60 000.

Ничего удивительного, что обращаясь к этим записям, вордпресс падал. Он не рассчитан на 60 000 записей метадаты у поста. Удивительно, откуда эти записи взялись.

Я открыл таблицу phpMyAdmin-ом, и увидел, что все они – это копии параметра syndication_permalink. Тогда всё стало ясно.

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

Да, импорт RSS происходит лишь раз в полчаса, 48 раз в сутки, и каждый пост импортируется лишь однажды – но функция проверки WhatToDo вызывается десятки раз за процедуру одного импорта. Только однажды её результат имеет значение, поэтому ревизий в базе действительно создано лишь полторы тысячи – но при каждом вызове она добавляет syndication_permalink, и этих пермалинков, совершенно одинаковых, у одного поста набираются десятки тысяч.

Ирония: вордпресс мог бы вынести десятки тысяч постов – но не десятки тысяч свойств поста.

Как всё это чинить?
Итак, испорчена таблица post_metadata: в ней для некоторых постов некоторые записи продублированы десятки тысяч раз. Нужно удалить дубли, но оставить по одной копии каждой записи.

После некоторой возни и гуглинга сотворился следующий манёвр:

CREATE TABLE `keep_ids` AS (
  SELECT MIN(`rowid`) AS `rowid` FROM `post_metadata` GROUP BY `postid`, `name`, `value`
)

Этим запросом мы находим все цепочки дублей (записей с одинаковыми данными в полях postid, name и value), и в каждой выбираем наименьший номер записи. Таким образом, мы получаем по одной копии каждой уникальной записи. Эти копии надо сохранить, а всё остальное удалить.

ALTER TABLE `keep_ids` ADD UNIQUE INDEX `rowid` (`rowid`)

Это чтобы операции с новой таблицей были быстрыми – сейчас понадобится.

DELETE FROM `post_metadata` WHERE `rowid` NOT IN (SELECT `rowid` FROM `keep_ids`)

Удаляем все записи из исходной таблицы, которые не вошли в наш “список на сохранение”. Если б в `keep_ids` не было индексов, мы бы тут завязли на несколько минут, а так – только секунд.

Ну и, наконец, удаляем временную таблицу:

DROP TABLE `keep_ids`

Победа! Число записей в post_metadata резко падает с сотен тысяч до 13 000 и блог снова работает нормально.

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

Ну вот, похоже, девятого числа я еду в Японию. Хотя чувствую себя по-прежнему нехорошо (после последней химии). Надеюсь, всё в ближайшие дни как-нибудь разрешится: либо мне резко станет лучше или хуже, либо придут результаты каких-нибудь анализов, которые любые путешествия исключат, и т.д. и т.п.. А то непонятно как-то.

В Токио я буду неделю, при этом попадаю на летний комикет (10-12) и, возможно, Обон (15 августа, но в Канто 15 июля, короче, я ничего не понял, разберусь ближе к делу).

Надо вспомнить все места, которые я хотел посетить. Подскажите что-нибудь интересное. Пока помню:
– Комикет
– Акибу
– Синдзюку
– Токийскую башню
– Сибую
– Это место где продают отоме-игры (забыл место)
– Посмотреть на Токийский залив
– Обон

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

Ещё аниме пачками

Kokoro connect – ещё пять школьников открыли кружок времяпровождения.
Binbougami ga! – ещё один сверхъестественный кто-то поселился в доме у кого-то.
Jinrui wa suitai shimashita – что-то из ноитамины, очередной непонятный мир будущего, мало сюжета, все такие необычные девочки, феечки, какая-то соц. сатира (но в сто раз менее едкая, чем в зецубо сенсее), в общем, кому-то может понравиться… скорее, девушкам.
Sword Art Online – чуваки зашли в виртуальную реальность и не могут выйти. Капля интереса в завязке есть, но похоже, впереди просто 13 серий приключенчества.

Получил свою японскую визу

Выглядит как радужная наклейка во всю страницу загранпаспорта.
Заодно сравнил последнее фото с тем, что на загранке (circa 2010). Два года назад я был вежливый молодой человек, а сейчас бандит какой-то лысый :)

Я не уверен!

Попробуйте быстро ответить на вопрос, в ответе на который не уверены до конца:
– Ты дома свет выключил?
– По-моему, да.
Не годится! “По-моему” – это сокращение от “по моему мнению” (“По-моему, Пупкин – плохой президент”), а какое уж тут мнение? Либо выключил, либо нет.

– Кажется, да.
Не годится! “Казаться” могут предметы вдалеке (“Кто это там на эшафоте?” – “Ба! Кажется, Пупкин”), ну в крайнем случае, будущее (“Кажется, Пупкину кранты”), но никак не прошлое! Где это оно “кажется” (показывается)?

– Вроде бы да.
Не годится! “Вроде” значит “похожего рода, сорта” (“Чья это дача?” – “Вроде бы депутата какого-то”). Вы же со светом поступили вполне определённо, либо выключили, либо нет.

– Полагаю, да.
Не годится! Полагают верным то, на чём строят дальнейшие рассуждения (“Полагаю, здесь теперь не искупаться, так что надо искать новый пляж”). А тут речь о ваших сомнениях, а не предположениях.

– Наверное.
Не годится! Какое же это “на верное”, когда вы не уверены? Правильное употребление: “Почему стоим?” – “Наверное, депутата везут.”

– Возможно.
Не годится! А то мы не знали, что это возможно! Правильное употребление: “Возможно, будет революция”.

– Видимо.
Что это вам “видимо”, когда дом далеко-далеко? Правильное употребление: “Что солдаты там делают?” – “Видимо, охраняют мир и порядок.”.

– Скорее всего.
А что, было соревнование в скорости выключения света? Правильно – указать на событие, которое случится прежде любых других: “Скорее всего, президент выступит с заявлением.”.

– Да выключил я, выключил, отвяжись от меня!

К слову о масштабах

Все помнят милую но правдивую шуточку Watch out Diablo III, this game might outsell you?

К слову. Как-то раз Сергей Лукьяненко – тот самый Сергей Лукьяненко, наш самый известный и продаваемый фантаст – упоминал тиражи. В другой раз Борис Акунин – тот самый Борис Акунин, которого читал любой интеллигент – говорил об экспериментах с псевдонимами, и тоже сказал пару слов о продажах. Короче, 400-500 тысяч – это очень неплохой итоговый результат для знаменитого автора в нашей огромной стране.

К настоящему времени было продано 4 миллиона книжек Ореимо.

Остановитесь на секунду и задумайтесь. Это не книги звёзд государственного масштаба, таких, как Акунин или Лукьяненко. Это даже не Харухи, в которой хоть сюрприз фантастический был (Харухи продано 10 миллионов). Мы тут все знаем, что такое Ореимо. Простенькая детская книжка – ну да, тёплая и ламповая. Каждый том этой глупенькой ерунды, которую и за серьёзную литературу-то никто не считает, продавался так же, как очередной “Дозор” Лукьяненко или “Фандорин” Акунина. И так десять томов.