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

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

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

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

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

In Soviet Russia… 

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

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

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

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

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

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

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

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

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

«Словохват»

Вчера подсел на игру «Словохват», вроде игра незамысловатая, но очень интересная.

Словохват (85.68КиБ)

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

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

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

У автора получилась неплохая такая тактическая игра. Мне играть было скучновато — очень лень выдумывать слова, поэтому я написал небольшую программу на Пайтоне, которая работает со словарём под редакцией профессора Лопатина, ей нужно задать файл словаря и буквы, которые у вас есть, она придумает слово:

Словохватохват (18.24КиБ)

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

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

# coding: utf-8
import itertools
import sys
import codecs

# дружим с консолью
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

# строки с пропусками любых букв в любом количестве
def combinations(str):
    for l in xrange(2, len(str)+1):
        yield itertools.combinations(str, l)

# собираем каждую в строку
def iterstr(str):
    for s in itertools.chain(*combinations(str)):
        yield u''.join(s)

# все наши комбинации
def uniqcombinations(str):
    return set(iterstr(sorted(str)))

# проходим по словарю
def iterdict(name, min, max):
    with open(name, 'r') as f:
        for line in f:
            line = line.strip().decode('cp1251')

            # текущее слово должно содержать только буквы и быть не больше искомого слова
            if max >= len(line) >= min and line.isalpha():
                yield u''.join(sorted(line)), line

# ищем наше слово
def find(word, dictname):
    words = uniqcombinations(word)

    for line, original in iterdict(dictname, 3, len(word)):
        if line in words: print(original)

# запуск программы и небольшая помощь
try:
    find(sys.argv[2].decode('utf-8'), sys.argv[1].decode('utf-8'))
except IndexError:
    print(u'Запуск: {0} <словарь> <буквы в наличии>'.format(sys.argv[0]))

Писал именно на Пайтоне из-за прекрасного модуля itertools, на этот раз он пригодился функцией combinations — она выдаёт генератор всех комбинаций букв, заданной длины, без изменения их порядка. Очень хорошо, что не пришлось писать этот скучный кусок кода самостоятельно.

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

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

Ещё про «Словохват»

Ускорение (20.35КиБ)

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

Поиск наличия значения в set происходит многократное быстрее.

Кстати, в «Словохвате» можно использовать ещё и названия городов, а в моём словаре их нет. Но ничего не мешает использовать два и более словаря. Например, я скачал первый попавшийся словарь российских городов (он там в формате Экселя) и теперь использую и его:

cat <(unzip -p /Users/bolk/Downloads/spisokl-gorodov.xlsx xl/sharedStrings.xml |
awk -v RS=t '/^>.*<\/$/ {gsub("[<>/]", ""); print $0}' |
tr "[:upper:]" "[:lower:]" |
iconv -f utf8 -t cp1251) ~/Downloads/lop2v2/lop2v2.txt |
pypy slovohod.py /dev/stdin моибуквы

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

Начала фамилий

Схема родословной: Лазарь и Макрида Макридины — родители Семёна и Марьи; Егор и Евдокия Мироновы — родители Мирона и Евдокии; также показаны другие родственники с датами.

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

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

Видимо, когда давали фамилии, происходило что-то вроде:

— Чьи будете? — Макридины? — А вы? — Мироновы мы… — А вы чьи? — Евдокимовы…

Т. е. по принадлежности к главе рода. Макрида, видимо, была достаточно властной женщиной, раз мои предки стали не Афанасьевы, а Макридины.

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

События в дереве

У меня тут несколько примечательных вещей в родовом дереве случилось.

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

Во-вторых, ещё в одной ветке я дотянулся до человека, имя которого дало фамилию роду — Меркул, мой прапрапрапрапрапрапрадед. Его прапраправнучка Анастасия Евдокимовна 12 февраля 1891 года вышла замуж за Николая Фёдоровича Старостина — моего прапрадеда. О его существовании я узнал из отчества его сына, о котором мне ещё в детстве рассказала бабушка — Клавдия Фёдоровна.

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

Впрочем, речь не про них, вот он, Меркул, в те времена, конечно, совсем не Меркулов, эта фамилия появилась намного позже:

Меркуловы (42.14КиБ)

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

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

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

Куда ни кинь по дереву, мои предки, в основном, родом из-под Курска. В Оренбуржскую губернию (позже эта часть принадлежала Самаре, теперь это территория Татарстана) попали в результате расселения. Например, если брать мужскую линию Степанищевых — мы приехали в 1828 году из села Средние Апочки Старооскольского уезда Опочинской волости.

Чуть выше я упоминал, что сословие упразднили, видимо, это стало причиной того, что долгое время Степанищевы попадались мне как крестьяне, пока я не наткнулся на ревизскую сказку (перепись населения) 1834 года в самарском архиве, где мои Степанищевы упоминаются с фамилией, да ещё и числятся однодворцами.

