Оглядываясь на шахматы на sed (SedChess) ★
Это информационный пост, больше для себя. Для того, чтобы не забыть выводы и ощущения от сделанного.
Несколько месяцев назад я написал шахматы на утилите «сед», ненадолго заинтересовав публику. Особенно доставляли комментарии на «Реддите» — кажется, я поддержал имидж русских программистов, как людей для которых нет ничего невозможного.
Пара комментариев оттуда:


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

Ещё один плюс — мне много пришлось поупражняться в борьбе с собственной ленью и желанием бросить проект, когда я встречался с трудностями, которые казались непреодолимыми или заставляли переделывать половину проекта.
Конечно, мной двигали вовсе не рациональные побуждения, а желание сделать
Тяга делать
Локальные переменные
В прошлом я несколько лет программировал на Перле, очень любил этот язык и неплохо знал, до сих пор могу без особых проблем читать программы на нём. Прошло немало лет, наиболее часто я теперь использую ПХП и Джаваскрипт, на Перле не пишу вовсе (хотя в «Яндексе» был краткий эпизод — написал небольшой пример для документации
Вообще я сейчас считаю, что будущее скорее за языками с лаконичным синтаксисом (Пайтон), чем за тем, у кого он сверхнасыщен (Перл, Руби).
Тем не менее, некоторых вещей из Перла мне до сих пор нехвает в других языках. Я научился без этого обходиться, но много лет меня не отпускает чувство, что у меня
Например, локальные переменные. В ПХП часто приходится смотреть (особенно, если достаётся
В Перле такой проблемы нет — там локальную переменную можно создать почти в любом месте, произвольном месте кода, просто поставив фигурные скобки — так создаётся новый лексический блок, у которого могут быть свои локальные переменные:
my @a = (1, 2, 3);
my @b = ('a', 'b', 'c');
for my $i (@a) { # первая переменная $i
for my $i (@b) { # вторая переменная $i, перекроет первую только внутри цикла
print $i . "\n";
}
{
my $i = 'end'; # третья переменная $i, перекроет первую только в этом блоке
print $i . "\n";
}
print $i . "\n"; # выводится первая переменная $i
}Конечно, я не призываю именно так писать код — во вложенных циклах с одной и той же переменной легко запутаться, просто иллюстрирую принцип.
В Джаваскрипте ситуация меняется, появилась конструкция «let» (впрочем, раньше её можно было эмулировать), а ПХП ничего похожего так и нет. Я переписывался с разработчиками много лет назад на эту тему, но воз и ныне там.
Сейчас есть возможность опубликовать предложение, описав его в виде RFC — эта новая процедура появилась недавно, если предложение понравится, то синтаксис имеет все шансы попасть в язык. Надо будет
Казань ✈ Москва ✈ Шри-Ланка ✈ Москва ✈ Казань

Тридцатого декабря полетим праздновать Новый год
Если вы были
Кстати, удобнее всего рейсы из Казани и в Казань у «Татарстана», мы их брать, естетственно, не стали. В одну сторону полетели «Аэрофлотом», в другую — «Трансаэро».
Небритябрь

Про Небритябрь я узнал из видеоблога Стаса Давыдова («This is ХОРОШО»). Смысл простой — на весь ноябрь нужно прекратить бриться.
У Небритября есть
Сплошные неудобства, сейчас я не бреюсь уже из принципа, раз ввязался, но, кажется, начал привыкать. Чего доброго, когда всё закончится оставлю всё как есть, только щёки побрею.
Проблема в стемере для PHP
В модуле stem для ПХП обнаружилась неожиданная проблема. Этот модуль — стеммер, позволяющий обрезать окончания слов для того, чтобы искать потом по тексту без учёта падежей и склонений.
Для русского языка в нём целых две функции — для кодировки
Я обратил внимание, что из командной строки код с этим модулем работает нормально, а в рабочем проекте кодировка портится — как будто стеммер
У меня возникла мысль, что дело в выставляемой локали, мы провели эксперимент — так и есть, дело в этом. Такой код работать правильно не будет:
setlocale(LC_TIME, 'ru_RU.cp1251');
echo stem_russian_unicode(iconv('windows-1251', 'utf-8', 'Приветы'));Кодировка получится битой. Перед вызовом функций стеммера нужно переставлять кодировку (setlocale)
// файл stem.c
php_strtolower(z->p, arglen); // ← вот искомый вызов
stem(z);
z->p[z->l]= '\0';
// … ищем эту функцию в исходниках PHP…
// string.c из PHP
PHPAPI char* php_strtolower(char * s, size_t len) {
unsigned char *c, *e;
c = (unsigned char *)s;
e = c+len;
while (c < e) {
*c = tolower(*c); // ← а это проблемное место
c++;
}
return s;
}Согласно манам, функция tolower ориентируется в своей работе на локаль, в этом и проблема.
Ограда от зайцев

Вчера был на станции метро Царицыно в Москве, посмотрите как работники метрополитена решают проблему «зайцев», прыгающих через турникеты. Я так же вчера был ещё на нескольких станциях (Комсомольская, Новые Черёмушки, Парк Культуры), более такой модификации турникета нигде не видел.
В Казани разбился самолёт
Тут у меня много читателей, которые знают, что я часто летаю по маршруту Казань—Москва. Думаю, надо сообшить, что на сегодняшнем рейсе авиакомпании «Татарстан»
Есть версия ошибки экипажа, самолёт разбился на третьей попытке посадки (ударился носом о землю), примерно в 19:35, на борту было 50 человек — 44 пассажира и 6 человек экипажа, все погибли. Известен бортовой номер —

Командиром был Рустам Салихов, летчик, совсем недавно введенный в командиры воздушного судна.
На сайте авиакомпании уже опубликован предварительный список зарегистрировавшихся на рейс.
Фотография Дмитрия Баландина.
ПХП → Пайтон
Боже мой, сейчас написали ребята из «Яндекса». Там состоялось эпохальное событие — несколько часов назад последним коммитом из кода внутренней вики «Яндекса» удалён последний код на ПХП. Внутренняя вики «Яндекса» была основана на движке «ВаккоВики» и была полностью написана на ПХП.

Несколько лет назад мы с Сашей Покатиловым начали процесс постепенного переписывания её на Пайтон, причём прямо на живой системе — части на Пайтоне и ПХП общались друг с другом по обычному протоколу HTTP, очень хитрая получалась штука. Я помню как мы неделю провели в Симферополе — ребята из тамошнего офиса «Яндекса» писали спецификацию на синтаксис
И вот этот титанический труд закончен. Ребята, поздравляю, это круто!
Синтетические ёлочные игрушки
Сегодня таксист выдал абсолют веры во всё натуральное.
С утра у нас дождь и, как всегда при такой погоде, затруднено движение, куча ДТП. Для меня это удивительно, не понимаю почему лёгкий дождик так влияет на дорожную обстановку, своим удивлением не преминул поделиться с таксистом.
Узнал много нового. Оказывается во время Универсиады положили
Поддельные ёлочные игрушки. Выглядят как настоящие, но не радуют.
Списки репрессированных
Есть такой хороший сайт — «Жертвы политического террора в СССР». Если я слышу рассказы родственников о репрессиях (да, у меня большинство предков — крестьяне, но часто они были зажиточными), я иду на этот сайт и пытаюсь найти
Сегодня решил этот процесс чуточку автоматизировать — поискал Гуглом два села из которых у меня много родственников — Старая и Новая Письмянки, потом скачал простым скриптом полученные страницы. Кстати, «wget» срабатывает только при условии наличия двух определённых параметров,
wget -U "Firefox/3.0.15" -e robots=off ваш-урлСкачал те урлы, на которые указал Гугл:
grep -hoE 'lists.memo.ru/d[^.]+\.htm' * | sort -u | xargs -n1 wgetи выделил из них все фамилии, рядом с которыми встречалось слово «Письмянка»:
iconv -f cp1251 -t utf8 * | grep -B3 'Письмянка' | sed -nE '/"n[0-9]+"/ {s/<[^>]+>//g;p;}' | sort -uПолучилось 282 строки, потом простым грепом выделил фамилии родственников, проживавших в этой местности: Земсковы, Ануфриевы (у меня есть Онуфриевы), Макридины (так же попался один Микридин — очевидная опечатка) и Евдокимовы.
После чего сел выяснять нет ли у меня в дереве
Больше всего пострадали Макридины, правда не прямые мои родственники, а боковая ветвь, приговорили целую семью — родителей и сына, теперь стала известна часть их судьбы. Например, Макридин Николай Митрофанович отправился
Из прямых родственников нет никого, но дополнительная информация никогда не помешает — иногда части дерева строятся на гипотезах, каждая новая информация их подтвержает. Вообще, чем дальше в архив, тем больше сомнений, ведь точных сведений нет, всё держится на подборе дат, имён и отчеств, особенно в моём случае — у крестьян с фамилиями туго.
Сейчас дерево, на мой взгляд, выстроено на твёрдых фактах, но кто знает — не всплывёт ли
Турник

Я тут последний месяц сильно занят проектом на работе, он занимает всё моё время — выходные, вечера, каждую свободную минуту. Очень много проблем, требуются сверхусилия, чтобы его завершить.
Тут не до личных проектов и, в частности, не до спортзала. Я уже давненько сделал паузу в занятиях спортом и она грозила стать перманентной. Решил
«Поддержал российского производителя», купил турник местного производства, кстати, если вы из Казани и у вас те же проблемы, что и у меня, рекомендую — смело заказывайте. Качество отличное, всё в наличии, за 500 рублей они вам его ещё и установят.
Турник вешается в двух положениях — посмотрите крючки на фото, в таком положении на нём подтягиваются, а если повесить так, чтобы нижние ручки смотрели вперёд — то отжимаются, как на брусьях, либо качают пресс. Я пока, в основном, только отжимаюсь, зато по многу подходов за день.
Сначала всё было очень плачевно — я
Тёма ненавидит…
Очередным комментарием навеяло. Ребят, вы когда мне в комментариях даёте ссылку на ЖЖ Тёмы Лебедева, где написано что он ещё ненавидит из того что я люблю, вы зачем это делаете?

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

Все сайты для работы с деревьями рода — полная ерунда. Такое ощущение, что те, кто их делают, вообще ими не пользуются. С трудом удерживаюсь, чтобы не начать постоянно писать про то как надо делать.
Сегодня не удержался.
Одна из вещей, которых нет — работа с местностью. Как правило, люди жили в сёлах семьями и поколениями. Расписать их по группам, с указанием в каких архивах что искать, когда родились те или иные люди, кем приходились, в каких архивах по ним что есть — никто такого не предлагает.
А видеть это нужно. У меня в дереве почти 2000 человек и, конечно, я путаюсь. Даже в ближайших ветках. В каких архивах уже проводилась работа и по каким людям? Забывается. Быстро окинуть взглядом — невозможно.
Я в выходные примерно за час накидал прототип (на скриншоте) как бы это могло выглядеть. Ему ещё далековато до того, что мне нужно, но уже похоже на требуемое и даже это уже облегчает положение.
Линия времени строится на основе такой конфигурации (это реальный конфиг):
[Старая Письмянка]
1834, 1850, 1858: Самарский архив
1859: Архив мэрии Тольятти (Фонд 48, оп. 1, д.1)
1861-1864, 1866, 1871-1916: Нацархив Татарстана
-1825: Гордей Меркулов
-1840: Феодор Емельянович Евдокимов
-1842: Феодор Иванович Старостин
-1844: Евдоким Гордеевич Меркулов
-1848: Пелагея Артемьевна Меркулова
-1870: Николай Феодорович Старостин
-1870: Василий Феодорович Евдокимов
-1872: Анастасия Евдокимовна Старостина (Меркулова)
-1872: Параскева Козьминична Евдокимова (Онуфриева)
-1904: Анна Васильевна Старостина (Евдокимова)
-1904: Феодор Николаевич СтаростинСлева на линию накладываются люди (у них года с отрицательным знаком, легко запомнить, ведь отрицательные числа на оси слева), справа — архивы, в которых есть информация об этом селе.
Тут ещё работать и работать, но мне, по правде, уже хочется остановиться. Начинать такой большой проект без хорошего дизайнера интерфейсов мне не под силу. Например, этот интерфейс очевидно плох — с первого взгляда, без описания неясно что происходит.
Удаляем раскладку «США» («U.S. English») из Mac OS X 10.9 («Maverick») ★
Как стало известно ещё на этапе появления ранних сборок «Маверика», раскладка «США» не удаляется из неё способом, который описал Артём Поликарпов (а я написал скрипт, автоматизирующий этот процесс).
Зато читатели в комментариях к скрипту указали на другой, очень несложный способ сделать то же.
Напомню в чём проблема. Лично я использую для работе на «Маке» раскладку Бирмана.
После установки раскладки Бирмана, раскладок становится три: русская Бирмана, английская Бирмана и системная — «США». Последняя явно лишняя, но система удалить её не позволяет. Её удаётся удалить только в обмен на установку любой другой системной раскладки.
Но есть баг, спасибо ему, что он существует.
Нужно поставить японскую раскладку «котоэри», потому удалить раскладку «США», потом «котоэри». В системе останутся только две раскладки Бирмана.
«Неглупый дом»: температура в прихожей
Предыдущие мои покупки съели весь бюджет самодельного «умного дома» на пару месяцев вперёд, поэтому на этот раз я позволил себе совсем скромную покупку — подумал, раз у меня всё равно в прихожей стоит смартбук с Линуксом, почему бы не приделать к нему термометр и не мерить им температуру?
Тем более, что датчик от корпуса греться не будет — корпус пластиковый, да и сам смартбук не нагревается. Заказал в Сингапуре сенсор TEMPer за триста рублей, сегодня он пришёл, выглядит гармонично:

Вообще, кто не помнит, в роли «сердца» моего «умного дома» у меня тошибовский смартбук, на котором
Не беда, я когда выбирал датчик, как раз смотрел
sudo aptitude install libusb-dev libusb-1.0-0
wget -q http://raw.github.com/padelt/pcsensor-temper/master/src/pcsensor.c
wget -q http://raw.github.com/padelt/pcsensor-temper/master/src/Makefile
make
wget -q https://raw.github.com/padelt/pcsensor-temper/master/udev/99-tempsensor.rules
sudo cp 99-tempsensor.rules /etc/udev/rules.d
sudo cp pcsensor /usr/local/bin/Осталось только добавить небольшую команду в крон и датчик будет отсылать мне свои показания:
/usr/bin/wget -O/dev/null -q "http://sample.org/api/cmd.php?t=$(/usr/local/bin/pcsensor | cut -d' ' -f5)"Это самый простой и беспроблемный датчик из тех, что я покупал. Обратите внимание в правый верхний угол, там теперь показывается температура:

RU
Я тут подумал, что ещё лет 5—7 и некоторые обыватели доживут до счастливого времени, когда вторая раскладка на компьютере будет не нужна. Ну, в самом деле, зачем она
Английская раскладка будет у гиков, медиков, переводчиков и прочих людей, которым в силу профессии или увлечения нужно будет писать латиницей.
Igbinary и PHP serialize
Если вкратце, модуль igbinary в ПХП — замена встроенным функциям сериализации. Встроеные функции хороши только в одном — сериализованное значение получается читаемым (хотя, на мой взгляд, JSON всё же получше будет).
Igbinary пренебрегает читаемостью (это вообще бинарный формат) в пользу скорости и компактности. Вчера ночью я перевёл пару мест в одном из проектов нашей компании, а утром мой друг, И. Б., кинул мне ссылку на статью, где сравнивается скорость работы встроенных функций и igbinary, причём в тестах на сохранение строк последний сливает первому.
Удивительный результат, так как, например, с числами всё иначе — там разница в несколько раз в пользу igbinary (в случае типа с плавающей запятой — более почти в 20), что же за проблема со строками?
У меня возникло подозрение, что я знаю в чём дело. Обычно, когда я изучаю новый модуль, я смотрю так же и на его настройки. Вчера я тоже их просматривал (в этом модуле их
Опция хорошая — помогает экономить память (например, при сериализации в memcached), работает она очень просто — при сериализации, если в данных попадается строка, проверяем не встречалась ли такая же строка ранее, если встречалась, повторно строку не сохраняем, сохраняем лишь ссылку на предыдущее вхождение.

Как видите, разница разительная. Так что если вы ставите igbinary для скорости, то эту опцию лучше бы выключить.
IE 10 CSS hack
Придумал CSS-хак для Эксплорера
@media , {
.:valid, body {
background: red; /* будет красным в Internet Explorer 10 (режим совместимости) */
}
}Проверил при помощи сайта «Браузер шотс» ложные срабатывания, как будто всё в порядке, их нет. Не проверял на IE11, не знаю будет ли там работать. Если
Так же придумал новый хак для обычного режима IE 10:
@media all\0 {
_:valid, body {
background: red; /* будет красным в IE 10 */
}
}И ещё один:
_:valid\0, body {
background: green; /* будет зелёным в IE10 */
}Так же не тестировал на IE11 (мне негде).
Числа из PHP в MongoDB
Не знал, что официальный драйвер Монги для ПХП передаёт числа в Монгу как строки.
Долго не понимал почему удаление строк из коллекции срабатывает почти сразу, а не через заданное время. Наконец, догадался посмотреть на получившийся индекс, оказалалось, что все числа там — строки (в том числе и период через который значения удаляются).
А чтобы получились числа их надо завернуть в специальный объект:
$mongo->ensureIndex([
'date' => new MongoInt32(1)
], [
'expireAfterSeconds' => new MongoInt32(7200)
]);Вот как выглядит правильный индекс:

В неправильном числа будут окружены апострофами.
Казань → Москва ✈ Самара → Казань
12 и 13 октября буду в Самаре, на конференции «404».