TeleBolkNote
183 subscribers
1.46K photos
4 videos
1.6K links
Моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь, большие языковые модели и программирование. Совпадает с сайтом bolknote.ru
Download Telegram
Мороз и собачий язык
Евгений Степанищев (RSS)

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

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

https://bolknote.ru/all/moroz-i-sobachiy-yazyk/
ТЭЖЭ с Некрасова
Евгений Степанищев (RSS)

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

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

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

Найденный бутылёк. Рядом реклама тройного одеколона ТЭЖЭ из газеты «Правда», №32, 2 февраля 1938 г

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

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

Страница справочника «Вся Москва : адресная и справочная книга», Москва: товарищество А. С. Суворина «Новое время», 1930 год

«ТЭЖЭ» был огромным трестом, объединяющим в себе целый список фабрик. В 1928 году на него работали более 7000 рабочих. Трест имел следующие основные производства: парфюмерно-косметическое, мыловаренное, свечное, клееваренное, желатиновое и аппретурное, где обрабатывали текстильные материалы специальным составом — аппетром, чтобы придать им жёсткости и несминамости.

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

https://bolknote.ru/all/tezhe-s-nekrasova/
99 бутылок: препроцессор Си
Евгений Степанищев (RSS)

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

С тех пор как мне много лет назад кто-то показал как можно на нём писать программы, меня не оставляла идея написать на нём «песню о пиве».

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

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

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

#if 0
Bolknote.ru, 2024.11.05
To run:
gcc -P -E - < 99 | sed 's/\\n */\n/g
#endif

#define CAT(a, b) a##b
#define SECOND(a, b, ...) b
#define TEST(...) SECOND(__VA_ARGS__, 0)
#define LF \n

#define DEC(n) CAT(DEC_,n)
#define DEC_0 9
#define DEC_1 0
#define DEC_2 1
#define DEC_3 2
#define DEC_4 3
#define DEC_5 4
#define DEC_6 5
#define DEC_7 6
#define DEC_8 7
#define DEC_9 8

#define DEC_X0(a, b) IF_ELSE(ISZERO(b)) (DEC(a)) (a)

#define ISEND(a, b) TEST(ISEND_ ## a ## b)
#define ISEND_01 ,1

#define ISZERO(n) TEST(ISZERO_ ## n)
#define ISZERO_0 ,1

#define ISONE(n) TEST(ISONE_ ## n)
#define ISONE_1 ,1

#define IF_ELSE(b) CAT(IF_, b)
#define IF_0(i) ELSE_0
#define IF_1(i) i ELSE_1
#define ELSE_0(e) e
#define ELSE_1(e)

#define PLUR(n) IF_ELSE(ISONE(n)) (bottle) (bottles)

#define PRINT_PLUR(a, b) IF_ELSE(ISZERO(a)) (b PLUR(b)) (CAT(a, b) bottles)

#define PRINT_B(a, b) IF_ELSE(ISZERO(b)) \
(IF_ELSE(ISZERO(a)) \
(No bottles) \
(PRINT_PLUR(a, b)) \
) \
(PRINT_PLUR(a, b)) of beer

#define PRINT_ROW(a, b) \
PRINT_B(a, b) on the wall, PRINT_B(a, b)! LF \
Take on down, pass it around, LF \
PRINT_B(DEC_X0(a, b), DEC(b))! LF LF

#define STOP(...) No more bottles of beer on the wall, LF \
No more bottles of beer! LF \
Go to the store and buy some more, LF \
PRINT_B(9, 9) on the wall!

#define EMPTY()
#define DEFER(...) __VA_ARGS__ EMPTY()

#define CROSS1(a, b) PRINT_ROW(a, b) \
DEFER(IF_ELSE(ISEND(a, b)) (STOP) (CROSS2)) (DEC_X0(a, b), DEC(b))

#define CROSS2(a, b) PRINT_ROW(a, b) DEFER(CROSS1) (DEC_X0(a, b), DEC(b))

#define MUL0(...) MUL1(MUL1(MUL1(MUL1(__VA_ARGS__))))
#define MUL1(...) MUL2(MUL2(MUL2(MUL2(__VA_ARGS__))))
#define MUL2(...) MUL3(MUL3(MUL3(MUL3(MUL3(__VA_ARGS__)))))
#define MUL3(...) __VA_ARGS__

#define RUN(a, b) MUL0(CROSS1(a, b))

RUN(9, 9)


https://bolknote.ru/all/99-butylok-preprocessor-si/
🔥3
«Мото-трек» с Некрасова
Евгений Степанищев (RSS)

Продолжаю описывать находки с чердака дома на Некрасова.

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

Это детская игра «Мото-трек», выпущенная в декабре 1982 года на заводе «Маяк» посёлка Гвардейское Хмельницкой области. Игра помещается в довольно объёмную пенопластовую коробку с картонной крышкой, пострадавшей от времени и условий хранения.

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

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

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

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

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

https://bolknote.ru/all/moto-trek-s-nekrasova/
Ногтей насыпал...
Евгений Степанищев (RSS)

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

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

Остроумно, на самом деле, примерно на уровне «сцеплера», если не круче.

Но я тут намедни, третьего дня прочитал в гиперлетописи 2002-го года по языку INTERCAL следующее:


A famous thinker has compared parentheses with disgusting nail clippings.


Или, если по-нашему:


Один известный мыслитель сравнил круглые скобки с отвратительными обрезками ногтей.


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