Знакомьтесь, Михайла Сергеевич Степанищев, родился в 1770 году, однодворец, мой прапрапрапрадед, чуть ниже на снимке перечислены его потомки:

Степанищев (48.51КиБ)

А вот, собственно, шапка таблицы, в которой числится Михайла Сергеевич:

Однодворцы Андреевки (73.37КиБ)

Разобрать непросто, написано следующее: «269 об ревизская скаска. 1834. года Апреля 21. дня Оренбургской губернии Бугульминского уезда. деревни Андреевки». Ниже: «Мужской пол. Однодворцы».

На обложке «скаски» тоже написано, что это список однодворцев, так что сомнений нет.

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

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

Скачивалка с самарского архива

Несколько читателей сообщили, что моя скачивалка архивов ЭлАра не работает — самарский архив что-то у себя изменил и она перестала работать.

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

Чтобы вытащить из страницы список картинок, которые нужно качать, можно воспользоваться следующим способом: открываем консоль браузера и пишем туда следующее:

console.log("dxo.itemsValue=['"+
window['MainPlaceHolder__storageViewerControl__storageFilesViewerControl_FilesDropDownList_DDD_L'].
itemsValue.join("','")+"'];")

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

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

Средние Апочки

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

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

Итак, поиски в архивах дали определённые плоды. Сам я родом из Лениногорска, а если отматывать время назад, мои фамильные предки кратко остановились в Старой Письмянке, потом на несколько поколений осели в Андреевке Бугульминского района, а туда попали из-под Курска — из села Средние Апочки Старооскольского уезда Опочинской волости. Это чёрным по белому записано в переписи населения 1832 года, даже год переселения указан:

Средние Апочки (49.83КиБ)

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

Теперь место мне известно точно, хотя разобрать почерк на скане было очень тяжело. Помог справочник «Курская губернія. Списокъ населенныхъ мѣстъ по свѣдѣніямъ 1862 года» (издание 1868) — название уезда и волости читалось лучше, найти же на нескольких страницах что же за населённый пункт скрывается за каракулями уже не так сложно:

Средние Апочки в справочнике (21.32КиБ)

В книге «Россия. Полное географическое описание нашего отечества. Настольная и дорожная книга для русских людей» под редакцией В.П.Семенова и под общим руководством П.П. Семенова-Тян-Шанского за 1902 год село так же упоминается:

В 20 вер. к з.-с.-з. от ст. Горшечного расположено село Средн. Апочка, уже в Старооскольском уезде Курской губ., имеющее 2200 жит., волостное правление и лавки.

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

Село тоже существует, я специально выбрал кусок побольше из карт «Яндекса», чтобы было видно где оно располагается по отношению к Старому Осколу — крупному населённому пункту:

Средние Апочки на карте (145.45КиБ)

В настоящее время село всё ещё крупное — по состоянию на 2010 год в нём жило 537 человек, немало как мне кажется.

Интересно получилось с названием. Я обыскал весь интернет, но этимология нигде не всплывала, пока мне не попался на глаза город Опо́чка в Псковской области — его история отыскалась быстро.

Ниже два герба — слева самого города, а справа — Опоческого уезда, центром которого был когда-то город Опо́чка.

Герб города Опочка (22.58КиБ)

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

Вернёмся к селу. Село Средние Апочки расположено на реке Апочке, а местность относилась к Опочинской волости. Думаю, имеет место обычное искажение «Опочка» → «Апочка», тем более, что в названии волости мы видим букву «о». Так что я полагаю, история названия здесь та же.

А ещё на сайте «Наши предки» я нашёл интересную информацию:

Характерным для селений Оскольского уезда является то обстоятельство, что в них не было почти совсем ни крестьян, ни бобылей. На весь уездъ в начале XVII века был только один бобыльский двор. Население Оскольского уезда состояло целиком из детей боярских.

Только в двух деревнях Чуфичевского стана Верхней и Нижней Атаманской жили станичные атаманы, а в сельце Голубине Орлицкого уезда — беломестные казаки.

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

Въ селѣ помѣщики дѣти боярскiя: … Ондрей Дониловъ сынъ Кондоуровъ, … Ѳедоръ Дѣевъ сынъ Кондоуровъ

А я-то был уверен, что у меня предки — сплошные крестьяне.

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

Мы, бояре — народ работящий, такая уж наша боярская доля!

Пихта (120.40КиБ)

Совсем не понимаю людей, которые покупают себе на Новый год пластиковую ёлку из экологических соображений. Из лени — понимаю, из-за зелёного цвета мозга — нет.

Я признаю на Новый год только настоящие деревья. Пока жена в спортзале, сделал ей сюрприз — приволок из «Леруа Мерлен» нордманскую пихту. Установил дома дедовским способом — в ведро, куда понапихано старых тряпок.

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

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

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

Цитату в заголовке, думаю, мало кто узнает. Она из лучшего мульфильма всех времён и народов «Падал прошлогодний снег».

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

CSS parent selector

