Первый турнир по шахматам у дочки

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

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

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

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

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

Perl 1

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

Я тут недавно сообразил, что программирую на ПХП с третьей версии, однажды попробовал в действии вторую версию и что-то читал про первую, но никогда не видел Перл старее пятой версии, на которой я и программировал когда-то.

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

Командная строка с выводом версии Perl: ./perl -v, заголовок perly.c,v 1.0.1.3 от 28.01.1988, уровень патча 10.

К первой версии идёт пятьдесят тестов, написанных на Перле тех времён. Я бегло их просмотрел и, на первый взгляд, язык как будто мало изменился, тем не менее какие-то различия бросаются в глаза. Например, массивы с какого-то перепугу, выглядят иначе — временами без @ в начале, do каким-то образом позволяют обращаться к ещё не объявленным функциям, а ещё в языке существует переменная с именем «пробел».

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

for ($i = 0; $i <= 999999; $i++)
{
    $a = ('0' x (6 - length($i))) . $i;
    $c++ if (substr($a, 0, 1) + substr($a, 1, 1) + substr($a, 2, 1)) ==
    (substr($a, 3, 1) + substr($a, 4, 1) + substr($a, 5, 1));
}
print "$c\n";

Вот что пришлось исправить: изменить синтаксис цикла, ну и скобок побольше наставить.

Производительность, кстати, изменилась значительно — первая версия выполняет эту программу за 1,7 секунд, а современный Перл на том же оборудовании — за 0,8 секунды.

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

Снимки с Casio WQV-3

Боже мой, я прямо не верю! Успешно удалось переписать фотографии с часов! Спасибо одному из читателей, который каким-то чудом нашёл страничку на «Народе», где можно скачать драйвер, с которым всё, как по волшебству, заработало! Подошёл драйвер в архиве с названием Driver_XP_NT.rar.

В итоге, чтобы переписывать снимки с этих часов, необходимо следующее:

  1. собственно часы;
  2. программа Casio WQV Link 2;
  3. компьютер или виртуалка с ОС, на которую эта программа поставится; я ставил Windows XP;
  4. адаптер IrDA, на которые надо найти драйвера; на мой Ark3116T (PCIID: 18EC 3118) драйвера нашлись.

Подсоединяем адаптер IrDA к компьютеру, запускаем Casio WQV Link 2, открываем там контрольную панель, кнопкой сверху выбираем папку, в которую будут сохраняться картинки, кладём часы напротив адаптера, запускаем там передачу (Select → Select → IR Beam), нажимаем в контрольной панели «Save All».

После этого снимки можно посмотреть в указанной папке.

Окно программы Control Panel с превью фото, списком файлов WQV и датой 2024/10/31 06:36; на рабочем столе видны ярлыки Google Chrome, Internet Explorer, WQV Link Ver.2.0.
Успешно переписал фотографии с Casio WQV-3, в основном там фотографии предыдущих владельцев

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

Тип «‟char”»

Недавно я узнал, что, кроме text, varchar и char, в Постгресе есть ещё и строковый тип "char", именно так, в кавычках. Используется во внутренних таблицах Постгреса для простого перечисления. Интересен тем, что занимает ровно один байт, в отличие от более известных типов, которые во внутреннем представлении хранят ещё и свою длину, поэтому всегда занимают больше.

Использования его в своих таблицах, наверное, лучше избегать, но знать про него интересно. Кстати, есть ещё и тип name, который всегда занимает 64 байта и используется для хранения имён объектов, но, как по мне, он не такой интересный.

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

Лица

Твит от @heh_not_hehe: диалог о звонке от «Билайна» с просьбой продлить номер, где мошенник использует SMS от Госуслуг, чтобы обмануть жертву, называя себя «2е», а жертву — «1е».

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

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

Bash HTTPd

У писателя Леонида Каганова, который в последние годы ушёл в айти, началась какая-то полоса невезения. Много чего случилось, пересказывать долго, а сослаться пока некуда — ко всем неприятностям у него ещё и сайт перестал работать.

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

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

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

