Оглядываясь на шахматы на sed (SedChess) ★

Это информационный пост, больше для себя. Для того, чтобы не забыть выводы и ощущения от сделанного.

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

Пара комментариев оттуда:

Комментарии с Реддита (81.73КиБ)

In Soviet Russia… 

Комментарии с Реддита (51.32КиБ)

Заодно мои «шахматы» попали на «ЛОР», «ОупенНет» и многие другие ресурсы (например, в английской «Википедии» в статье про sed, появилась ссылка на меня).

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

Сохранился один лист из блокнота на котором я расписываю как движется какая-то фигура (видимо, конь), её «стоимость» на каждой клетке и способ кодирования позиции в программе:

Конь ходит (90.68КиБ)

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

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

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

Оставить комментарий

Локальные переменные

В прошлом я несколько лет программировал на Перле, очень любил этот язык и неплохо знал, до сих пор могу без особых проблем читать программы на нём. Прошло немало лет, наиболее часто я теперь использую ПХП и Джаваскрипт, на Перле не пишу вовсе (хотя в «Яндексе» был краткий эпизод — написал небольшой пример для документации к какому-то сервису).

Вообще я сейчас считаю, что будущее скорее за языками с лаконичным синтаксисом (Пайтон), чем за тем, у кого он сверхнасыщен (Перл, Руби).

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

Например, локальные переменные. В ПХП часто приходится смотреть (особенно, если достаётся код-лапша), не определяется ли выше и не используется ли ниже переменная с каким-нибудь глубокомысленным названием — «temp», «i» или что-то в подобном роде. Ну мне тоже хочется что-то временное сохранить и в цикле какой-то счётчик использовать, причём посредь чужого кода.

В Перле такой проблемы нет — там локальную переменную можно создать почти в любом месте, произвольном месте кода, просто поставив фигурные скобки — так создаётся новый лексический блок, у которого могут быть свои локальные переменные:

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 — эта новая процедура появилась недавно, если предложение понравится, то синтаксис имеет все шансы попасть в язык. Надо будет как-нибудь заняться.

Оставить комментарий

Казань ✈ Москва ✈ Шри-Ланка ✈ Москва ✈ Казань

Отель (195.96КиБ)

Тридцатого декабря полетим праздновать Новый год на Шри-Ланку, в отель «Бентота Бич» (фото с сайта «Топхотелс»).

Если вы были на Шри-Ланке, поделитесь ощущениями, советами: на что смотреть, какую валюту брать, где менять и так далее.

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

23 комментария

Небритябрь

Небритябрь (42.28КиБ)

Про Небритябрь я узнал из видеоблога Стаса Давыдова («This is ХОРОШО»). Смысл простой — на весь ноябрь нужно прекратить бриться.

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

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

11 комментариев

Проблема в стемере для PHP

В модуле stem для ПХП обнаружилась неожиданная проблема. Этот модуль — стеммер, позволяющий обрезать окончания слов для того, чтобы искать потом по тексту без учёта падежей и склонений.

Для русского языка в нём целых две функции — для кодировки КОИ-8 и УТФ-8. Наш код работает в КС1251, потому для стеммера мы перегоняем текст в УТФ-8.

Я обратил внимание, что из командной строки код с этим модулем работает нормально, а в рабочем проекте кодировка портится — как будто стеммер где-то внутри себя рассматривает УТФ-8 как однобайтовую русскую кодировку и приводит её к нижнему регистру.

У меня возникла мысль, что дело в выставляемой локали, мы провели эксперимент — так и есть, дело в этом. Такой код работать правильно не будет:

setlocale(LC_TIME, 'ru_RU.cp1251');
echo stem_russian_unicode(iconv('windows-1251', 'utf-8', 'Приветы'));

Кодировка получится битой. Перед вызовом функций стеммера нужно переставлять кодировку (setlocale) в УТФ-8. Ошибочное место в модуле ищется элементарно:

// файл 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 ориентируется в своей работе на локаль, в этом и проблема.

7 комментариев

Ограда от зайцев

Царицыно (74.42КиБ)

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

3 комментария

В Казани разбился самолёт

Тут у меня много читателей, которые знают, что я часто летаю по маршруту Казань—Москва. Думаю, надо сообшить, что на сегодняшнем рейсе авиакомпании «Татарстан» (У9-363) меня не было. Я, как и многие сотрудники нашей компании, стараемся не летать самолётами этой авиакомпании.

Есть версия ошибки экипажа, самолёт разбился на третьей попытке посадки (ударился носом о землю), примерно в 19:35, на борту было 50 человек — 44 пассажира и 6 человек экипажа, все погибли. Известен бортовой номер — VQ-BBN, судну было 23,5 года.

Фото погибшего Боинга (34.51КиБ)

Командиром был Рустам Салихов, летчик, совсем недавно введенный в командиры воздушного судна.

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

Фотография Дмитрия Баландина.

39 комментариев

ПХП → Пайтон

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

Дни ПХП сочтены (64.93КиБ)