Тема родительского селектора в ЦСС всплывает ужа давно, если не ошибаюсь, в Вебките даже как-то был эксперементальный синтаксис для его поддержки.

Что такое родительский селектор? О, это очень простая и мощная штука, к примеру, если клиент выбрал что-то в каком-то окне, нужно всё окно спрятать. При помощи ЦСС это можно было бы сделать так:

.window < :checked { /* экспериментальный синтаксис родительского селектора из Вебкита */
    display: none;
}

Сразу скажу, задумка мощная, а реализация плохая. Какую проблему тут видно сразу? Непонятно что значает этот знак. Непосредственного родителя мы здесь выбираем или любого? Если непосредственного, как выбрать любого и наоборот?

Все синтаксисы родительского селектора (включая, например, :parent) грешат чем-то подобным — они не гибкие или неоднозначные.

Мне бы хотелось видеть абсолютную гибкость в отношении родительского селектора и мне кажется, синтаксис тут напрашивается сам собой:

.window > (:checked ~ :checked) {
    display: none;
}

Всё сразу становится логично, на мой взгляд: применить стиль к тегу с классом window, у которого два непосредственных потомка-соседа находятся в состоянии «checked».

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

Однодворцы Широкобоковы

Разобрал-таки надпись напротив записи о семье моего прапрапрапрапрапрадеда однодворца Прокофия Тимофеевича Широкобокова (1779—1853)! Отмечу для себя, что позже его потомки превратились в Широбоновых.

Прокофий Тимофеевич — это прапрадед со стороны матери моего прапрадеда Никанора Ивановича Литвинова про которого я немножко как-то рассказывал.

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

Вот вам этот шедевр каллиграфии (правая колонка):

Рукописный список имён с датами, включая «1833 году», в клетчатой тетради; текст частично разборчив, содержит фамилии и отчества.
Широкобоковы

По всей видимости тут написано следующее: «переезд оной же губернии, уезда и волости из села Солдатской причислены по указу Оренбургской казённой палаты в 1833 году». Потомки, если в будущем изобретут роботов, способных проходить каптчи, суйте им архивные документы, посмотрим кто кого.

Переехали они в село Ефановку (сейчас — Крым-Сарай), село входило в состав Бугульминского уезда, а как следует из текста переехали Широкобоковы куда-то неподалёку.

Я не смог пока найти ничего со словом «Солдатской» вокруг Бугульмы, кроме слободы Письмянской Солдатской, на карте 1805 года она хорошо видна справа (и до сих пор существует в виде села):

Фрагмент исторической карты с обозначениями населённых пунктов, рек и лесов; видны надписи «Kupar», «Gubina», «Kurgan», буква «F» в углу.
Солдатская Письмянская слобода

Кстати, оцените: карта нарисована вручную в 1805 году и раскрашена акварельной краской.

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

Хорошо бы найти список пунктов тогдашнего Бугульминского уезда, но мне пока ещё не удалось это сделать. Мне как-то слабо верится, что сёла западнее (Солдатская Письмянка) и восточнее (Крым-Сарай) Бугульмы могли принадлежать одной волости, а как мы знаем из каракуль, волость должна быть одна. Если список не найдётся, придётся ползать по карте — убийственное занятие.

Параллельно нужно будет попытаться найти ревизию (перепись) 1816 года по Солдатской Письмянке, по всем признакам она в Башкирском архиве и покопаться там. Причём по этой слободе материалы есть и в Нацархиве Республики Татарстан, мой сканер нашёл документы за 1809-1820, 1822-1823, 1830, 1832-1834, 1837-1841, 1843, 1847, 1849-1850 гг, жаль сами документы не доступны в электронном виде. Нужно будет проработать и их.

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

Ленивая загрузка в ИЕ11

В IE11 интересную штуку сделали — ленивую загрузку. Можно пометить картинку (включая внедрённые тегом SVG), теги для воспроизведения видео и аудио, скрипты и многое другое специальным атрибутом lazyload, который означает «начать загружать, когда загрузится всё важное».

Иногда может быть удобно, для оптимизации скорости загрузки страницы, попросить браузер не загружать пока что-то объёмное. Я, например, в одном из наших проектов поставил этот атрибут аватарам пользователей. Пример использования:

<img src="avatar-3132.png" width="200" height="200" lazyload="1">

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

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

Как скачать документы из архива Башкортостана

Мне Архив Башкортостана нравится куда больше самарского — документы заказывать не надо, поиск простой, быстрый, да и документы скачиваются элементарно, очень удобно!

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

Для «Мака» и «Линуксов» подойдёт такой способ: открываем в браузере нужный нам набор документов, вводим в консоль браузера следующую команду:

I = document.querySelectorAll('img[src*=imgt]'), D = [];
for (i in I) if(i*0==0) D.push('wget -O '+('0000'+i).substr(-4)+'.jpg "'+
I[i].src.replace("/imgt", '/img')+'"'); console.log(D.join(';'))

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

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

← сюда туда →