Скрипт на bash, реализующий простой HTTP-сервер на порту 8080 с помощью netcat, который отдаёт файлы или генерирует HTML-список директорий.

В общем, мне стало как-то обидно, что автор оригинального кода обошёл вниманием «Макось» и я написал свою реализацию через команду coproc, которую до этого использовать не умел. Вот и появился повод изучить.

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

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

UTM и Casio WQV-3

Окрылённый успехом с часами Casio WQV-3 (теперь я могу переписывать фотки на ноутбук с «Виндоуз ЭксПи»), вернулся к идее развернуть систему в эмуляторе на своём ноутбуке. Со времён, когда меня преследовала идея посмотреть на систему PERQ, у меня осталось впечатление, что скорость в этом случае будет низкая, лучше и не пытаться. Напомню, что у меня на ноуте процессор с совершенно другим набором команд и вместо виртуализации приходится использовать эмуляцию.

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

Ошибка WQV Link Ver.2.0: «The Wrist Camera could not be found... Check the IR ports... make sure that the Wrist Camera is in the IR Mode».
Полный крах всех надежд, шесть букв, вторая «и»

В общем, решил дать шанс. Скорость работы оказалась отличной, ничего не тормозит и не зависает, а вот с часами — фиаско. Не работает. Сначала показалось, что дело в батарейке — какое-то время назад часы иногда жаловались на низкий заряд батареи и, временами, отказывались фотографировать и передавать фотографии.

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

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

Прошлое: Дни Интернета в Казани ★

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

А. Х. попросил меня помочь, но сначала мне пришлось отказаться — меня ждали на встрече. Позже выяснилось, что встречу передвинули и у меня есть минут 15—20, чтобы спринтом пробежаться по памяти и чем-нибудь поделиться.

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

В конце девяностых—начале двухтысячных в Казани проводились Дни Интернета. Событие, насколько я помню, должно было стать ежегодным, но не стало. Его провели не менее двух раз и в какой-то момент оно благополучно загнулось.

В интернете об этом упоминаний не сохранилось, но кое-что можно наковырять в веб-архиве, в частности на сайте передачи «Система 104».

Таблица: 15 окт — розыгрыш билета на День Интернета, 8 окт — передача, 1 окт — сюрприз, 24 сен — Степанищев о безопасности.

Я был на двух «Днях». Один из них проводил на свои деньги известный тогда в казанском интернете деятель Daddy Hab, а второй, если мне не изменяет память, провайдер «Сантел-интернет», ныне несуществующий. Но может и не он.

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

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

Как пошутил А. Х., я делился файлами через облако до того как это стало модным.

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

Скриншот письма от 25 октября 1999 года от Степанищева Евгения к теме@tema.ru с темой «День Интернета. 3-я попытка. :)» и ссылками на файлы флайера в разных форматах.

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

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

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

Продолжение турнира по шахматам у дочки

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

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

В эти выходные у нас в планах была туристическая поездка в Елабугу, причём там был оплачен отель по невозвратному тарифу. Поэтому мы съездили, но сегодня встали в шесть утра, чтобы успеть к началу следующих туров.

Ребёнок с кудрявыми волосами в синем рюкзаке стоит спиной к зрителю перед огромным раскрытым манускриптом с арабским текстом, выставленным на зелёной стене в музее.
Дочка рассматривает Коран, написанный волоском месячного котёнка, выставленный в Музее редких коллекций в Елабуге

Первую игру она выиграла, взяв противника измором. У него оставался король, а у Евы король и ладья. Как с их помощью поставить мат она не знала, поэтому просто гоняла его по доске, пока тот не устал настолько, что мало-помалу сделал три невозможных хода. По правилам это поражение.

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

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

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

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

Пальцы Ёлки

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

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

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

Судя по информации в «Википедии», это альбом 2011-го года и, по всей видимости, все эти годы всем кажется нормальным, что у Ёлки какой-то фотошопер нарисовал на левой руке все пальцы примерно одинаковой длины. Включая саму Ёлку. И это несмотря на распространённое мнение, что девушки очень придирчивы к тому как они получились на фото.

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

Casio WQV-3 и виртуалка