Несколько лет назад мы с Сашей Покатиловым начали процесс постепенного переписывания её на Пайтон, причём прямо на живой системе — части на Пайтоне и ПХП общались друг с другом по обычному протоколу HTTP, очень хитрая получалась штука. Я помню как мы неделю провели в Симферополе — ребята из тамошнего офиса «Яндекса» писали спецификацию на синтаксис вики-разметки, чтобы повторить парсер на Пайтоне и мы потом вносили в неё правки. Вообще, много интересного было, много сложностей.

И вот этот титанический труд закончен. Ребята, поздравляю, это круто!

60 комментариев

Синтетические ёлочные игрушки

Сегодня таксист выдал абсолют веры во всё натуральное.

С утра у нас дождь и, как всегда при такой погоде, затруднено движение, куча ДТП. Для меня это удивительно, не понимаю почему лёгкий дождик так влияет на дорожную обстановку, своим удивлением не преминул поделиться с таксистом.

Узнал много нового. Оказывается во время Универсиады положили какой-то иной, неправильный асфальт, тормозить на нём в дождь трудно. Что, по мнению таксиста неудивительно, так как асфальт, видите ли… синтетический.

Поддельные ёлочные игрушки. Выглядят как настоящие, но не радуют.

21 комментарий

Списки репрессированных

Есть такой хороший сайт — «Жертвы политического террора в СССР». Если я слышу рассказы родственников о репрессиях (да, у меня большинство предков — крестьяне, но часто они были зажиточными), я иду на этот сайт и пытаюсь найти какие-то упоминания там.

Сегодня решил этот процесс чуточку автоматизировать — поискал Гуглом два села из которых у меня много родственников — Старая и Новая Письмянки, потом скачал простым скриптом полученные страницы. Кстати, «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 строки, потом простым грепом выделил фамилии родственников, проживавших в этой местности: Земсковы, Ануфриевы (у меня есть Онуфриевы), Макридины (так же попался один Микридин — очевидная опечатка) и Евдокимовы.

После чего сел выяснять нет ли у меня в дереве кого-то похожего. Нашёл пять чётких совпадений (совпадают ФИО и год рождения ± пара лет) и два предполагаемых — найденные вполне тянут на сыновей одного из братьев моего прямого предка.

Больше всего пострадали Макридины, правда не прямые мои родственники, а боковая ветвь, приговорили целую семью — родителей и сына, теперь стала известна часть их судьбы. Например, Макридин Николай Митрофанович отправился на Беломор-Балтийский канал, бежал, был расстрелян 5 июля 1938, похоронен в Карелии, вблизи станции Медвежья Гора.

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

Сейчас дерево, на мой взгляд, выстроено на твёрдых фактах, но кто знает — не всплывёт ли что-то, что пошатнёт мою уверенность, проверить по всем источникам очень полезно.

Оставить комментарий

Турник

Турник (44.90КиБ)

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

Тут не до личных проектов и, в частности, не до спортзала. Я уже давненько сделал паузу в занятиях спортом и она грозила стать перманентной. Решил что-то с этим сделать и купил хороший турник.

«Поддержал российского производителя», купил турник местного производства, кстати, если вы из Казани и у вас те же проблемы, что и у меня, рекомендую — смело заказывайте. Качество отличное, всё в наличии, за 500 рублей они вам его ещё и установят.

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

Сначала всё было очень плачевно — я еле-еле подтягивался четыре раза, за пару недель довёл до 11 раз, сейчас прогресс уже не такой бойкий, но за последнюю неделю я довёл уже до 12. Поставил себе цель — довести до 20. Буду стараться.

17 комментариев

Тёма ненавидит…

Очередным комментарием навеяло. Ребят, вы когда мне в комментариях даёте ссылку на ЖЖ Тёмы Лебедева, где написано что он ещё ненавидит из того что я люблю, вы зачем это делаете?

Нанелюбит стихи (45.05КиБ)

Я уважаю Артемия Андреевича как профессионала, на него надо равняться, он молодец. Увы, непосредственно у него учиться трудно — человек он не публичный, тихий, застенчивый ботан. Есть редкие полезные посты в ЖЖ, высказывания в «Линче», «Ководство», опосредованно можно смотреть на то что и как делает его студия.

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

Но, ребят, всерьёз давать мне ссылку на эту помойку, ну вы чего?

11 комментариев

Линия времени

Линия времени (85.64КиБ)

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

Сегодня не удержался.

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

А видеть это нужно. У меня в дереве почти 2000 человек и, конечно, я путаюсь. Даже в ближайших ветках. В каких архивах уже проводилась работа и по каким людям? Забывается. Быстро окинуть взглядом — невозможно.

Я в выходные примерно за час накидал прототип (на скриншоте) как бы это могло выглядеть. Ему ещё далековато до того, что мне нужно, но уже похоже на требуемое и даже это уже облегчает положение.

Линия времени строится на основе такой конфигурации (это реальный конфиг):

[Старая Письмянка]

1834, 1850, 1858: Самарский архив
1859: Архив мэрии Тольятти (Фонд 48, оп. 1, д.1)
1861-1864, 1866, 1871-1916: Нацархив Татарстана