https://bolknote.ru/all/nogtey-nasypal/
😁3🙏1
1
В какой кодировке?
Евгений Степанищев (RSS)

Попался мне недавно на глаза вот этот разворот из детской книжки «Энциклопедия профессора Фортрана» 1991-го года. На ней, как мы видим, высоколобый Новосельцев с указкой говорит, что справа закодирована фраза «ПРОЧИТАЙ ГЛАВУ "ЯЗЫКИ ПРОГРАММИРОВАНИЯ"».

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

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

Воспользовавшись программой для распознавания, я перевёл текст на картинке в буквы и цифры, вырезал оттуда закодированное и попробовал перегнать этот кусок в буквы. Получилась следующая строка: pro~itajte glawu "qzyki programmirowaniq".

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

Теперь осталось понять что это за кодировка. Не уверен, что я когда-либо в жизни сталкивался с КОИ-7, но название такое слышал. Предположил, что это она и не ошибся.

Латинские символы видно, потому что эта кодировка содержит в себе несколько наборов символов, которые надо переключать специальным кодом. Русские символы находятся в тех же позициях, что и латинские, а поскольку кодировка ЮТФ-8, который мы все пользуемся, совместима с латинским набором КОИ-7, мы видим не бинарный мусор, а какие-то буквы.

В конечном счёте, я написал небольшую программу на Перле, чтобы вывести строку на русском:

#!/usr/bin/perl
use Text::Iconv;

my @codes = qw(
1110000 1110010 1101111
1111110 1101001 1110100
1100001 1101010 1110100
1100101 0100000 1100111
1101100 1100001 1110111
1110101 0100000 0100010
1110001 1111010 1111001
1101011 1101001 0100000
1110000 1110010 1101111
1100111 1110010 1100001
1101101 1101101 1101001
1110010 1101111 1110111
1100001 1101110 1101001
1110001 0100010
);

$conv = Text::Iconv->new("KOI-7", "UTF-8");

# ПРОЧИТАЙТЕ ГЛАВУ "ЯЗЫКИ ПРОГРАММИРОВАНИЯ"
print $conv->convert(chr oct "0b$_") for @codes;
print "\n";
Перл, конечно, малопопулярный язык, но тут вполне читаемый даже для тех, кто его не знает. Его я выбрал из-за лени — у него есть конструкция qw( ... ), которая позволяет создавать массивы из строк без кавычек и запятых, так что в него просто было удобно запихнуть такой текст, каким он получился после распознавания.

В конечном счёте текст выглядит так: ПРОЧИТАЙТЕ ГЛАВУ "ЯЗЫКИ ПРОГРАММИРОВАНИЯ". Лобастый Новосельцев немного нас обманывает.

https://bolknote.ru/all/v-kakoy-kodirovke/
🔥1
Монета с Некрасова
Евгений Степанищев (RSS)

Ну и последняя находка с чердака дома на Некрасова.

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

Уже дома я понял, что это сильно потёртая серебряная монета и обработал её жидкостью для чистки серебра. После чего на ней проступил какой-никакой рисунок и я смог, постепенно просматривая серебро от Николая II и старше, её идентифицировать.

Оказалось, что это 10 копеек 1802-1805 годов, то есть монета времён Александра I. Судя по всему, её сильно чем-то тёрли — в диаметре она не изменилась, а вот в весе потеряла — в интернете пишут, что она должна быть 2,07 грамма, а у меня всего лишь 1,7, солидный недовес.

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

https://bolknote.ru/all/moneta-s-nekrasova/
Накрыло «Гопником-2»
Евгений Степанищев (RSS)

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

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

Меня позвали на «стрелку» в игре «Гопник-2», если бы не шокер, я бы не выжил

https://bolknote.ru/all/nakrylo-gopnikom-2/
Приехали «The Sensor Watch»
Евгений Степанищев (RSS)

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

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

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

Купил сразу три штуки — одну себе, остальные заказали два моих друга.

https://bolknote.ru/all/priehali-the-sensor-watch/
👍1
PVS-Studio и «Гопник-2»
Евгений Степанищев (RSS)

Много читал об инструменте статического анализ PVS-Studio — на «Хабре» постоянно выходят статьи с разбором ошибок, которые он помогает найти. Выглядит действительно очень здорово. Несмотря на неизбежные ложные срабатывания, находится много такого, что пропустил программист.

PVS-Studio — платный инструмент, но утром за завтраком мне стало интересно, нет ли там какой-нибудь триальной версии, чтобы можно было на практике познакомиться с тем как он настраивается и чем может быть полезным. Оказалось, что у него есть восьмидневная бесплатная лицензия и я решил глянуть что он сможет найти в коде «Гопника-2».

Нашлось несколько интересных ошибок. На скриншоте одна из них — как видно, str_enemy_amount проверяется два раза, тогда как после первого условия там гарантировано ноль. Очевидно автор этого куска кода его скопипастил, но забыл во втором куске исправить enemy на hero.

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

https://bolknote.ru/all/pvs-studio-i-gopnik-2/
Марковские цепи
Евгений Степанищев (RSS)

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

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

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

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

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

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

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

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

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

https://bolknote.ru/all/markovskie-cepi/
😁1
Собираю «The Sensor Watch»
Евгений Степанищев (RSS)

Ну что, погнали? Что-то со вчерашнего вечера жутко болит голова. Попробую себя чем-нибудь отвлечь, например, вставлю платку «The Sensor Watch», которая так долго ко мне ехала, в часы-донор.

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

https://bolknote.ru/all/sobirayu-the-sensor-watch/
👍1