Ура! Дело было не в бобине! Наконец-то удалось соединить часы и «Виндоуз ЭксПи» внутри эмулятора. Я думал, что дело в том, что я взял неудачный дистрибутив, но оказалось, что виноват приёмопередатчик или, скорее всего, драйвер к нему.

Чем-то ему не нравится внутри эмулятора UTM, — часы с ним не обнаруживались. К счастью, ко мне ехало другое устройство, можно полюбоваться на него на фото. Вообще у него был корпус, но он развалился буквально в руках и я его просто выкинул.

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

Зелёная печатная плата с электронными компонентами, подключённая к серому USB-кабелю, лежащая на жёлтом ворсистом ковре.

Это инфракрасный приёмопередатчик компании SigmaTel. При подключении «Виндоуз» его сразу узнала и радостно поставила драйвер откуда-то из своих недр. Такое начало меня сразу приободрило и не зря — всё завелось с первой же попытки.

Скриншот WQV Link Ver.2.0: импорт файла WQV20240721_002.jpg (6885 байт, 21.07.2024 08:52) с часов.

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

Пальцы Ёлки: контраргументы

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

Две фотографии руки с тёмным маникюром на чёрном глянцевом объекте; под постом TeleBolkNote — комментарий Дмитрия Сивухина: «Выглядит убедительно, а с сухожилиями тоже всё норм?

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

Напоминает старые-добрые времена, когда люди ставили не просто эмоции под постом, а пытались словами донести до собеседника что же именно им понравилось или не понравилось.

Комментарий пользователя melkiythegreat от 9 декабря 2024 года с фото женщины в чёрном платье и подписью «Похоже у нее действительно такие руки».

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

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

Шахматы: разобрали мат ладьёй

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

Складная шахматная доска с белыми и чёрными фигурами на деревянном столе; часть фигур разбросана рядом.

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

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

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

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

Заболел

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

Полежу до конца недели дома, надеюсь быстро поправлюсь.

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

PowerShoot

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

Ну что-то совсем скучно болеть дома. Мозг, конечно, почти не работает, тем не менее, чем-то развлечься хочется. Чтобы как-то себя порадовать, написал на Си мини-шутер под названием «PowerShoot». Запускается из терминала, для вывода используются символы Юникода.

Играть, правда, получится только на «МакБуке». Думаю, несложно будет адаптировать игру под терминал любой операционной системы, было бы желание.

Геймплей простой — на вас бегут враги, надо убивать их бомбами. Игрок бросает бомбу, когда «МакБук» подключается к зарядке. Чтобы бросить две бомбы, надо подключить его, потом отключить, потом снова подключить.

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

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

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

7000 и кафе ★

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

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

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

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

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

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

Батарейки CR2032 ★

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

А тут недавно в одном из каналов попалась ссылка на тестрирование батарей CR2032. У меня на картинке лишь вершина айсберга, загляните сами — разница между лидером и аутсайдером в 11 раз! Что, кстати, неплохо укладывается в мои ощущения в год и месяц работы.

Горизонтальная диаграмма ранжирования брендов батареек по результатам теста: Nanfu (615.5, 100%), Фотон (595.1, 97%), Renata (588.1, 96%) и другие до Daewoo (395.8, 64%).

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

Из хорошего. Приятно удивили батарейки «Фотон» — они на втором месте, что тоже логично — подделывать местный бренд опаснее. Буду теперь, пожалуй, покупать именно их.

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

128-битный тип в Си

В одной из программ на Си мне понадобился 128-битный тип — хранить большие числа. Такой тип в некоторых компиляторах есть давно, правда, пока не было стандарта, он как только ни назывался — __int128_t (GCC 4.1+), __int128 (GCC 4.6+), _ExtInt(128) (Clang). Теперь у нас появился стандарт Си23, где этот тип называется _BitInt(128).

Мой компилятор _BitInt(128) прекрасно поддерживает, казалось — счастье так близко, но…

Каково же было моё удивление и разочарование, когда оказалось, что в языке нет ни способа вывести его на экран (у printf нет необходимого спецификатора формата), ни способа задать константу такого размера!