-1825: Гордей Меркулов
-1840: Феодор Емельянович Евдокимов
-1842: Феодор Иванович Старостин
-1844: Евдоким Гордеевич Меркулов
-1848: Пелагея Артемьевна Меркулова
-1870: Николай Феодорович Старостин
-1870: Василий Феодорович Евдокимов
-1872: Анастасия Евдокимовна Старостина (Меркулова)
-1872: Параскева Козьминична Евдокимова (Онуфриева)
-1904: Анна Васильевна Старостина (Евдокимова)
-1904: Феодор Николаевич Старостин

Слева на линию накладываются люди (у них года с отрицательным знаком, легко запомнить, ведь отрицательные числа на оси слева), справа — архивы, в которых есть информация об этом селе.

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

3 комментария

Удаляем раскладку «США» («U.S. English») из Mac OS X 10.9 («Maverick») ★

Как стало известно ещё на этапе появления ранних сборок «Маверика», раскладка «США» не удаляется из неё способом, который описал Артём Поликарпов (а я написал скрипт, автоматизирующий этот процесс).

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

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

После установки раскладки Бирмана, раскладок становится три: русская Бирмана, английская Бирмана и системная — «США». Последняя явно лишняя, но система удалить её не позволяет. Её удаётся удалить только в обмен на установку любой другой системной раскладки.

Но есть баг, спасибо ему, что он существует.

Настройка клавиатуры macOS: в списке языков выбран «Японский», справа отображается раскладка «Котоэри» и виртуальная клавиатура с латинскими символами.

Нужно поставить японскую раскладку «котоэри», потому удалить раскладку «США», потом «котоэри». В системе останутся только две раскладки Бирмана.

68 комментариев

«Неглупый дом»: температура в прихожей

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

Тем более, что датчик от корпуса греться не будет — корпус пластиковый, да и сам смартбук не нагревается. Заказал в Сингапуре сенсор TEMPer за триста рублей, сегодня он пришёл, выглядит гармонично:

TEMPer (46.78КиБ)

Вообще, кто не помнит, в роли «сердца» моего «умного дома» у меня тошибовский смартбук, на котором когда-то жил Андроид, а теперь стоит Лубунту. Процессор там ARM, так что нужны специальные драйвера.

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

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)"

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

Температура в прихожей (33.23КиБ)

13 комментариев

RU

Я тут подумал, что ещё лет 5—7 и некоторые обыватели доживут до счастливого времени, когда вторая раскладка на компьютере будет не нужна. Ну, в самом деле, зачем она нужна-то будет? Домены — на русском, логин и пароль — на русском, русские слова, русифицированные бренды.

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

23 комментария

Igbinary и PHP serialize

Если вкратце, модуль igbinary в ПХП — замена встроенным функциям сериализации. Встроеные функции хороши только в одном — сериализованное значение получается читаемым (хотя, на мой взгляд, JSON всё же получше будет).

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

Удивительный результат, так как, например, с числами всё иначе — там разница в несколько раз в пользу igbinary (в случае типа с плавающей запятой — более почти в 20), что же за проблема со строками?

У меня возникло подозрение, что я знаю в чём дело. Обычно, когда я изучаю новый модуль, я смотрю так же и на его настройки. Вчера я тоже их просматривал (в этом модуле их всего-то три) и хорошо запомнил одну из них — «igbinary.compact_strings».

Опция хорошая — помогает экономить память (например, при сериализации в memcached), работает она очень просто — при сериализации, если в данных попадается строка, проверяем не встречалась ли такая же строка ранее, если встречалась, повторно строку не сохраняем, сохраняем лишь ссылку на предыдущее вхождение.

По-умолчанию она включена и очевидным образом должна замедлять сериализацию строк. Я решил её выключить и посмотреть насколько быстрее станет. Результаты на скриншоте — слева опция выключена, справа — включена.

Результаты тестов (19.54КиБ)

Как видите, разница разительная. Так что если вы ставите igbinary для скорости, то эту опцию лучше бы выключить.

4 комментария

IE 10 CSS hack

Придумал CSS-хак для Эксплорера 10-й версии, срабатывающий только в режиме совместимости, похоже, что все существующие хаки в нём не работают.

@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 (мне негде).

33 комментария

Числа из PHP в MongoDB

Не знал, что официальный драйвер Монги для ПХП передаёт числа в Монгу как строки.

Долго не понимал почему удаление строк из коллекции срабатывает почти сразу, а не через заданное время. Наконец, догадался посмотреть на получившийся индекс, оказалалось, что все числа там — строки (в том числе и период через который значения удаляются).

А чтобы получились числа их надо завернуть в специальный объект:

$mongo->ensureIndex([
    'date' => new MongoInt32(1)
], [
    'expireAfterSeconds' => new MongoInt32(7200)
]);

Вот как выглядит правильный индекс:

Правильный индекс (12.97КиБ)

В неправильном числа будут окружены апострофами.

11 комментариев