В 2024-м году мне приходится писать собственную функцию для вывода чисел в одном из стандартных типов! А константы задавать вот так:

( (_BitInt(128) ) 0xFFFFFFFFFFFFFFFF << 64) | 0xFFFFFFFFFFFFFFFF

Какая-то удивительная для Си неконсистентность!

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

Нечётные числа

Что же я там считаю такое, что мне понадобились 128-битные числа? Сейчас расскажу.

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

Рукописные математические записи на листе бумаги:  \in X$, x \in X \Rightarrow x \in X$, $x \in X \Rightarrow (2x+1) \in X$, и фраза «натуральные числа».

Формулировка у неё была очень простая.

Дано множество X. Единица принадлежит X. Если 3×x принадлежит X, то и x принадлежит X. Если x принадлежит X, то и 2×x + 1 принадлежит X. При этом x — натуральное, разумеется.

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

Упомянутый коллега у себя в университете при помощи студента, Фортрана и Пролога пытался проверить эту теорему по следующему алгоритму.

Берём число, например, «9». Оно могло быть получено, согласно перечисленным утверждениям, двумя путями: либо какое-то другое нечётное число умножили на два и прибавили один, либо умножили на три. Поэтому надо проверить по формулам откуда мы могли попасть в это число, отсекая циклы и останавливаясь, когда мы попадаем в чётные числа.

В этой задаче очень быстро растёт разрядность, поэтому в те времена рассчитать даже первую сотню чисел было достаточно проблематично.

В общем, я решил с этой задачкой побаловаться.

Для начала написал программу, которая вычисляет эти числа перебором. Начинаем, понятное дело, с единицы, следующее число получаем по формуле 2×x + 1, потом, пока число делится на три, делим и выводим эти числа, считая для каждого ещё и  2×x + 1 и так далее. Кроме того, пришлось ещё запоминать все найденные числа, чтобы избегать циклов.

Первую версию я написал с использованием рекурсии, но программа падала примерно через полторы минуты работы — стек просто кончался. Пришлось переписать. Новая версия работает уже несколько часов на моём ноутбуке и вычислила за это время уже почти 17 миллионов чисел. Оставлю её на ночь, интересно, закончит ли она к утру.

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

Нечётные числа: прогресс

Пока по поиску нечётных чисел прогресс такой. Программа работает уже чуть больше 25 часов. Самое большое найденное на этот момент число — 340281726619687019118949463859138658303 или 0xFFFFE06E43129C9EBA1E335BA7FFFFFF в шестнадцатеричном виде. Как мы видим, предел точности близок.

Всего пока найдено 36,5 миллионов чисел, список чисел занимает 1,2 гигабайта.

Скриншот вкладки «Память» macOS: процессы (iTerm2, odds, Sublime Text) с потреблением ресурсов. Снизу: физическая память 36 ГБ, использовано 21,97 ГБ, кэш 10,04 ГБ, своп 0 Б.
odds — это моя программа по перебору чисел. Как видно, оперативной памяти занято совсем немного

Добавлено: на 41-й час работы найдено почти 46,5 миллионов чисел, максимальное число пока то же самое.

Добавлено: 44-й час работы. Что-то меня немного задолбало уже. Я надеялся, что все все ветки достаточно быстро упрутся в ограничение точности, но судя по найденному к текущему моменту, до конца ещё далековато. Думаю я не дождусь.

Тепловизионное изображение ноутбука: клавиатура и область над ней нагреваются до 50,9°C и 77,5°C, чашка справа — 15,5°C.
А это мой ноутбук, который уже два дня молотит эти самые числа. Внутренние датчики показывают температуру около 60°C

Добавлено: 48-й час работы, найдено 50,1 миллиона чисел.

Добавлено: 63 часа работы, найдено 57,3 миллиона чисел, новое самое большое число — 0xFFFFE0EC9B9F17FFFFFFFFFFFFFFFFFF или 340281736629840009040727513758703812607.

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

Нечётные числа: uint32_t

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

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

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

Обобщённое программирование выглядит следующим образом:

#define PRINT_U(x) ({ \
    _Generic((x), \
        uint128_t: printf_u128, \
        uint64_t: printf_u64, \
        uint32_t: printf_u32 \
    ); \
})(x)

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

static void printf_u128(const uint128_t v) {
    unsigned long long low, high;

    #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
        low  = MASK64(v);
        high = MASK64(v >> 64);
    #else
        high = MASK64(v);
        low  = MASK64(v >> 64);
    #endif

    printf("0x%016llX%016llX\n", high, low);
    fflush(stdout);
}

static inline void printf_u64(const unsigned long long v) {
    printf("0x%016llX\n", v);
    fflush(stdout);
}

static inline void printf_u32(const unsigned int v) {
    printf("0x%08X\n", v);
    fflush(stdout);
}

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

Функции переполнения у меня используются вот так:

#define MUL2_ADD1(x) ({ \
    typeof(x) y; \
    __builtin_mul_overflow(x, 2, &y) || __builtin_add_overflow(y, 1, &y) ? 0 : y; \
})

Были сомнения будут ли они работать с 128-битным типом, как я уже писал он какой-то неполноценный, но, к моему удивлению, всё работает прекрасно.

Любопытно, что мой ноутбук на процессоре M3 Max справился с перебором за 57 минут, тогда как компьютер с Intel Core i9-9820X на частоте 3,3 ГГц — за 168 минут. Это на одном ядре, разумеется. У меня в планах сделать многопоточность, но пока недосуг было.

В результате нашлось 14434686 значений, из них нечётных подряд — 172 значения, потом появляются «дырки».

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

Походное кресло

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

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

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

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

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

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

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

Шахматы Алана Тьюринга

Читал тут кое-что про Алана Тьюринга и вычитал, что он в 1948 году вместе с Дэвидом Чемперноуном разрабатывали алгоритм для шахматой программы. В 1951-м году Тьюринг пытался реализовать его на компьютере «Ферранти Марк 1», но не преуспел — алгоритм был слишком сложен для техники того времени. После смерти Тьюринга код был утерян, но в 1980 году Чемперноун описал как должна была работать программа, хоть и не вспомнил все подробности расчёта метрики.

В 2012 по этому описанию написали программу в которую можно поиграть. Реализаций сейчас — куча, есть и для игры онлайн.

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

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

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

Музыка на компьютере «Ферранти Марк 1»

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

Но как я сегодня узнал, впервые это произошло в 1951 году. В июне того года австралийский компьютер «CSIR Mark I» исполнил популярный военный марш «Марш полковника Боуги».

Запись этого исполнения не велась, но в октябре того же года компания БиБиСи записала отрывки из трёх других композиций — гимна «Боже, храни короля», популярной английской детской потешки «Baa Baa Black Sheep» и песни «In the Mood». Правда в исполнении другого компьютера — «Ферранти Марк 1», который я уже упоминал в связи с шахматами Алана Тьюринга.

Чёрно-белое фото: трое мужчин в ретро-офисе — двое сидят за столом с панелью управления, третий стоит рядом, склонившись; по бокам — металлические шкафы, на полу — ковры.
Алан Тьюринг (справа) с коллегами работает на компьютере «Ферранти Марк 1» в 1951 году

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

Звуковой карты не было, но к компьютеру был подключен динамик, которым можно было подавать сигнал оператору. Например, он мог сигнализировать об окончании работы программы. Для этого у компьютера «Ферранти» была специальная команда — /V.

В 1948 году Тьюринг заметил, что если повторять эту команду с заданной частотой, то компьютер начинает проигрывать определённые ноты.

В 1951 году Тьюринг пригласил в Манчестер Кристофера Стрейчи, ещё одного видного пионера вычислительной техники, который запрограммировал «Ферранти Марк 1» для игры в крестики-нолики. Но более интересным стало то, что в конце игры Стрейчи заставил машину сыграть «Боже, храни короля». Это было настолько значительное событие, что привлекло внимание БиБиСи.

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

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

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

99 бутылок: язык B («Би»)

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

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

81. B (язык «Би»), после появления Си, был полностью вытеснен последним и сейчас совершенное не используется. В отличие от, например, Кобола, который старше на десять лет, но при этом вполне ещё встречается.

Думаю, причин тут несколько.

Во-первых, это нацеленность на одну платформу — указатели в Би работают с машинными словами, а не байтами. Во-вторых, неудачные решения в синтаксисе, например, a =* 10 и a = *10 — это разные операции. Первая — умножение переменной a на десять, вторая — чтение в переменную a значения по адресу 10. В-третьих, у Си явно больше возможностей, а учитывая, что программы переписываются довольно легко (кроме части с адресацией, где легко наделать ошибок), переход выглядит очень оправданным.

Язык Би и правда очень похож на Си, в этом можно убедиться, взглянув на написанную мной программу. Что тут режет глаз сишному программисту? Прежде всего — отсутствие типов у заголовка функции, импорта функции printf и странное ключевое слово extrn внутри функций. extrn означает, что этот символ (в терминах компилятора) пришёл из внешней зоны видимости. Современное extern явно произошло от него, только значение немного поменялось.

Немного непривычно, что все переменные объявлены как auto, но в современном Си так тоже можно. auto, в данном случае, — класс хранения. В современном Си это класс хранения по-умолчанию, поэтому его не указывают. При этом, если отсутствует указание типа, Си по-умолчанию подставит int. Как раз для совместимости с Би. То есть auto beer Си даже правильно поймёт, но выдаст предупреждение.

Впрочем, в стандарте Си23 auto теперь означает автоматический вывод типа, что для совместимости с Би подходит ещё больше, так как, если приглядеться, строковые массивы («строки») в Би не выделены в отдельный тип.

Из того, что заметить чуть сложнее — экранирующий символ в строке не обратный слэш, а «звёздочка» (*), поэтому символ перевода строки не \n, а *n.

Ещё немного странно, что тут цикл while, а не for, но сильно это в глаза не бросается. В «Би» цикла for просто нет, поэтому вот так.

Вообще, ощущение такое, что Си взял от Би буквально всё, но, как ни странно, это не так. В Би есть конструкции ===, =!=, =<= и =>=. Наверное они не очень-то нужны, но выглядят интересно. Например, a === 5 означает «если переменная a равна 5, записать в a число 1, иначе — 0».

Кроме того, другая почти вся стандартная библиотека. Совпадают всего несколько функций, по больше части это ввод-вывод. Например, в Би можно объединить несколько строк функцией concat, а char не тип, а функция получения символа строки по индексу.

/* Beer song. Evgeny Stepanischev, Dec 2024 */
print_bottles(b, tail) {
  extrn printf;
  auto s;

  s = "s";

  switch (b) {
    case 0: printf("No"); break;
    case 1: printf("%d", b); s = ""; break;
    default: printf("%d", b);
  }

  printf(" bottle%s of beer%s", s, tail);
}

main() {
  extrn printf, print_bottles;
  auto beer;

  beer = 99;
  while (beer) {
    print_bottles(beer, " on the wall, ");
    print_bottles(beer, "!*n");

    beer--;

    printf("Take one down, pass it around.*n");
    print_bottles(beer, " on the wall!*n*n");
  }

  printf("No more bottles of beer on the wall, ");
  printf("no more bottles of beer.*n");
  printf("Go to the store and buy some more,*n");
  printf("99 bottles of beer on the wall...*n");
}

Я долго пытался найти хоть какой-нибудь работающий под современными платформами компилятор, перебрал около десятка, но везде были свои сложности — некоторые не собирались, другие падали на совершенно валидном коде (например, printf("%c", 't')).

В итоге, остановился на онлайн-версии ybc (Yasha’s B Compiler).

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

Купил себе паяльник

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

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

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

Открытая коробка с беспроводной паяльной станцией Miniware TS1C: чёрный паяльник, держатель, подставка и наконечник в белой лотковой упаковке на деревянном фоне.
Паяльная станция Miniware TS1C с дисплеем 250°C на деревянном столе рядом с книгой Юаря Хон «Nexus: Краткая история информационных сетей».

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

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

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

Паять пока не пробовал, — нечего. Но я написал письмо Деду Морозу, чтобы он мне подарил кое-что пригодное для пайки в Новый год, очень жду.

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

Загадки из музея частных коллекций

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

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

Деревянная настенная табличка с резьбой в виде колосьев, украшенная балясинами и тканью, подвешена на белой стене рядом с комодом.
Что это за ящик, для чего он предназначался? Почему он подвешен?
Старинное кресло с обивкой в цветочек и резным основанием стоит на черно-белой плитке рядом с деревянным комодом с инкрустацией.
В чём особенность этого стула?
Деревянный плетёный диван с высокой спинкой и подлокотниками стоит на черно-белой плитке в комнате с белыми стенами и занавесками.
Что это такое? Для чего предназначалось?
В музее: два посетителя в синих бахилах смотрят на картины, рядом — тёмный резной шкаф с серебряными блюдами и картина Распятия.
Этот шкаф когда-то был прикручен к стене. Для чего это было сделано?
Три фарфоровых вазы с синим орнаментом и крышками, украшенными фигурками животных, стоят на полке деревянного шкафа с инкрустацией.
Что хранили в этих вазах?

Ответы на загадки эксурсовода:

1) Что это за ящик, для чего он предназначался? Почему он подвешен?

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

2) В чём особенность этого стула?

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

3) Что это такое? Для чего предназначалось?

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

4) Этот шкаф когда-то был прикручен к стене. Для чего это было сделано?

Шкаф стоял на корабле и был прикручен к стене из-за качки.

5) Что хранили в этих вазах?

Табак.

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

«Всё об АСУ»

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

Обложка книги «Беседы об АСУ» В. Португала, изд. «Молодая гвардия», Москва, 1977; на обложке — портрет автора и абстрактный цветной дизайн с лучами.

Это мне напомнило про другую книжку, по-настоящему выдуманную.

В 90-е я как-то работал в отделе автоматизированных систем управления (АСУ), там мне рассказывали байку про то, что где-то в отделе лежит книга «Всё об АСУ» и мне её обязательно покажут, только найти надо, давно не доставали, непонятно куда дели.

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

Кстати, не все, оказываются понимают в чём смех названия «Всё об АСУ». Попробуйте произнести быстро и вслух.

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

Дора

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

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

Девушка в сетчатых рукавах и цепочке с подвеской, на её лице и фоне проецируется код на Python с переменными «vlublena», «vturilas», «dopamin», «adrenalin» и циклом while True.
Это обложка одного из альбомов Доры с Пайтоном в качестве фона

Сегодня на арене моё постыдное удовольствие.

Мои музыкальные вкусы достаточно разнообразны, но я стараюсь держаться в рамках хорошего вкуса. Это не требует каких-либо усилий, мне не приходится переступать через себя, чтобы не слушать «Ленинград» или «Сектор газа», но в одном случае моя система даёт сбой.

Иногда, после дня в офисе, когда я еду в такси, мне совсем тяжело и мозгу хочется расслабиться, я ставлю что-нибудь в исполнении Доры. Это исполнительница подросткового поп-рока. Неясно как вышло, что именно её, где я услышал её песни впервые и почему они мне понравились, но в таком состоянии почему-то именно её песни мне хочется слушать.

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

UnSnow 2

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

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

Новая версия скрипта можем замедлять некоторые сайты, зато, кажется, справляется с любыми случаями падения вкуса. В браузер скрипт можно установить при помощи плагина Tampermonkey или любого другого, умеющего выполнять UserScript.

// ==UserScript==
// @name         UnSnow
// @author       Evgeny Stepanischev aka Bolk
// @version      2024-12-31
// @namespace    /files/unsnow2.js
// @description  Turn off stupid snow
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    if (window.location.hostname === 'aliexpress.ru') {
        return;
    }

    Array.from(document.querySelectorAll('*')).forEach(e => {
        for (let a of e.attributes) {
            if (/(?<!un)snow/i.test(a.name + a.value)) {
                e.style = 'visibility:hidden;position:absolute;margin-left:-10000px;' +
                          'display:none;transform:translateX(-100vw);opacity:0';
            }
        }
    });
})();

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

← сюда туда →