Избранное
«Тетрис» на Brainfuck ★
Ну разумеется я вчера не смог уснуть без того, чтобы не посмотреть что ещё мог бы написать ИИ на «Брейнфаке»! Попробовал написать «Тетрис», тем более что у меня были готовые идеи как это сделать. Правда для этого пришлось модифицировать интерпретатор. Свой собственным, разумеется, который я начал писать ещё
Дело в том, что у «Брейнфака» нет рандомизации и ввод устроен очень просто — есть инструкцию чтения символа и всё. Правда сам язык не определяет подробности чтения символа, поэтому реализации отличаются. В основном авторы интерпретаторов делают буферизированный ввод, дожидаясь нажатия кнопки «Ввод». Правда тут тоже есть нюансы —
Чтобы приступить к «Тетрису» пришлось сделать две модификации.
Все расширения я сделал включаемыми и отключаемыми при помощи ключей интерпретатора, тем более у меня их уже и так было немало — некоторые существующие программы отличаются в своих ожиданиях относительно деталей реализации.
Чтобы каждый раз не вспоминать какие ключи нужны программе, я придумал способ как их указывать — если в начале программы на «Брейнфаке» стоит обычный шебанг, я беру параметры интерпретатора оттуда.
Как легко догадаться по скриншотам, нейросеть (я использовал
Я даже сделал в своём интерпретаторе поддержку сжатия исходников. Наверное никому раньше не приходило в голову этим заниматься — как правило программы на «Брейнфаке» пишут люди и до таких размеров они их не доводят.
Трансляция такого огромного файла и применение оптимизаций занималось около 15—20 секунд на моём ноутбуке, так что пришлось применить ряд оптимизаций — немного переписать парсер интерпрератора, сделать кеширование и поработать над уменьшением размера кода «Тетриса».
«Тетрис» работает в консоли и, надеюсь, никому не надо объяснять, что для раскрашивания блоков и позиционирования тут широко применяются
Единственное о чём надо рассказать — как регулируется скорость игры. В «Брейнфаке» нет ничего, чтобы создавать паузы заданной длительности, но некоторые программы работают ощутимо долго. Хотя у меня и оптимизирующий интерпретатор, всё оптимизировать он не может. Поэтому мы с нейросетью просто «на глазок» подобрали код, который достаточно плохо оптимизируется и тормозит на моём ноутбуке ровно насколько, чтобы играть было комфортно.
ИИ: умрёт ли профессия программиста ★
Честно говоря, плач по «умирающей» профессии программиста меня очень сильно утомил. Я понимаю, откуда берутся пессимистические настроения, но сам я далёк от мысли, что программисты вымрут. Профессия не исчезнет — она просто изменится.
И дело не в наивном оптимизме. Дело в механике развития технологий.
Собственно, это уже не раз происходило. Каждая новая волна автоматизации забирала у программистов часть низкоуровневой работы — но не саму профессию. Исчезала механика, оставалась ответственность. Исчезала рутина, оставалось мышление.
Многим кажется, что изменения происходят впервые, просто потому что они не застали предыдущие волны. Но даже беглого перечисления ключевых слов, которые есть в памяти каждого айтишника, достаточно, чтобы понять: с каждым десятилетием программировать становилось комфортнее — и при этом программистов становилось больше, а не меньше.
В моём детстве я писал первые команды прямо в машинных кодах — шестнадцатеричными цифрами (!) — в тетрадке, отлаживая их в уме. Потом ждал, иногда целыми днями, когда смогу ввести их в компьютер, набирая прямо из тетрадки. Получив
Это очень похоже на то, как
Потом пришли ассемблеры. Потом компиляторы. Потом высокоуровневые языки. Потом фреймворки. Потом облака. И всё заверте…
Снижение стоимости разработки не убило рынок — каждый раз он только расширялся. Когда программировать становится проще, программировать начинают больше. Появляются новые продукты, новые интеграции, новые автоматизации, новые требования к качеству, безопасности, масштабируемости. Сложность системы растёт быстрее, чем упрощается инструмент.
Мы больше не программируем в машинных кодах. Очень мало кто пишет даже на ассемблере и даже Си многие считают
И что именно из этого следует?
Если нейросеть способна переводить текст в код, это значит, что исчезает этап механической трансляции. Но разработка программного обеспечения никогда не сводилась к набору текста.
Я специально нашёл слайд презентации, которая с моим участием готовилась для президента нашей республики в 2021 году. Схема упрощённая; сегодня я добавил бы туда ещё
Нейросеть может помочь почти на каждом этапе. Но помощь и замещение — разные вещи.
Разработчик высокого уровня даже сейчас способен закрыть большинство, а то и все (разве что насчёт ЮИкса у меня есть сомнения), этапы самостоятельно. Почитайте, например, историю известнейшей игры «Принц Перси» — её создал один разработчик, пройдя все без исключения этапы, включая дизайн.
Важно не то, что он был один. Важно то, что ему пришлось проявить себя во множестве ипостасей.
Представьте, что у этого разработчика в то время была бы под рукой мощная нейросеть. Было бы ему нечего делать? Вряд ли. Он бы быстрее перебирал варианты, быстрее тестировал идеи, быстрее исправлял ошибки. Но кто бы решал, какую игру делать? Кто бы определял, что она достаточно хороша? Кто бы нёс ответственность за результат?
Автоматизация всегда убирает уровень ниже. Программисты просто поднимаются выше.
ИИ не отменяет сложность. Он лишь сдвигает её на другой уровень абстракции.
Поэтому вопрос не в том, вымрут ли программисты. Вопрос в том, кто останется на уровне «переводчика текста в код», а кто поднимется на уровень «архитектора систем и решений».
Локальные адреса в «Веб-архиве»
★
Я тут благодаря «Виоле» обнаружил
В моей версии этого браузера я делал логику, согласно которой, если домен не открывается, то я пытаюсь найти и открыть его самую раннюю сохранённую копию
В браузере есть несколько встроенных ссылок на разные давно не существующие сайты, и эта логика нужна, чтобы внешние ссылки с них нормально открывались.
Я не учёл, что локальные адреса — localhost, 127.0.0.1 и прочие — не должны искаться
Оказалось,
Поскольку снапшоты за разное время
Попробовать что ли сканер написать, который составит список всего этого богатства…
«Виола»: предок VRML ★
Недавно завершил в «Виоле» большую работу: реализацию раннего черновика стандарта VRML. VRML
Началось всё с того, что я заметил в браузере едва начатую реализацию тегов, помеченную комментариями как /* vr exp */. В исходном коде нашлась целая группа таких тегов. Назначение некоторых из них, например OVAL или LINE, было вполне очевидным, тогда как то, что в точности могли бы делать некоторые другие теги, например ACTION или BUTTON, было не вполне ясно.
Можно было бы реализовать только понятные части, но я тогда просто отложил эту задачу в сторону, тем более что она казалась пугающе сложной.
Шло время, и вдруг, копаясь в каталогах старого сайта, посвящённого «Виоле», я неожиданно нашёл черновик письма, в котором автор «Виолы» описывал своё видение того, как должен выглядеть VRML.
Там раскрывалось значение всех ключевых тегов из вышеуказанной группы, их атрибутов, а также интерактивная часть — причём в двух вариантах: декларативном (через теги) и скриптовом (через язык «Виолы»).
Вкратце суть такова: теги описывают графические примитивы и их вид на странице. С некоторыми из них через активные элементы можно взаимодействовать, меняя их атрибуты.
Вот, например, как на этом языке рисуется синий квадрат
<GRAPHICS WIDTH=400 HEIGHT=120>
<BGCOLOR NAME="lightgray"></BGCOLOR>
<RECT ID="rect1">
<POS X=10 Y=20></POS>
<SIZE X=70 Y=70></SIZE>
<FGCOLOR NAME="blue"></FGCOLOR>
<BDCOLOR NAME="navy"></BDCOLOR>
<ROT Z=45>
</RECT>Особенно меня
The SC attribute says that whenever the attributes in this object changes, relay the change to a server that broadcasts the change to all other browsers looking at this object… Have to think about this more…
Я сразу понял как хотел бы чтобы он работал: если на странице есть такой атрибут, считаем хеш урла, где находится сейчас наш браузер и, при любых изменениях тегов, связанных с этим атрибутом, рассылаем по локальной сети сообщение с закодированной командой. Одновременно мы слушаем сеть, принимаем команды, отфильтровываем те, в которых содержится хеш текущей страницы и только их и исполняем.
В итоге эту часть я сначала пытался сделать через маковский сервис «Бонжур», но позже переделал на мультикастовый UDP — так работало гораздо быстрее и надёжнее.
Поскольку я тестировал у себя на ноутбуке, запуская два экземпляра браузера, столкнулся и с другой проблемой — стоило убрать курсор с одного из окон, и оно переставало перерисовываться. Оказалось, это особенность оконного фреймворка, на котором построено приложение: так сделано для экономии процессорного времени.
Пришлось делать специальный таймер, который будит приложение, если ему адресованы интерактивные UDP-пакеты.
Работу я разбил на три части: реализацию графических примитивов, реализацию интерактивного взаимодействия и сетевое взаимодействие.
На всё ушло несколько дней интенсивной работы с нейросетью «Опус 4.5». Пришлось даже немного переделать парсер тегов внутри браузера. Несмотря на то, что работа двигалась трудно, отчаяния я не испытывал — было видно, что при работе в паре с «Опусом» эта задача вполне мне по силам.
На настоящий момент всё работает, так, на мой взгляд, как и задумывалось, за исключением декларативной части предлагаемого черновика.
Обратная разработка GIFLITE.EXE ★
Вчера мучился бессонницей, нужно было
В случае GIF очень хорошо помогала известная утилита GIFLITE.EXE — коммерческая разработка компании «Вайт Ривер Софтвейр» (White River Software), которая, по всей видимости, давно исчезла, так как я про неё ни в какой другой связи никогда ничего не слышал.
Утилита была под DOS, но я тогда работал под «Виндой» и проблем это не создавало, но позже, когда я пересел на «Мак», пользоваться ей стало неудобно. Тем не менее я всё равно ей ещё долго пользовался через всякие эмуляторы.
Она всегда меня интриговала — было интересно что она вообще такое делает, как ей удаётся уменьшить размер гифа и чем отличаются её методы сжатия, которые задаются ключом -m.
В общем, раз уж не спалось, я провёл давно запланированный эксперимент, к которому всё никак не мог найти времени приступить — имея на руках только бинарный файл старой программы, воссоздать её на другой платформе. Довольно актуальная задача, кстати, я знаю, что у некоторых людей есть программы без исходного кода, которые они вынуждены запускать на давно устаревших компьютерах.
Забегая вперёд, хочу сказать, что эксперимент удался — программа создаёт в точности такие же GIF-файлы во всех режимах и я, кстати, получил ответ на свой вопрос — бо́льшая часть методов в ней объединяет близкие цвета, уменьшая файл за счёт этого.
А теперь, немного подробностей.
Opus 4.5 показался смелым исследователем, который идёт к цели, не пасует перед проблемами. Если
Grok Code — торопыга, который как будто считает себя чересчур способным, много фантазирует, принимая свои фантазии за реальность и вообще слишком некритично, без рассуждений всё воспринимающий.
Сначала я дизассемблировал код, но это поначалу мало помогло — видно было, что нейросети пытаются «нащупать» в получившемся коде границу функций, чтобы разобраться с ними по отдельности, но не могут. Но позже этого код пригодился — чтобы восстанавливать логику более точно.
Потом я установил radare2 с плагином r2ghidra и нарезал бинарный файл на сишные функции. Код восстановился плохо, с лакунами, поэтому я запустил отдельную сетку, которой буквально по шагам объяснял что делать. Основная идея — довести сишный код до читаемого состояния, разбираясь с функциями от самых коротких к более длинным.
Для этого мы сначала разобрались с таблицей виртуальных функций внутри ассемблера, после чего дело пошло веселей. Заняло это несколько часов интенсивной работы с нейросетями, по ощущениям выглядело как парное программирование.
Параллельно, в другом окне другой экземпляр нейросети писал основной костяк кода, попутно разбираясь с проблемами, туда я заглядывал редко, но без моего внимания то окно тоже не обходилось.
В полным соответствии с принципом Парето, 20% кода отняло у меня 80% времени. Тут очень хорошо показал себя Opus 4.5, — поскольку в коде разобраться было сложно, там 40 тысяч строк на ассемблере, он ставил очень много эксприментов, сравнивая два набора файлов между собой — тот, который получался при запуске оригинального GIFLITE.EXE с нашим.
Мы долго не могли добиться бинарной точности результирующих файлов — очень много нюансов, которые влияли на то, что получалось. Вплоть до реализации алгоритма сортировки цветов, функции хеширования и прочих мелких деталей. Восстанавливать детали помог ассемблерный код — в Си некоторые подробности не перенеслись, отчасти
Я очень доволен тем, как прошёл эксперимент. Очень интересный опыт и результаты воодушевляющие. Код, как обычно, можно увидеть на «Гитхабе».
«Виола» и моя мечта: как ИИ снова мне помог ★
Вступление
Я, как вы знаете, довольно давно уже реставрирую браузер «Виола» из недописанных исходников. И была у одна мечта, связанная с ним: увидеть как в нём работает вращение трёхмерной модели самолёта.
Узнал я об этом из статей о судебной тяжбе компаний «Микрософт» и «Иолас» (Eolas), начавшейся
Компания «Иолас» утверждала, что первой разработала и внедрила технологию «встроенных объектов и плагинов»
Тема широко освещалась в прессе и в некоторых из статей есть статичный скриншот того как это выглядело. Кроме того, сохранился код страницы с программой на языке «Виола». Казалось бы — почти всё что нужно!
Что мешало
Но оказалось, что исполнению моей мечты мешало несколько обстоятельств.
Вопрос №1: где взять V-Plot ?
По всей видимости, в открытых источниках его не найти — сколько не запускал я невод глубокого поиска нейросетями, ничего не вышло. Тогда я решил пойти от обратного — у нас есть скрипт на «Виоле», который должен слать этой программе
Без особой надежды я дал нейросети такое задание и пошёл заниматься делами. Через
Оказалось, что специальный «объект» TTY «Виолы» для взаимодействия с программами, которые могут выводить графику в окно браузера, реализован только для «Линукса», а для «МакОСи» (в «Виоле» встречаются куски для очень старой версии этой операционной системы) код реализован не был.
Я как можно тщательнее, как зловредному джину, описал что именно хочу получить и опять переключился на свои дела. И вот тут, когда я без особой надежды вернулся через
Здо́рово! Но где же мои самолётики?
Настал момент узнать откуда же брались самолёты. Оказалось, что «Виола» передаёт на вход
Ориентируясь на приметное имя x29.geom, я решил поискать эту модель, вдруг это
Модель действительно оказалось известной — её
ChatGPT оказался полезен тем, что правильно идентифицировал модель и рассказал её историю, но сам файл нашёлся банальным поиском по интернету.
Дальше нейросети меня опять удивили — посмотрев на мой найденный файл, сеть для программирования «Опус 4.5», не моргнув глазом, написала мне
Отлично! А что со второй моделью?
Со второй моделью так гладко не вышло — как я ни старался, ничего путного по слову TomCat на нашёл. Решил смириться и найти хоть
Тут наконец пригодился глубокий поиск — нашёлся архив внутри которого лежала модель самолёта
Я, было загрустил, но тут решил попробовать уже совсем безумную штуку — натурально попросить нейросеть написать мне конвертор из формата IOB в OFF, причём без описания самих форматов. Самое смешное, что это сработало, причём с первого раза! Получившаяся модель сразу появилась в окне и заработала!
Выводы, или Что меня удивило
Лёгкость к которой нейросеть провела обратную разработку команд, написала интерпретатор команд для
Конечно, у меня осталось ещё много задач даже в этом проекте, которые нейросети либо не могут решить самостоятельно, либо даже с моей помощью.
Тем не менее, та работа, которую я проделал над браузером при помощи нейросетей, совершенно неподъёмна для человека в такие короткие сроки.
Первая BBS в Казани ★
Около полугода назад я заинтересовался темой появления казанских BBS — это системы электронных доски объявлений, которые были распространены до эпохи интернета. В одном из источников, которые я использовал для исследования, всплыло указание на первое казанское объявление в газете «Вечерняя Казань», которое рекламировала первую казанскую BBS.
Доска объявлений называлась «ORPHAN’S BBS». Модерировали её Амир Шабашвили, с которым я
Поискав по казанским фидошникам фотографию, скан или вырезку из газеты с этим объявлением, я успеха не достиг — ни у кого искомого не обнаружилось. Поставив себе задачу в список
Время шло, я искал
Недавно я выделил время
Нашёл не без труда, объявление совсем крошечное. Латинского шрифта в газете в те времена ещё не было, поэтому BBS написали как ВВС:
Владельцы модемов! Информацию о первой в Казани
ФИДО-ВВС Вы можете получить по тел.76-85-59.
Думаю, на этом я для себя тему казанских BBS закрою — копать тут особо больше нечего. Разве что
Ненормальное программирование ★
Введение
Недавно разговорился с одним приятелем, тема разговора
Я его удивил, рассказав, что тема «непрактичного» или, как я его ещё называю, «ненормального программирования» привлекает меня давно, по меньшей мере с конца
Более нормальным программированием я тоже занимаюсь, но чаще всего это работа
«Junix» (1999—2003)
Это самый старый из сохранившихся подобных проектов. И, наверное, самый монументальный. Дело было в конце
Мне же было очевидно, что ДжаваСкрипт уже можно использовать для большего. Я так был уверен в своей идее, что был готов продемонстрировать её всему миру. Проект занял несколько лет — в начальной фазе я занимался им каждый вечер на протяжении нескольких месяцев, а потом изредка реализовывал
Так у меня получилось
«JS-FTPd » (2001)
В то время, когда я делал этот проект, ДжаваСкрипт ещё не был монополистом в мире браузерных языков. Существовало несколько альтернативных технологий, так, например, в браузерах была технология «апплетов», позволявших писать небольшие встраиваемые в браузер приложения на языке Джава.
В то же время в браузере «Нетскейп» была нестандартная технология «LiveConnect», которая позволяла вызывать Джаву из ДжаваСкрипта, а так же запрашивать из браузера различные разрешения, например, на сетевое взаимодействие. Впервые я познакомился с этой технологией, когда писал «Junix», там я через неё работал с диском компьютера, а в этом проекте мне захотелось изучить работу с сокетами.
Используя «LiveConnect» я написал FTP-сервер — на ДжаваСкрипте, вызывая Джаву там, где ДжаваСкрипт
«Крестики-нолики » на HTML и CSS (2011)
Тема игр для компьютера без программирования меня давно интересовала.Я написал их несколько. В основном, с использованием HTML и CSS. Ни тот ни другой языками программирования не считаются, тем не менее, развились настолько, что на них можно писать очень сложные интерактивные вещи.
«Арканоид» на bash (2011)
В рамках этой игры я хотел испытать две концепции.
«Шахматы» на языке утилиты sed (2013)
Когда я решил написать шахматы на sed, знакомые, с которыми я поделился своей идеей, подумали, что я сошёл с ума. Ну а как иначе? sed — в их глазах не язык программирования, а текстовый редактор, который умеет менять «кота» на «собаку» в конфигах.
Но мне хотелось доказать, что даже в таком примитиве можно выжать больше, чем кажется. В итоге я провёл две недели в диалоге с регулярными выражениями: заставлял их считать, сравнивать числа в придуманном мной формате 111::11 (так в нём записывается число 302) и имитировать логику шахматного ИИ. Каждый день я порывался бросить: когда код превращался в лабиринт из меток и переходов, а функция вычитания занимала 59 строк, но упрямство перевешивало.
Как я уже сказал, большая часть логики сделана на регулярных выражениях, поверх которых я написал
«Тетрис» на языке AppleScript (2017)
Встроенный в «МакОс» язык автоматизации «ЭплСкрипт», кажется, никто никогда для написания игр использовать и не пытался. По крайней мере, я таких попыток не обнаружил. И немудрено — сходу неясно чем бы он мог таким оперировать, чтобы взаимодействовать с пользователем.
Я написал «Тетрис» на нём, когда понял, что графику можно выводить, манипулируя свёрнутыми в точку окнами приложений и опрашивая клавиши регулирования громкости.
«Морской бой» на клавише «Капслок» (2020)
Игру «Морской бой» я написал по двум причинам.
Идея с клавишей пришла в голову, когда я в очередной раз размышлял о бессмысленной для меня клавише «Капслок» — я её совершенно не использую и всегда отключаю на уровне операционной системы.
В итоге я написал игру, где всё взаимодействие с компьютером делается через азбуку Морзе — пользуясь одной клавишей, как ключом, мы вводим координаты для игры в «Морской бой», а ответы компьютера считываем через мигание светодиода на «Капслоке». Картинка ниже — это отладочный режим, его можно включить,
«Вампус» для наручных часов в корпусе «Касио» (2024)
Я вообще очень люблю различные
До сих пор ношу эти часы почти каждый день, они у меня сейчас самые любимые.
Но если уж я добыл себе эти часы, было бы логично
«Вампус» на командах командной строки (2024)
Была у меня ещё одна идея — сделать
Путём разных манипуляций я ввёл целый набор всяких ограничений, чтобы шелл напоминал игру, а не просто командную строку, но если знать как всё устроено, это всё, конечно, можно обойти. Тем не менее, мне кажется, что с целью я справился.
«PowerShoot» игра, управляемая подключением зарядки (2024)
Игра, написанная под влиянием болезни. Я довольно тяжело болел и хотелось развлечь себя
На искомую идею меня натолкнул звук, который раздаётся, когда «Макбук» подключается к зарядке. Я задумался, что можно же программно узнать — заряжается ноутбук или нет, а потом уже, от скуки, развил эту мысль до небольшой игрушки. В ней игрок выпускает в сторону врагов бомбу, когда ноутбук подключается к зарядке.
«Дум» на языке калькулятора bc (2025)
Концепция вывода графики в текстовую консоль существует давно — в различных терминалах было последовательно придумано несколько способов как это сделать, что меня весьма интриговало. Хотя и понятно, что терминалы нынче никакие не текстовые, всё равно графика там поначалу
Во мне идея сделать
Хотя первые несколько часов хакатона я был в отчаянии от своей идеи и мне казалось, что я либо ничего не сделаю, либо не уложусь в срок, у меня всё получилось — за сутки я сделал порт игры «Wolf5k» на bc и придумал как на этом языке генерировать графику. А заодно доказал, что кодить сутки с раннего утра и до трёх ночи можно и в 47 лет.
«Throttling» игра, использующая для отображения мониторинг загрузки процессора (2025)
Как я недавно рассказывал, эта игра основывается на моей старой идее — выводить пульсацию проигрываемой мелодии через «Мониторинг ресурсов» процессора. В старых «Макбуках» каждому ядру соответствовал свой столбик и я даже написал код,
Недавно я этот код случайно нашёл и придумал небольшую игрушку. Её несложный сюжет, остающийся за рамками игрового процесса, таков: вы оператор блока реактора на АЭС, у вас отключается автоматика и вам нужно вручную удерживать температуру внутри блока, которая отображается как загрузка процессора.
Заключение
Я отобрал всего несколько проектов из того «ненормального», что я делал. Надеюсь, вполне очевидно, что «ненормальное» программирование я ценю и люблю очень давно. Для меня это не просто странное баловство, а способ изучить
Программирование, как например, и рисование, может быть процессом получения как можно более точной копией задачи, просто в другой форме, как, например, в реализме. В целом, нужный и почитаемый навык, но оно может быть и очень абстрактным, отражающим иную реальность, такой, какой она видится внутри, как идея.
Мучительная потребность поделиться своими внутренними идеями, думаю, знакома любому художнику. Я делаю свои странные программы по той же причине — потому что не могу, да и не хочу держать эти идеи только внутри себя.
Батарейки CR2032 ★
Я, как и многие, наверное, подозревал, что с плоскими батарейками
А тут недавно в одном из каналов попалась ссылка на тестрирование батарей CR2032. У меня на картинке лишь вершина айсберга, загляните сами — разница между лидером и аутсайдером в 11 раз! Что, кстати, неплохо укладывается в мои ощущения в год и месяц работы.
Что расстраивает, батарейки известных брендов, согласно этому сравнению, работают средне. Надеюсь дело в том, что их не стесняются подделывать.
Из хорошего. Приятно удивили батарейки «Фотон» — они на втором месте, что тоже логично — подделывать местный бренд опаснее. Буду теперь, пожалуй, покупать именно их.
7000 и кафе ★
Формально эта заметка — семитысячная на этом сайте. Формально, потому что некоторые посты я пишу задним числом, копируя их из «Дневников жизни», которые я вёл с 1989 года
Тем не менее, это знаковое число и я, по подсказке одного из читателей, планировал написать её
К сожалению, я заболел и с задачей не справился — список пока находится в зачаточном состоянии. Был выбор — не писать
Честно говоря, я планировал выбрать первый вариант, но вчера случилось событие о котором невозможно молчать, — мы с ещё двумя друзьями подписали договор, условия которого обсуждали почти месяц. В скором времени мы будем открывать кафе, даже два — одну точку в виде киоска недалеко от одной из центральных улиц Казани и ещё одну на фудкорте строящегося торгового центра.
По мере успеха предприятия, буду сюда об этом писать, пока же вперёд забегать не буду — помимо подписи на трёх экземплярах договора мной пока ничего не сделано.
Прошлое: Дни Интернета в Казани ★
Вчера встретил в кафе нашего офисного центра своего друга А. Х., который общался
А. Х. попросил меня помочь, но сначала мне пришлось отказаться — меня ждали на встрече. Позже выяснилось, что встречу передвинули и у меня есть минут 15—20, чтобы спринтом пробежаться по памяти
События очень давние, поэтому вспомнить удалось не так много как хотелось бы, но зато в памяти всплыл один забавный случай, про который я нигде не писал. Журналисткам он не подошёл по тематике, поделюсь здесь.
В конце девяностых—начале двухтысячных в Казани проводились Дни Интернета. Событие, насколько я помню, должно было стать ежегодным, но не стало. Его провели не менее двух раз
В интернете об этом упоминаний не сохранилось,
Я был на двух «Днях». Один из них проводил на свои деньги известный тогда в казанском интернете деятель Daddy Hab, а второй, если мне не изменяет память, провайдер
Кажется оба раза это было в зале НКЦ «Казань», но что там конкретно было, я уже и не помню. Вероятно, просто тусовка с алкоголем. Но что я помню хорошо, что перед одним из этих событий в качестве приглашённого гостя был анонсирован Артемий Лебедев, в те годы — абсолютная суперзвезда в интернете.
На беду организаторов я тогда с ним активно переписывался, поэтому не постеснялся узнать правда ли его пригласили. Он сказал, что в первый раз об этом слышит и я, для смеха, выслал ему фотографию флайера с его именем. К сожалению, электронная почта того времени работала иногда из рук вон плохо и файл с картинкой никак до него не доходил. На третьей попытке я его сконвертировал, для надёжности, в несколько форматов и выложил на свой сайт ссылками, которые и отослал ему в письме.
Как пошутил А. Х., я делился файлами через облако до того как это стало модным.
Разумеется я не помнил этого в таких подробностях, но вчера написал Артемию, в надежде, что у него осталось это письмо и не обманулся — он мне его переслал, после чего эта история проступила в памяти более ясно.
Организаторы так и не признались, что не стали приглашать Лебедева и на самом событии интригу тянули до последнего. Я бродил в толпе и вносил смуту среди своих знакомых, но и у меня, думаю, теплилась надежда.
К сожалению, чуда не случилось. В итоге
cmd.sh ★
Я тут случайно в спор ввязался — можно ли переписать
Речь шла о вполне определённом файле, там запрограммировано небольшое меню и в зависимости от выбранного пункта запускается та или иная, одинаковая для всех ОС, последовательность команд.
Мой собеседник мне не верил, когда я утверждал, что это вполне возможно, и требовал доказательств.
Что ж. Основная моя идея была в том, чтобы заменить команды батника на вызовы
То, что мне предстояло адаптировать начиналось вполне стандартно:
@ECHO off
CHCP 1251
CLSЧто тут происходит? Выключается вывод команд на экран (при адаптации это можно игнорировать), ставится однобайтовая кодировка CP1251 (это хорошо бы учесть) и очищается экран.
Поскольку «баш» этих команд не знает, надо определить три функции, спрятав их от cmd.exe. Сделать это несложно. Команду «двоеточие» cmd.exe трактует как начало метки и на дальнейшее не реагирует, а «баш» считает её пустой командой, которую можно точкой с запятой отделить от строки, которую мы хотим спрятать:
:; @ECHO() { :;}; CLS() { clear; }; CHCP() { ENC="$1"; }Следующее, чему надо научиться — выводить текст в указанной в батнике кодировке. Это просто:
:; ECHO.() { echo $@ | iconv -f "CP$ENC"; }Если теперь сделать файл запускаемым и добавить впереди #!/bin/bash (и пренебречь тем, что cmd.exe успевает ругнуться на эту строку до очистки экрана), у нас получится следующий файл, работающий во всех трёх операционках (кодировка должна быть
#!/bin/bash
:; @ECHO() { :;}; CLS() { clear; }; CHCP() { ENC="$1"; }
@ECHO off
CHCP 1251
CLS
:; ECHO.() { echo $@ | iconv -f "CP$ENC"; }
ECHO. Всем приветА вот дальше сложнее. Само меню организовано в оригинале так:
SET /p opt=Введите цифру:
IF %opt%==1 GOTO dns_auto
IF %opt%==2 GOTO dnschange
IF %opt%==3 GOTO exitВ «баше» goto (переход к метке) отсутствует и это проблема. Аналогов тоже нет. Единственное, что тут можно сделать — использовать вызов функций, но синтаксис в «бате» и «баше» сильно различается.
Как быть?
:; SET() { shift; ECHO. -n "${@#*=}"; read -n1 "${1%%=*}"; echo; }
:; CALL() { eval "$(sed 's/%\(.*\)%/$\1/g' <<< "$1")" 2>&-; }
SET /p opt=Введите цифру:
CALL :menu_%opt%Первая функция парсит команду SET выводит строку после равно, ждёт ввода и записывает значение в имя переменной, указанной слева от равно.
Вторая — заменяет CALL. В ней %variable% заменяется на $variable, выполняется подстановка переменной и получившееся имя выполняется как команда или функция «баша». Конструкция 2>&- нужна, чтобы избежать вывода ошибки в ситуации, если пользователь введёт
Теперь надо
:function_1
ECHO это якобы функция
GOTO :EOFВ «баше» то же самое могло бы выглядеть, например, так:
function_1() {
echo это функция
}Как это объединить? Я придумал следующий подход:
:; GOTO() { :; };
GOTO ;#start
:function_1 (){
ECHO. это [якобы] функция
GOTO :EOF
:; }
:;#startВ первой строке определяется пустая функция для «баша», потому что эта часть синтаксиса
Ниже идёт строка GOTO ;#start. С точки зрения «баша» тут две конструкции — GOTO, которая вызывает определённую выше пустую функцию и #start — строка комментария, так как в«баше» с «решётки» начинаются комментарии.
В «батнике» же эта же строка будет означать переход к метке с именем ;#start. Этот переход нужен нам, чтобы «обогнуть» строки, которые определены ниже, иначе cmd.exe начнёт сразу их выполнять, а нам этого не нужно. Их нельзя «спрятать» ниже основной программы, так как в «баше» функции должны определены раньше их вызова.
Что происходит дальше? С точки зрения cmd.exe ниже расположена метка :function_1 (как показывают мои эксперименты, часть после пробела просто отбрасывается), потом тело функции, команда её завершения GOTO :EOF и метка с именем :;}.
С точки зрения «баша» там определяется функция с именем :function_1, ниже идут вызовы уже определённых мною функций ECHO. и GOTO, а ещё ниже — уже знакомая нам пустая команда : и фигурная скобка, завершающая тело функции.
Соединяем всё вместе и получается следующая программа:
#!/bin/bash
:; @ECHO() { :;}; CLS() { clear; }; CHCP() { ENC="$1"; }
@ECHO off
CHCP 1251
CLS
:; GOTO() { :; };
:; ECHO.() { echo $@ | iconv -f "CP$ENC"; }; PAUSE() { read; };
:; SET() { shift; ECHO. -n "${@#*=}"; read "${1%%=*}"; }
:; CALL() { eval "$(sed 's/%\(.*\)%/$\1/g' <<< "$1")" 2>&-; }
GOTO ;#start
:menu_1 (){
ECHO. Пункт первый
GOTO :EOF
:; }
:menu_2 (){
ECHO. Пункт второй
GOTO :EOF
:; }
:;#start
SET /p opt=Введите цифру:
CALL :menu_%opt%Мой оппонент признал, что в споре я победил.
Пишем на «Флиппере Зеро» по-русски
★
Вкратце: в русским текстом работать можно, но сложно, код лежит на «Гитхабе».
Не мог не обратить внимание, что несмотря на приличное количество русскоязычных авторов программ для «Флиппера Зеро» и российское происхождение устройства, в софте под него нигде не обнаружилось ни одной буквы
Стало интересно — а есть ли вообще в устройстве поддержка русского языка? Сел вечерком за исходники прошивки и оказалось, что однозначного ответа на заданный вопрос нет. Частичная поддержка есть и её можно заставить работать, но она работает как будто по недосмотру — никто её не собирался делать, так случайно вышло.
Сейчас расскажу, что я имею ввиду и постараюсь покороче, никто сейчас не любит длинные тексты.
Внутри «Флиппера» довольно много всякого АПИ для вывода текста, от незатейливого, выводящего строку в заданные координаты, до довольно навороченного, умеющего переносить и выравнивать текст. К сожалению, с русскими буквами оно работать не умеет.
Под капотом у этого АПИ — очень известная в своей нише библиотека U∞g2, у которой по историческим, видимо, причинам есть два набора функций для работы со строками. Одни принимают только однобайтовую кодировку ASCII, другие работают в Юникоде.
АПИ «Флиппера», к сожалению, использует функции, которые с Юникодом работать не умеют. К счастью,
Первый из них — canvas_set_custom_u8g2_font.
Чтобы
Вот как я это делаю:
#include <u8g2/u8g2_fonts.c>
// …
canvas_set_custom_u8g2_font(canvas, u8g2_font_haxrcorp4089_t_cyrillic);Файл u8g2/u8g2_fonts.c внутри себя содержит шрифты в особом формате, можно открыть его прямо в текстовом виде и посмотреть как всё устроено.
Шрифт мы выбрали, теперь надо
Плохая новость в том, что строки в коде мы обычно пишем в кодировке
Но canvas_draw_glyph, как можно понять из названия, выводит только один символ. Как же вывести строку? Достаточно просто — надо вывести её посимвольно, сдвигая координату на ширину символа. Звучит просто, но как это сделать?
Тут нас ждёт очередная засада. Дело в том, что canvas_glyph_width, которая должна бы это делать, принимает на вход только char, при том, что нижележащая u8g2_GetGlyphWidth преспокойно работает с Юникодом.
Поэтому я сделал просто — выдрал реализацию u8g2_GetGlyphWidth себе в исходники. В итоге мякотка моего решения выглядит вот так:
void unicode_draw_utf8_str(Canvas* canvas, uint8_t x, uint8_t y, char* str) {
FuriStringUTF8State state = FuriStringUTF8StateStarting;
FuriStringUnicodeValue value = 0;
for(; *str; str++) {
furi_string_utf8_decode(*str, &state, &value);
if(state == FuriStringUTF8StateError) furi_crash(NULL);
if(state == FuriStringUTF8StateStarting) {
canvas_draw_glyph(canvas, x, y, value);
x += unicode_GetGlyphWidth(&canvas->fb, value);
}
}
}Тут unicode_GetGlyphWidth — скопированная реализация u8g2_GetGlyphWidth, а furi_string_utf8_decode используется для кодирования
Надпись в «Гитхабе» ★
С тех пор как в первый раз увидел панель активности «Гитхаба», хочу на ней
И вот, годы спустя, я наконец сподобился сделать скрипт, чтобы автоматизировать процесс и написать себе там слово «ПРИВЕТ».
Скрипт переводит подготовленную картинку размером 52×7 пискелей в нужную интенсивность коммитов и распределяет их по датам. Для надписи я использовал шрифт silkscreen, русифицированный
Если захотите себе такую же, вам понадобится так же bash, git и утилиты из набора ImageMagick. Создаёте пустой репозиторий на «Гитхабе», привязываете его к локальному, запускаете мою утилиту с картинкой и любуетесь изображением на панели активности.
GBox для Huwaei ★
Три года назад, пройдя от любви до ненависти к «Самсунгу» один шаг, я перешёл на «Хуавей», рискнув попытаться обойтись без гугловых сервисов. Честно сказать, продержался недолго — пришлось взламывать смартфон и почти сорокаминутным шаманством возвращаться в зону комфорта.
После этого ставить можно было что угодно, но работало не очень — уведомления не доходили, «Мир пэй» работать отказался, синтез и распознавание речи — тоже, а в смартфоне торчало
В конце прошлого года, озаботившись выбором новой кофеварки, я потерял бдительность и вместо этого купил себе новый смартфон.
Я уже давно хотел побаловать себя апгрейдом смартфона, и консультант в магазине, почуяв мои колебания рядом со стендом «Хуавея», мастерски разбил каждый пункт моих сомнений. В том числе показал мне способ как не страдать от отсутствия сервисов «Гугла».
Оказывается существует панацея — приложение GBox. Оно ставится прямо из собственного магазина «Хуавея» и запускает внутри себя любое гугловое приложение (включая «Гугл Плей»), притворяясь для него смартфоном, свободным от санкций. В моём случае это
Всё гугловое запускается в некой изолированной среде, а наружу создаются ярлыки, отдельные для каждого приложения. Удивительно, но работают даже
Мне такой способ понравился значительно больше — не засоряется система, и приложения, типа «Мир пэя», не сходят с ума от противоестественного симбиоза сервисов «Гугла» и «Хуавея».
О хранении пластинок ★
У нас дома есть настоящий патефон в хорошем состоянии. Эта вещь
Поэтому я постепенно расширяю коллекцию — докупаю пластинки на местном блошином рынке или в интернете. Коллекция пока не велика и стоит у меня на одной из полок. Пластинки именно стоят, так правильно — на каждом конверте любой пластинки это напечатано в виде инструкции.
У меня
Некоторые из них меня заинтересовали (там была даже парочка дореволюционных), поэтому я взял их послушать и только дома обнаружил, что за годы хранения стопкой одна из односторонних пластинок испортила дорожки на рабочей стороне другой — там отпечатался рельеф вокруг «яблока» и часть надписи «REPRODUCED IN RUSSIA».
Вывод простой: хранение стопкой портит пластинки, так как под весом стопки одна пластинка может повредить дорожки на другой.
DOOGEE S98 Pro ★
В счёт годовой премии решил поменять себе смартфон — вместо служившего верой и правдой почти три года «Хуавея», купил себе тоже «Хуавей», но интереснее. Но об этом
Прежний телефон выставил на продажу на «Авито». Продавался он
Я меняльщикам обычно даже не отвечаю — сразу закрываю диалог без лишних слов. Но сегодня в одном из предложений поменяться мелькнула
Оказалось, что это смартфон в «походной» комплектации — защищённый (IP68, IP69K,
Владелец рассказал, что промахнулся с выбором — у него далеко не походный образ жизни, а в городе этот телефон неудобен — тяжёлый, большой, да и его фишки применить просто негде.
Я решил, что это судьба — давно ищу себе телефон для суровых условий, учитывая, что я время от времени люблю залезть по́ уши
Тепловизор зимой в новой квартире оказался занятной игрушкой, тем более сейчас в Казани стоят экстремальные морозы за −30°, много нового узнаёшь о своей квартире при помощи этой штуковины.
Дочке особенно понравилось смотреть на тепловые следы от собачьих лап и человеческих ног на полу, а я изучил стены. Возможно
Камера ночного видения — тоже интересная штука, используется инфракрасная камера с инфракрасной же подсветкой. Не знаю насколько будет полезно на природе, но по тёмной квартире походить интересно, чувствуешь себя как
Вдаль камера то ли промахивается с фокусом, то ли просто «мылит»
Надо будет попробовать поснимать днём — интересно какой будет эффект.
В общем, нарушил своё правило — не соглашаться на обмен в объявлениях, но не пожалел — интересный агрегат, теперь только надо
Получил нагрудный знак ★
Перед Новым годом Республика сделала прекрасный подарок: сегодня я из рук министра цифровизации Айрата Хайруллина получил нагрудный знак «За достижения в области информатизации и связи РТ».
Предупреждая вопросы: никакого особого статуса этот нагрудный знак не даёт, просто приятное признание заслуг.
Грека и рак ★
В детстве меня много мучали буквой «р» — я её тогда не произносил и до сих пор этого не делаю, правда большинство этого не замечает, — со временем сам собой
Походы к логопеду, в данном случае, дали мне только одно: я с пулемётной скоростью, быстрее всех, кто со мной пытался соревноваться, умею выдавать скороговорку про беспечного грека, который суёт руки в реки:
Ехал грека через реку,
Видит грека: в ре́ке рак,
Сунул грека руку в реку,
Рак за руку греку цап!
Сегодня веселил этим дочку и она, отсмеявшись, задала очень интересные вопросы: что за грека? через какую реку и куда он ехал? и зачем он засунул руку в реку?
Судя по тому, что удалось нагуглить, ответы на эти вопросы неизвестны, однако проследив судьбу скороговорки от нашего времени
Первое, что меня сильно удивило, «грека», — по всей видимости, национальность, а не имя (как я думал ранее), — во всех ранних источниках это слово написано с маленькой буквы. Так что история не персонализированная и шансов
Вообще в двадцатом веке вариантов концовки было множество: «грека за руку рак — цап!» (Георгий Никифоров, «Кимба», 1926), «рак у грека руку цап» (Бирюков, «Крылатые слова на Урале», 1960) или тот, что на скриншоте (Б. Д. Четвериков, «Атава», 1924 год).
Мне хочется верить, что самый ранний вариант, — опубликованный Борисом Дмитриевичем Четвериковым в «Красной Нови», является исходным, так как в нём больше логики. Если это так, то по меньшей мере один вопрос в истории про греку отпадает сам собой.
Интересная операция (18+) ★
В последнее своё посещение блошиного рынка сфотографировал в качестве курьёза одну книгу — очень уж удивило название, которое я понял так, что до революции в России пытались делать операции по смене пола.
Меня это сильно удивило — уж очень прогрессивно выглядит. Где
Уже забыл про эту историю, но на днях разбирая чем забит мой смартфон, опять наткнулся на эту фотку. Ну и стало интересно — что за врач такой жил в России, как он вообще пришёл к этой теме и какова была реакция в обществе на его изыскания?
Начал, как полагается с «Википедии» и знатно удивился, когда узнал из неё, что первая операция по смене пола была сделана в 1931 году. Тогда что за операции делал доктор, написавший эту книгу? Может я случайно наткнулся на сенсацию?
Загадку разрешила одна из досок объявлений, где продают различное старьё. Там удалось найти несколько фотографий внутренних страниц книги, которые всё прояснили.
Оказывается операция, которая имеется в виду в книге, делалась женщинам с физическим отклонением — тем, у кого по разными причинам влагалище не развилось. Такая операция тоже, конечно, крутое достижение, но оскароносный фильм по этой истории уже не снимешь.
Голос Александра III? (вряд ли) ★

Александр III Александрович (1845—1894) — император Всероссийский, царь Польский и великий князь Финляндский. Отец последнего российского монарха Николая II
Оказывается в интернете есть аудиозапись, на которой, по одному из предположений, звучат голоса Александра Третьего и его супруги Марии Фёдоровны.
Запись была сделана на восковой цилиндр между между 1889 и 1893 годами в резиденции датского короля во Фреденсборге генеральным консулом Готфридом Рубеном, который в период 1889—1897 годов записывал известных певцов и актеров того времени, а также важных высокородных гостей членов монаршей семьи на недавно изобретенном фонографе.
Прямых доказательств этому нет, но в пользу этой теории говорит тот факт, что замок Фреденсборг, где записывался голос, является резиденцией датских королей. И вряд ли там мог петь
Женский голос:
— Я очень рада вас видеть сегодня. Потому, что хорошая погода, можно пойти гулять! (неразборчиво, на датском)
Мужской голос:
— Вы хотите я говорил
что-нибудь вам. Это не всегда так легко, когда вы хотите… И еще вы прибавили, что хотите чтобы я спелчто-нибудь. Ну что же, вот, как например, это…
Поёт:
Сам Бисмарк чуть от радости
Не вырвал трёх волос,
Как телеграф известие
Такое нам принес,
Что немцы храбро заняли
Пункт важный и большой
И утверждали в Африке
Права страны родной…
С тех пор в Берлине стар и млад
Одно лишь и твердят:
Nach Afrika, nach Kamerun!
Vivat, Nach Kamerun!
Nach Afrika, nach Kamerun!
Так немцы говорят!
Nach Afrika, nach Kamerun!
Vivat, Nach Kamerun!
Nach Afrika, nach Kamerun!
Так немцы говорят!
Мужской голос:
— Закончим на этом, не могу вам читать сегодня. Если б вы заранее меня предупредили, так это другое дело. Я бы взял с собой книгу
или что-нибудь в этом роде, чтобы мне прочитать. А так прямо из головы, это нелегко. Вы меня застали врасплох. И конец. До свидания, господа.
Женской голос (на датском):
— Меня очень веселит слушать голос моего мужа.
1 + 1 = 1 ★
Те, кто следит за недвижимостью, наверное знают, что она сейчас растёт в цене, как на дрожжах. Это связывают с очень низкими ипотечными ставками, которыми правительство надеялось поддержать народ в коронавирусное время.
Получилась уникальная ситуация, которой мы с женой решили воспользоваться. Появилась мысль продать две квартиры — пустующую однушку и ту квартиру, в которой сейчас живём, чтобы купить жильё побольше в районе получше. Выбрали ипотеку с государственной поддержкой 0,01/6,5% — то есть первый год одна сотая процента, потом — 6,5.
Чтобы получить такую ипотеку, пришлось собирать довольно большой первый взнос — такие условия. Своих денег не хватило, пришлось занимать. Отдали потом с продажи однушки. Кстати, пока её продавали, она дорожала два раза. В теории можно было бы подождать ещё, но нам очень хотелось поскорее отдать деньги.
И вот что из этого получилось: цену на свою будущую квартиру (она ещё строится) мы зафиксировали ещё осенью, когда её купили, тогда как однушка, которую мы продавали несколько месяцев, чтобы отдать долги, дорожала и не прекращает дорожать квартира, в которой мы живём. Так что мы ожидаем после осуществления всего плана остаться в большом плюсе.
При этом весь год мы платим ипотеку под 0,01%, которую надеемся закрыть после продажи второй квартиры, лишь немного «въехав» в 6,5% — сдача нашей новостройки только летом, а потом ещё отделку делать и покупателей искать.
Получается довольно выигрышная ситуация, при условии что застройщик достроит дом. Это единственное относительно уязвимое место во всём плане, поэтому к выбору застройщика подошли ответственно. Я пишу «относительно», так как все наши деньги лежат на так называемом «условном счету»
Кнопка отключения рвотного рефлекса ★
В прошлом году
Меня это заинтересовало, так как я часто пшикаю в горло морской водой — это позволяет не заболеть при переохлаждении, что у меня случается, —
В общем, повторил её магию и, чудо, сработало — действительно рвотный рефлекс отключился
Надо сильно (до боли) сдавить
Осечек пока не было.
Три месяца с Huawei (лонгрид) ★
TL;DR: всё круто, мне нравится
Три месяца назад я решил сменить марку смартфона (и часов) с «Самсунга», которому был верен несколько лет, на опальный нынче «Хуавэй». Думаю, пора поделиться
Главным камнем преткновения тут является, конечно, отсутствие сервисов «Гугла» «из коробки». Дело в том, что «Хуавэй»
Часы живут больше недели на одной зарядке
Сначала про часы. Я купил «Watch GT 2» — это последнее, что есть сейчас у «Хуавэя» из этого класса устройств. В отличие от «Самсунга» (у меня были «Gear S3 Frontier»), это
Единственный
Видимо этот минус является следствием жирного плюса — часы живут на одной зарядки больше недели. Сколько точно, я не знаю. Обычно в выходные я их
Наушники всем хороши, но мне особо не с чем сравнить
Теперь наушники. У меня, опять же, последняя модель — «FreeBuds 3». Мне не с чем сравнить, это мои первые беспроводные
Сторонний эффект — теперь ищу наушники, чтобы позвонить, в них это делать
Не хватает «Гугла», но это поправимо, долго держит заряд, крутая камера
Теперь, самое главное — смартфон. У меня «P40 Pro+», как вы наверное уже догадались, самое лучшее, что было у «Хуавэя» на момент покупки, и тут самый спорный опыт.
Начну с минусов.
Поэтому на смартфон я сразу же накатил всё запрещённое. Правда платёжное приложение заработало не полностью — запускается, можно добавлять скидочные карты, но платить нельзя. Обхожусь приложением «Кошелёк», но оно работает только с «Мастеркартом» и только с избранными банками.
Третий минус самый незначительный:
Теперь плюсы.
Ну и наконец, камера. Тут она великолепна. Конечно, это не «зеркалка», но я не припомню, чтобы я
Планшет появился недавно, пока без выводов
Недавно в ряду хуавэевской техники у нас дома прибыло — появился планшет, но опыт его использования пока небольшой, выводы делать рано.
Расшифровка печати ★
Белый пластилин, замазанный в буквы оказался чудесным средством — с его помощью удалось печать, найденную недавно на рыбалке, прочитать почти полностью. Я её инвертировал по цветам и зеркально отразил, чтобы было проще читать.
Судя по прочитанному, печать принадлежала контролёру кантфинотдела Cпасского кантона. Правда прочтение «СПАССКОГО» спорное, буквы там почти не читаются, но об этом дальше.
Думаю, слово «кантон» для многих непривычное. Это название
Как бы то ни было, в момент своего создания в 1920 году, советский Татарстан делился на десять кантонов: Арский, Бугульминский, Буинский, Лаишевский, Мамадышский, Мензелинский, Свияжский, Спасский, Тетюшский и Чистопольский. На следующий год к ним добавились Агрызский, Елабужский и Челнинский. В последующие года кантоны упраздняли и делили на районы, пока 23 июля 1930 от такого деления не отказались вовсе.
Теперь вернёмся к прочтению прилагательного между словами «КОНТРОЛЕР» и «КАНТФИНОТДЕЛА». Крайние слова читаются достаточно уверенно, в середине видно только «…ОГО» и ещё шесть
Слово «кантфинотделы» тут тоже малопонятное. Это — местный аналог райфинотделов, финансовых отделов райисполкомов, то есть районных органов исполнительной власти. Поскольку в республике тогда были кантоны, то и отдел не районный, а кантонный.
Далее логика такая, — раз мы имеем дело с кантфинотделом, скорее всего нужное нам слово следует искать среди названий кантонов. По количеству букв подходят только два — «СПАССКОГО» и «БУИНСКОГО». Центром первого был затопленный ныне город Спасск, центром второго — Буинск.
Буинск не подходит по двум причинам.
Совершенно непонятным остаётся только о каком банке идёт речь в строке ближней к центру надписи, но тут зацепиться решительно не за что — буквы не читаются вовсе, а татарская часть надписи пострадала даже больше, чем русская.
Кинопроектор инженера Гарина ★
Обедал вчера
По причуде памяти вспомнился советский, ещё
И вот
Начал гуглить, но не смог найти никаких упоминаний этого факта. Вот и думай теперь — это эффект ложной памяти или просто все источники поумирали. Утешился тем, что бегло глянул появление «гиперболоида» в фильме и действительно, — очень похоже на кинопроектор.
Правда на то, что стоит в ресторане не похоже даже отдалённо. А жаль.
Бип-бип
★
Интерес к динозаврам у дочки
В моём детстве каждый ребёнок знал, что 4 октября 1957 наша страна запустила первый в мире искусственный спутник — это нередко упоминалось по телевизору и в книгах вместе с ещё двумя фактами: по форме это был серебристый шар с антеннами и он при полёте посылал на Землю сигналы
Эти звуки, кстати, каждый день слышали все граждане Советского Союза — их имитация была использована в заставке программы «Последние известия», выходившей до 1991 года. Для тех, кто не застал, прикладываю реальную запись звуков, передаваемых спутником.
Я всегда думал, что эти
Но оказывается (и это я узнал из детской книжки), у них была и практическая роль — с их помощью изучали верхние слои ионосферы. Причём сигнал был не один, передача шла на двух разных частотах — 20,005 и 40,002 МГц, один сигнал подавался в паузах второго.
Обе частоты были выбраны исходя из рассчитанных характеристик распространения волн в ионосфере и позволили произвести наземное зондирование ионосферы, что было невозможно до запуска спутника.
И чуть не забыл. Вот вам астрономическая загадка от моей четырёхлетней дочери: «сколько звёзд видно на небе утром?».
Кто по национальности Аладдин? ★
Прошлая тема про национальность Ленина неплохо всем зашла и даже в подкаст попала, попробую повторить успех.
В моём советском детстве по телевизору часто крутили фильм «Волшебная лампа Аладдина» 1966 года, многие его помнят по фразе «в Багдаде всё спокойно!», которая потом стала крылатой. Не уверен, что в нём называлась национальность Аладдина, но было вполне очевидно, что это
Гораздо позже появился диснеевский мультик, где царевна Будур сменилась Жасмин, но национальность Аладдина как будто была та же, что и в советской версии.
Прежде чем перейти к ответу на вопрос, кто же был по национальности Аладдин, следует упомянуть, что и к национальности самой сказки есть вопросы. К оригинальному сборнику «Книга тысяча и одной ночи» она, по всей видимости, отношения не имеет, а включил её туда французский писатель Антуан Галлан, опубликовавший первый перевод.
Где он взял «Аладдина» — дело тёмное, сам он в своих дневниках пояснял, что услышал эту сказку от некого маронитского учёного по имени Ханна Диаб, привезённого в Париж из сирийского города Алеппо прославленным путешественником по странам Востока Полом Лукасом. Но эта версия, вроде как, противоречит некоторым фактам.
Теперь к самому Аладдину. Мне не удалось узнать что об этом написано в оригинальной книжке Галлана, но зато я нашёл некое недатированное французское издание, которое начинается со строк «в столице очень богатого и огромного королевства Китая, имя которого на данный момент не приходит в голову, был портной по имени Мустафа».
Вряд ли
В общем, неудивительно, что в старых изданиях Аладдина повсеместно изображают китайцем, правда найти такие изображения непросто — вся поисковая выдача завалена «Диснеем».
«Магический шар» ★
Свой путь в вебе я начинал с вёрстки — в конце
Из того набора атрибутов и тегов, что тогда были доступны, мне довелось использовать всё, кроме
Использование его в те годы могло бы выглядеть
<A HREF=/cgi-bin/action.pl><IMG SRC=/i/pict.gif WIDTH=200 HEIGHT=100 ISMAP></A>Чтобы вы прочувствовали дух времени, специально пишу большими буквами (так было принято) и без кавычек (экономили и на этом тоже).
При нажатии на картинку с этим атрибутом и ссылкой к урлу добавляются в качестве параметров координаты курсора на картинке. Видимо это нужно было
Я уже несколько лет как не верстаю,
И вот два года назад меня осенило использовать его в вёрстке «магического шара» из фильма «Трасса 60». Если не смотрели, там у главного героя был шар, который давал ответы на заданные вопросы, если его потрясти.
Мой шар «отвечает» в том случае, если на нём щёлкнуть мышкой. В качестве случайных значений используются координаты, передаваемые при помощи атрибута ISMAP, плюс картинка вращается при помощи CSS, поэтому даже под неподвижным курсором всегда разные координаты.
Принцип получился довольно простой — все координаты, в которые пользователь может щёлкнуть мышкой, заданы как идентификаторы скрытых слоёв, лежащих поверх рисунка шара. Как только пользователь выбирает
HTML с таким подходом становится довольно жирным — у меня получился 1,2 мегабайта, но по нынешним временам это не объём.
Вообще я планировал дооформить шар и сгенерировать координаты более экономно (сейчас я генерирую под охватывающий квадрат, получается, что у меня есть бесполезные строки в его углах), но проект два года провалялся в локальном репозитории, а воз и ныне там.
Поэтому решил выложить что есть,
JUnix ★
Вкратце: выложил на гитхаб свой старый проект «эмулятора» Линукса, который я писал
Мне тогда этот язык невероятно нравился, я был в бешеном восторге и такое вот несерьёзное к нему отношение меня очень задевало.
Эта фантазия меня так увлекла, что примерно год я посвящал ей все вечера, в ущерб учёбе в Университете и личной жизни. Позже я ещё долго возвращался к этому проекту, правда моя активность всё угасала, пока
Конечно настоящий эмулятор у меня не получился, да я и не пытался его создать, получилась имитация командной строки «Линукса» на том уровне знаний, который у меня был в те годы.
Реализованы
Поскольку шеллом
В своё время появление этого «эмулятора» понаделало шуму — о нём написали все основные российские сайты про программирование, а я каждый день получал письма от тех, кому понравилась моя игрушка.
Постепенно домен, на котором это всё располагалось, потерялся, а потом со старым винтом умер и бакап сайта. Осталась только копия
Так бы он там и лежал, но вчера в разговоре Леонидом Кагановым я случайно помянул почивший проект и Леонид, который его моментально вспомнил, предложил забрать сохранившееся
Честно говоря, я и сам давно об этом думал —
И вот вчера я наконец выкачал слепок первой попавшейся качалкой, поправил очевидные баги, чтобы всё заработало в современных браузерах — они
Кстати, если вам нравится в таком копаться, можете посмотреть сколько костылей в то время приходилось городить и как беден был раньше этот ДжаваСкрипт.
Я потестировал
Репозиторий проекта: https://github.com/bolknote/junix.
Сайт проекта, где можно посмотреть всё в действии: https://bolknote.github.io/junix.
День Радио ★
Сегодня, 7 мая в России отмечают День радио — в этот день, 125 лет назад российский физик Александр Степанович Попов на заседании Русского
К этому юбилею, превозмогая лень, прокрастинацию и уныние от «самоизоляции», мне удалось наконец дописать игрушку, которую я задумал ещё несколько лет назад. Игра была готова неделю назад, но я всё никак не мог сделать последний шаг — добавить описание и выложить наружу.
Для практики в моей любимой дисциплине — «ненормальном программировании», очень хотелось написать
В итоге, для этого я выбрал «Морской бой». В моём варианте игрок вводит информацию клавишей левого «Шифта», а компьютер отвечает, мигая светодиодом кнопки «Капс Лок». Чуть более подробные правила есть в репозитории проекта.
Обёртка и некоторые функции (мигание светодиодом, опрос «Шифта» и функция задержки) написаны на Си, остальная часть — на языке «Лу́а» (Lua). Давно хотелось изучить этот странноватый язык поглубже, а тут ещё удалось поучиться встраивать его в Си.
Чтобы увеличить градус безумия всего проекта, в Си были использованы диграфы — они очень странно выглядят и дают ощущение, что используется
Пока работал над игрой, приходилось много гуглить, в очередной раз поразился, как много кода люди бездумно копируют друг у друга. Реализация мигания светодиодом, например, кочует из проекта в проект в неизменном виде — видно, что никто из скопировавших не понимает как этот код вообще работает. Я в нём попытался разобраться и написать чуть чище, чем буквально везде.
Для тех безумцев, которые захотят попробовать скопмилировать этот вариант «Морского боя» и сыграть, ещё раз привожу репозиторий проекта (только под «МакОСь») — https://github.com/bolknote/battleship.
Детская частная жизнь ★
Вкратце: есть ли у вас
Раньше мы очень много снимали дочку на видео — как она играет, гуляет, делает
Сейчас дочь всё чаще запрещает — «папа, не снимай, не хочу». Конечно я останавливаюсь и отснятое стираю. Тенденция, разумеется, продолжится, вплоть до полного вето, хотя это и грустно, — возможно взрослой ей захочется взглянуть на себя в детстве, и она будет жалеть об этом запрете.
Но эти видео — история
Теперь же я задумался над тем как и что писать о дочке тут — как она отнесётся к написанному, когда вырастет и существует ли уже такое явление как травля одноклассниками/одногруппниками за выложенное родителями в интернет?
Те, чьи похождения родители выкладывали в «Инстаграмм» в самом его начале, уже учатся в третьем классе, а блоги вообще существуют более 20 лет! Их фигуранты уже могут и своих детей позорить
Расскажите что вы считаете возможным выкладывать на публику о своих детях, а что у вас под запретом? Были ли конфликты с детьми на эту тему? Была ли травля сверстниками по мотивам того, что вы выкладывали? Хочу изучить чужой опыт, прежде чем вырабатывать
«Глазелки» ★
У моего хорошего друга, Олега Петровича несколько лет назад был очень интересный блог о путешествиях и краеведении — «Глазелки». Олег забросил его
Всегда считал, что это серьёзная утрата для казанского городского интернета и мечтал сподвигнуть Олега продолжить заниматься блогом. Понимая, что потеря многолетнего труда — довольно сильный демотиватор, я очень хотел
К счастью повезло — блог целиком сохранился
Единственное, что пока не перенесено — комментарии. Сегодня, надеюсь, закончу и с этим, но их там немного, чтению блога это никак не мешает.
Рекомендую посетить обновлённые «Глазелки». Надеюсь Олег в скором времени напишет туда
AppleScript Tetris ★
Я очень люблю «ненормальное программирование» — где вместо получения результата (такого мне и на работе хватает), приходится преодолевать нетривиальные трудности, придумывать
Недостатка в таких задачах у меня в голове не бывает, но руки приложить к ним получается нечасто. «Тетрис» на ЭплСкрипте — один из примеров такого «приложения рук», прошло три года, но он до сих пор мне так нравится, что я решил рассказать о нём ещё раз.
Для начала немного об ЭплСкрипте. Это скриптовый язык для автоматизации, который встроен в МакОС в незапамятные времена — в «Википедии» написано, что он появился аж в 1993 году, то есть широкоизвестный ПХП его младше аж на два года!
Несмотря на то, что язык уже несколько лет не обновляется, заброшенным его не назовёшь, скорее всего в нём просто нечего обновлять — все задачи, которые он призван решать, он решает, в МакОСи есть даже встроенный визуальный редактор и я знаю ребят, которые делают на нём потрясающие вещи в плане создания
Естественно можно программировать и в обычном текстовом редакторе, программы в этом случае выглядят как текст на немного необычном английском языке:
tell application "Microsoft Word" to quit
display dialog "Hello, world!"
print pages 1 thru 5 of document 2Сильно популярным его не назовёшь, но в своей нише он хорош и продвинутые «маководы» о нём знают. До «Тетриса» я писал на нём «песню о пиве» и интерпретатор Брейфака.
За всё историю существования на ЭплСкрипте никто никогда не писал графических интерактивных игр. Причина проста: в языке нет поддержки графики и опроса клавиатуры. ?, расходимся!
Тем не менее идея создать на нём
Первым придумался способ вывода графики — я подумал, что фигуры можно рисовать свёрнутыми окошками
Для этого, в припципе, всё есть — ЭплСкрипт умеет запускать программы и управлять размерами и расположением окон:
tell application "TextEdit"
set the bounds of 1st window whose id is wid to {x, y, (x + |size|), (y + |size|)}
endКогда я попробовал это запрограммировать, меня ждал сюрприз: оказывается программно размер окна можно стягивать в точки разных размеров (мышкой это сделать не получается), составленные из них стакан и фигуры выглядели вполне приемлемо.
Так как вся графика создаётся окошками приложений, то традиционного окна, в котором всё работает, у программы нет — его роль выполняет рабочий стол. Стакан тетриса прилеплен к верхнему краю и отцентрирован по горизонтали.
В первом же прототипе появилась ещё одна проблема — наверху у «МакОСи» есть строка меню, приложения не могут на неё залезать, при попытке вывести в эти координаты окно, оно «сползает» вниз. В итоге первые несколько точек выводились в других координатах и всё рушилось. Было два решения — центрировать ещё и по вертикали
В итоге, способ придумался. Сразу после запуска я вывожу окно в нулевые координаты и смотрю на сколько пикселей оно съехало, это и будет высотой меню:
-- Get height of menu bar
tell application "TextEdit"
activate
make new document at the front
set the bounds of 1st window to {0, 0, 0, 0}
set coords to bounds of 1st window
close 1st window
end
set minimalY to coords's item 2С графикой разобрались, а что с клавишами? В ЭплСкрипте, как я уже говорил, нет способов опросить клавиатуру, существуют плагины и сторонние решения, но их использование рушит всю идею. Хотелось чистого решения.
Голову пришлось ломать очень долго, пока в один момент я не додумался заиспользовать под это опрос значения громкости — уменьшение и увеличение громкости как кнопки влево/вправо, а отключение динамика — для поворота фигуры.
Для этого на пуске я устанавливаю громкость на середину и в цикле опрашиваю текущее значение. После каждого изменения значение опять сбрасывается на среднее:
on levelReset()
set volume output volume volumeMiddle without muted
end
on checkDirection()
set level to output volume of (get volume settings)
levelReset()
_sign(level - volumeMiddle)
end
on checkRotate()
return output muted of (get volume settings)
endТут _sign — моя собственная функция взятия знака, у ЭплСкрипта нет встроенной.
В получившийся вариант вполне можно играть — я пробовал. Немного странное управление через несколько минут уже перестаёшь замечать, единственное, чего не хватает — кнопки сброса фигуры, но тут уж ничего не попишешь.
Если вдруг
Полный исходный код есть на гитхабе.
Друг наш Лазарь уснул. Я иду разбудить его ★
В фантастике встреча с уже умершими родственниками — нередкая тема, там, кажется, перебрали уже всё — и оцифровку сознания, и заморозку с периодической разморозкой, и восстановление личности по цифровым следами, и много другое.
Я потребляю довольно много фантастики и кажется она меня должна была к этому подготовить, но нет… Когда я смотрю корейский ролик, уже не фантастический, из нашей реальности, где мать встречает в виртуальной реальности свою умершую семилетнюю дочь, мне, пожалуй, жутко. К такому я не готов.
Мне уже 42 и в этом возрасте более чем естественно столкнуться со смертью родственников. Многих из них я иногда вспоминаю, по тем, кто мне был особо близок, — скучаю. Иногда накатывает самая настоящая тоска, например, хочется увидеть бабушек, поговорить,
Видимо для участницы этого эксперимента это своего рода терапия — её дочь умерла несколько лет назад и она до сих пор её не отпустила, искала возможности увидеть её ещё раз, пусть и в таком качестве.
В моём же случае, как кажется, такие встречи только разбередили бы горе. Да и обмануться трудно — ведь ясно же, что в этой симуляции очень мало от прежней личности умершего. Я так понял создатели использовали
Но в будущем технологии обязательно продвинутся настолько, что мы будем способны воспроизвести личность. Большой вопрос — готовы ли родственники к существованию
Наверное ответ тут в том что будет позволено такой личности — плавать в собственной беспомощности, как рыбка в тесном аквариуме, или активно участвовать в жизни общества будущего.
В общем, киберпанк стал на шаг ближе.
Але́кса против Яндекс.Станции ★
В довесок к умному дому, как и планировал купил голосового помощника, только не одного, а двух — и заграничную «Але́ксу», и отечественную «Алису». Первую я планирую использовать для изучения дочкой английского, а вторую, в итоге, взял для наработки опыта использования таких устройств в принципе.
Когда не умеешь обращаться с голосовыми помощниками, неродной язык становится дополнительным сложным препятствием.
«Алекса» не разочаровала — отлично выхватывает своё имя, даже рядом с закипающим электрочайником среагировала моментально! Мне даже показалось, что она умеет вычленять из общего шума голос обратившегося — у меня не было никаких проблем с выдачей команд и в том случае, если фоном разговаривали жена с дочкой. Впрочем, возможно всё дело в том, что язык команд — английский, и фоновый русский разговор ему не мешает. Мой акцент «Алекса» понимает без малейших усилий, даже с неправильными удалениями. Синтез голоса сделан очень качественно, он чёткий и без машинных интонаций.
Звук удивительно хороший для такой малютки, очень приличные басы. Основной сценарий использования сейчас — прослушивание музыки, с этим всё очень хорошо. Пришлось купить подписку на стриминговый сервис «Дизер» (169 рублей), думаю пожить пока с ним, потом попробую
Неожиданно всё плохо оказалось с интеграцией с «Сяоми» — из всего оборудования распознался только пылесос, это расстроило, а я рассчитывал, что по этому параметру «Алекса» будет вне конкуренции.
С «Яндекс.Станцией» всё несколько хуже. Я взял вариант «мини» — полновесная бандура мне не понравилась визуально, да и у «мини» всё управление происходит жестами, мне показалось, что это интереснее.
«Станция», по сравнению с «Алексой», звучит заметно хуже — как будто
Тут за натужный юмор «Алисы» начинаешь испытывать настоящий испанский стыд. Если кто не знает, «Алиса» пытается притворяться человеком — шутит, отвечает разнообразными фразами. Наверное это ещё будет хорошо работать, но пока всё портят две вещи — огрехи синтеза голоса и выхватывание случайных фраз из фонового разговора. «Алекса» в этом случае отвечает «I’m not sure» или подобное, а «Алиса»,
Управление жестами тоже оставляет желать лучшего — шевельнувшаяся от ветра занавеска или проходящий кот могут внезапно задрать громкость до небес.
Из плюсов — русский язык. Общаться с помощником на русском заметно проще, русские названия «Алиса», разумеется, понимает лучше «Алексы» — особенно смешно, когда мы пытались заставить «Алексу» поставить песню Ёлки (на «Дизере» она есть), а получали сборник для йоги.
За 169 рублей подписки на «Яндекс.Плюс» получаешь возможность слушать музыку и сказки, вчера вечером укладывали дочку под плейлист колыбельных, удобно.
Другой плюс — работает с моим хабом «Сяоми», соответственно умеет управлять «умной» лампой в детской и розеткой. Для дочки это сейчас основное развлечение.
Мне сложно сказать какой из двух гаджетов лучше, у каждого есть достоинства. Будем пользоваться дальше, если в ощущениях
Старость и смерть ★
Сегодня утром, пока я чистил зубы, дочка взобралась на табурет рядом. Долго тревожно вглядывалась в лицо, потом показав пальцы щепоткой, спросила:
— Папочка, а ты немно́жечко постарел? Вот столько?
— Да, совсем немножечко.
Продолжая тревожно на меня смотреть:
— А мы с тобой скоро в скелетиков превратимся?
Тут у меня
— Нет, — отвечаю, — пройдёт
— А когда люди умирают, он потом исчезают?
— Ну… да.
— А потом снова появляются?
— Нет, доченька, не появляются.
— Почему?
— Так заведено, такие правила.
Долгая пауза. Потом хитрый вопрос с улыбкой в глазах:
— А Чеширской Кот пропадает, а потом появляется?
— Конечно!
— Ну что же, папочка, ты этого не знал, да?
Кажется ушли от темы.
Думаю пока рано нам откровенно говорить о смерти, да и вопроса я, признаться, не ожидал. Пожалуй, это самый сложный для меня вопрос для обсуждения в любом возрасте, а как про это корректно рассказать в три года, я не знаю. Могу только надеяться, что через
Бум! ★
Но это достаточно очевидный случай, у меня достаточно накопленного опыта, чтобы успешно сопротивляться этому искажению. А что с вещами, с которыми в жизни сталкиваться не довелось? Например, я несколько раз стрелял из огнестрельного оружия, но этого не хватает, чтобы понять где в фильме ситуации из жизни, а что добавлено для зрелищности.
Вот в фильмах частенько
В моих глазах это выглядит небольшим преувеличением,
На помощь приходит Мэтт Каррикер — известный оружейный видеоблогер, ведущий канала «Разрушительное ранчо». На видео он проводит эксперимент — стреляет в замки́ из различного оружия, начиная с пистолета П22, заканчивая снайперской винтовкой Барретт
99 бутылок: ElanTele ★
70. ElanTele («змеиный язык», видимо намёк на Пайтон) — язык программирования, интерпретатор которого позволяет писать как на английском, так и на татарском. Насколько я понял, это
Обычные конструкции на месте — ветвление, два цикла, определение функции, простенький
// beer.et by Evgeny Stepanischev
вар бөтеннәрюлы := функция(ә) бу
вар саннар := ["0","1","2","3","4","5","6","7","8","9"]
вар олыара := ә/10
вар нәтиҗә := саннар[ә - олыара*10 + 1]
әгәр ә > 9 буочракта
нәтиҗә := саннар[олыара + 1] + нәтиҗә
бетте
кайтар нәтиҗә
бетте
вар форматлау := функция(шешәләр) бу
вар нәтиҗә
әгәр шешәләр = 0 буочракта
нәтиҗә := "no bottles"
башкаочракта
әгәр шешәләр = 1 буочракта
нәтиҗә := "1 bottle"
башкаочракта
нәтиҗә := бөтеннәрюлы(шешәләр) + " bottles"
бетте
бетте
кайтар нәтиҗә + " of beer"
бетте
вар ә,
дәвамында ә эчендә 1..99 элмәк
:= форматлау(100-ә)
яз
+ " of beer on the wall, " +
+ " of beer."
яз "Take one down and pass it around, " + форматлау(99-ә) + " on the wall.\n"
бетте
яз "No more bottles of beer on the wall, no more bottles of beer."
яз "Go to the store and buy some more, 99 bottles of beer on the wall."Естественно сначала я написал программу на английском, потом перевёл конструкции на татарский, руководствуясь примером в репозитории проекта и файлом расцветки для редактора, после чего обратился к своему хорошему другу А. Х., который помог перевести на татарский имена переменных и функций.
Было очень интересно попробовать программировать, не зная язык, который лежит в основе — из всех татарских слов в программе мне понятны «бу» («это»), «функция», «бетте» («всё»), ну может ещё «форматлау»
Новости майнинга ★
В субботу был на малой родине, у нас была встреча выпускников техникума, с большинством ребят мы не виделись почти 24 года. Заново познакомились, рассказали кто чем занимается, вспомнили разные случаи из учёбы.
На очередном перекуре один из бывших одногруппников — А. А. упомянул, что занимается ремонтом майнинговых ферм на «айсиках» (специализированных процессорах для «майнинга»). «Майнингом» сейчас называют задачу по вычислению «криптовалюты» — своеобразных электронных денег.
Меня это заинтересовало, ведь насколько я знаю, «майнить» сейчас невыгодно — стоимость затраченного электричества оказывается выше стоимости добытой криптовалюты.
Оказалось, с этим научились справляться. Дело в том, что большинство крупных предприятий закупает определённое количество электричества оптом. Если потратить слишком мало, закупочная цена в будущем вырастет. Поэтому предприятию выгодно
Другой способ — генерируемое электричество из сжигаемого газа. Моя малая родина находится в нефтяном районе, а нефти часто сопутствует газ. Возможно есть
Хотя… По дороге на встречу я видел несколько газовых факелов — две или три штуки. Кажется они горели и два года назад, в мою прошлую поездку в этом направлении. Возможно просто так совпало и оба раза я проезжал мимо, когда делали аварийный сброс или проводили
PythonFuck ★
Давайте вспомним, что у меня блог ещё и про программирование.
Есть такое развлечение — не используя
Для некоторых языков такого ещё никто не делал, приходится изобретать собственные приёмы, в конечном счете это интереснее всего. Я уже делал PHPFuck, BashFuck (и даже не один раз) и совмещал JavaScriptFuck с языком программирования Brainfuck.
Как правило ещё стараются использовать как можно меньше различных символов, но я этим не заморачиваюсь, мне гораздо интереснее соблюсти запрет на буквы и цифры.
Долго мне казалось, что с Пайтоном ничего такого не сделать и я даже пытался, но не получилось. А вчера, пока делал для студентов
_=(''<())+(''<());__=_**_**_
___='%'+('%'+`'±'`[_])%(__-_-_)
___*(_*_*_-_)%((
(__+_)*_*_,
`{_}`[_/_],
)+(`(''<'')`[_],)*_+\
(
__*_*_*_-__-_/_,
__*_+_/_,
))Это запускается и работает (выводит строку «Hello!»), но только из командной строки и только во второй версии Пайтона. Когда напишу небольшой разбор кода, станет понятным почему.
Кара-бараз
★
Многих в стихотворении Чуковского «Мойдодыр» интригует, что «мочалок командир» появляется «из маминой из спальни» — вроде как что делать умывальнику в спальне, когда ему место в ванной?
Это несложная загадка. В казанском
Меня же больше интересовало что такое
Он ударил в медный таз
И вскричал:«Кара-барас!»
И сейчас же щётки, щётки
Затрещали, как трещотки,
И давай меня тереть,
Приговаривать…
Поначалу мне показалось, что это
Вспомнился ещё
Разгадка нашлась в другом произведении Корнея Ивановича — «Приключениях Бибигона». Там это слово повторяется несколько раз, как… заклинание:
— Вон погляди: бежит Барбос.
Ты думаешь, что это пёс?
Нет, это — старый Агафон,
Ваш деревенский почтальон.
Ещё недавно в каждый дом
С газетою или с письмом
Он приходил,но как-то раз
Колдун сказал:«Кара-бараз». И вдруг — о чудо! — в тот же миг
Барбосом сделался старик.
Видимо
Вишенкой на торте было бы указание
ДТП ★
Всем нелюбителям пристёгиваться в машинах хочу напомнить, что как бы вы не были уверены в своих навыках вождения или водителе, на дороге кроме вас есть ещё машины.
Сегодня в очередной, кажется, третий раз попал в ДТП в такси — водитель впереди резко затормозил, моё такси попыталось избежать столкновения, сзади на полной скорости в нас въехала машина. Удар был такой силы, что я его болезненно почувствовал всем телом, очень сильно приложился головой о подголовник, заболела голова. Болела недолго, думаю сильного сотрясения нет.
Если бы не был пристёгнут, без серьёзных травм не обошлось. Берегите себя!
Звательный падеж ★
Испытываю настоящее удовольствие от того как дочка обращается с русским языком. Если ей нужно
Или вот ещё. Мы тут недавно в заметке про межславянский вспоминали звательный падеж, а дочка изобрела собственный вариант — просто берёшь любое слово, добавляешь в конце «у» и тянешь:
Я много сетую на то, что русский язык почти не изобретает собственные слова, предпочитая брать их из английского и, реже, из других языков. Почему так? Есть
В споре «заимствование против изобретения» частенько вспоминают шишковские «мокроступы», которыми некогда было предложено заменить «калоши». Вспоминают
Вообще, хотелось бы, чтобы словотворчество вернулось в русский. Кажется мой единственный собственный опыт в этом деле, — изобретённое пятнадцать лет назад слово «латрас» (латинская раскладка), которое даже я сам не употребляю. Тем не менее, хочется всех призвать этим заниматься — если каждый изобретёт хотя бы по слову,
С ком приветом из 1928 ★
В последнее время
На сегодняшней фотографии — письмо, в которую была завёрнута катушка для печатающей машинки (про это ещё напишу отдельно). Обратите внимание как интересно написана буква «К».
В книге памяти Татарстана удалось найти репрессированного Трохимуса Ромуальда Ивановича 1923 года рождения, возможно это сын человека, написавшего это письмо.
Приняв эту шаткую теорию за отправную точку, на сайте «Память народа» находим подходящую кандидатуру на роль автора — Трохимуса Ивана Петровича, литовца по национальности. Место его рождения — Ленинград, совпадает с дислокацией одного заводов «Красный Октябрь» (это название упоминается в письме). На момент написания письма ему должно быть около 38 лет.
К сожалению, в рунете по этой фамилии ничего больше нагуглить не удалось. Во всемирном интернете тоже, но я подозреваю, что я просто неправильно записал «Трохимус» латиницей — не знаю как пишутся литовские фамилии, мои варианты — trohimus и trokhimus.
Добавлено позднее: на основании комментария читателя исправил национальность с латыша на литовца.
Эколингвист ★
Нашёл совершенно бомбический ютубовский канал «Эколингвист» — парень живёт в Польше и делает ролики про различия польского и других славянских языков. Для этого он связывается с носителями и они пытаются, разговаривая каждый на своём языке, понять друг друга.
Из роликов мне показалось, что поляки и чехи понимают друг друга без особых проблем, а русскому понять польский тяжелее, чем украинцу. Правда в ролике
Когда читаешь, понимаешь, что «pomaga w leczeniu chorych» — это «помогает в лечении хворых», а «pigułki» — «пилюльки» («пилюли», «таблетки»), но на слух это воспринять значительно сложнее.
Отдельной строкой меня поразил эксперимент общения на «интерславике» («межславянском») — это полуискусственный язык с упрощённой грамматикой, состоящий из слов, которые понятны большинству носителей славянских языков.
Кажется, что даже ничего учить не надо, если вы немного знакомы с украинским и церковнославянским или знаете
Отче наш, кторы јеси в небесах, нехај свети се име Твоје. Нехај пријде кральевство Твоје, нехај буде вольа Твоја, како в небу тако и на земји. Хлѣб наш всакоденны дај нам днес, и одпусти нам наше грѣхы, тако како мы одпушчајемо нашим грѣшникам. И не введи нас в покушенје, але избави нас од злого.
Попробовать свои силы в чтении можно на сайте Википедии на межславянском.
Возвращаясь к эксперименту. В ролике болгарин, поляк и хорват пытаются выполнить задания (prikaz), озвучиваемые на межславянском. Меня очень развлекло, krasiva zabava.
Пока смотрел, тоже пытался разобраться, что за задания даются, наибольшие трудности у меня вызвал выбор пальца в одном из задании, никак не мог сообразить, какой prst у меня velik — большой или средний. Забавно, что у хорвата возникла та же проблема.
Дневник жизни №3 ★
Продолжаю перепечатывать свои дневники жизни — я уже выкладывал тетради №4 и №8, на этот раз перепечатал дневник №3. Это самый конец 1991 года, в тетради — подростковый бунт, моё бесценное мнение по развалу Союза, увлечение паранормальными явлениями, эксперименты с алфавитом и изобретение собственного способа отображать эмоции в тексте.
Теория разбитных окон ★
Сегодня сделал двум мужчинам замечание в раздевалке спортзала — они громко разговаривали матом, а в раздевалке были дети. Мужчины мне парировали, что дети сейчас знают мат назубок, но материться перестали. Я ещё подумал — какая мощная демонстрация теории разбитых окон — если дети уже и так знают, то как будто и ничего страшного.
Потом мои мысли перескочили на дочку — моего собственного ребёнка, дальше по ассоциативному ряду — на её недавний день рождения и переход в старшую группу садика, в двуязычную среду
Только за сегодняшний день я услышал три англоязычные песни с матом — две в такси, одну спортзале. Если даже я на это реагирую, то что насчёт детей, изучающих английский? Вроде ещё недавно мат, включая англоязычный, из песен убирали — по радио крутили цензурированные версии, а теперь это никого не волнует что ли?
Если ваш ребёнок знает английский, то поделитесь опытом как вы его ограждаете от этого или расскажите почему не ограждаете.
Флоатинг ★
В прошлом году я писал о прогрессе в исполнении моих детский мечт. Из всего списка оставался последний пункт — побывать в космосе. С ним
Но, как говорится, никто не мешает есть торт по частям, поэтому я решил пока поэкспериментировать с ощущением невесомости. Есть вариант за 280 тысяч рублей сесть в самолёт и испытать невесомость в серии кратковременных падений, но меня жаба душит, поэтому я решил попробовать сенсорную депривацию (флоатинг), о которой лет 10 назад прочитал у Артемия Лебедева.
За этими мудрыми словами скрывается, если вкратце, опыт отмокания в водоёмчике с солёной водой температуры тела, в полной темноте и тишине. Смысл в том, чтобы на фоне нулевых сигналов на всех органах чувств, получить различные интересные переживания, например эффект отсутствия тела,
Для интереса оплатил часок, чтобы просто посмотреть — не будет ли время тянуться мучительно долго, и понял, что час — это очень мало, пролетел он очень быстро, хотя и непонятно почему. Расслабиться толком я не успел, более удачливые ребята, рассказывают о всяком — от озарений, до галлюцинаций, у меня ничего такого.
Мне сложнее чем большинству —
Впрочем, то зачем пришёл, — ощущение невесомости, я всё же получил, только очень ненадолго — ближе к концу, когда освоился. Очень расстроился, когда сеанс окончился.
Начал выкладывать дневники жизни ★
Как обещал ранее, начал выкладывать свои дневники жизни — тетради, которые я вёл в 1989—2000 годах. Начал с тетради №4 — она самая маленькая, всего четыре записи, посмотрю как пойдёт, насколько это вообще трудоёмко.
Записи доступны по тегу «дневники жизни».
В записях, которые уже доступны — устройство, чтобы бить одноклассников током (такие были развлечения тогда) и факт похода в кинотеатр на первый «Терминатор».
Артемий Лебедев и дети ★
Внимательно наблюдаю за всем, что пишет Артемий Лебедев, он для меня, как река Ганг для индуса, — святые его воды постоянно несут в себе
Поймите меня правильно, я за многое испытываю к нему благодарность. Когда веб только начинался, он вообще был для меня единственным ориентиром в том каким должен быть интернет. Моя единственная большая претензия к нему — я считаю, что он, авторитет для многих, превратил свой блог и сайт своей студии в питомник для толп
Как бы то ни было, я скорее большой фанат Артемия, чем ненавистник,
В общем, очень неожиданно для меня было прочитать у него в блоге упоминание про его десятерых детей — говорят он касался этой темы в одном из интервью пару лет назад, но я не смотрел.
Сначала я восхитился — меня едва хватает
А потом мне попался график его поездок по различным городам и странам — Артемий уже несколько лет много путешествует, двигаясь к своей цели — посетить все страны мира и посмотреть как можно больше городов.
И я вот всё думаю — как же с такими разъездами можно хоть
sudo по отпечатку пальца ★
На «Маке» я нередко использую командную строку — некоторые мои задачи через неё выполнять проще, чем через графический интерфейс. Как правило для этого используется непривилегированный пользователь, но иногда приходится
Обычно она запрашивает специальный пароль, чтобы убедиться, что тот, кто её запускает, действительно имеет право повысить полномочия.
И вот сегодня один из сотрудников спросил — работает ли у меня на «Маке» sudo по отпечатку пальца.
/etc/pam.d/sudo
первой строкой добавить
auth sufficient pam_tid.so
И всё, при следующем запуске sudo можно просто приложить палец к сканеру. Экономит уйму времени, спасает от опечаток, никто не сможет подсмотреть пароль.
Вино с привкусом ног ★
В кадре из фильма «Укрощение строптивого» 1980 года, который я приложил к этой заметке, Адриано Челентано давит ногами виноград. В фильме это позитивная сцена — он соревнуется с машиной в искусстве выжимать сок для вина и все рады, что человеческий навык главного героя победил бездушный механизм.
Что в детстве, когда я впервые посмотрел это кино, что сейчас эта сцена мне кажется донельзя противной. Сейчас даже больше, так как я вооружён статистикой (у каждого третьего — грибок стопы, с человека осыпаются десятки тысяч чешуек кожи, см. книгу Йаэль Адлер «Что скрывает кожа…»), остаётся только надеяться, что мне не довелось контактировать с вином, полученным таким способом.
Фильм до сих пор довольно известен, в основном — в виде маскулинных цитат слов главного героя, встречающихся в пабликах и каналах, что подогревает воспоминания о фильме и не даёт образу ног в винограде померкнуть в моей памяти.
Способ явно не маргинальный — фильм далеко не единственное его упоминание и практиковался, вероятно, многие сотни лет. И мне интересно — это я такой брезгливый, а остальным нормально или может это
Как вы относитесь к такому способу получения сырья для вина? Если вы живёте в Италии, то как относятся там?
Судьба патефона ★
В январе жена привезла от родителей патефон и пластинки к нему — всё это принадлежало её дедушке. Я заставил патефон звучать, но хотелось провести более профессиональный ремонт. К счастью, один из друзей, увидев историю в моём «Инстаграмме», посоветовал мастера по ремонту.
Неделю назад я отвёз аппарат на ремонт, а сегодня забрал совсем в другом виде. Мастер перебрал и смазал мотор, запаял прорванную мембрану и крепление «паучка», убрал ржавчину, приделал ножки и аккуратно покрасил корпус. Золотые руки у человека.
Прежде на патефон жалко было смотреть, а сейчас вид вполне музейный, небо и земля. И звучать стал очень хорошо — мастер оценил на «4+», я на столько даже и не рассчитывал.
Заодно попросил оценить все пластинки, которые перешли к нам вместе с патефоном. Их оказалась 31 штука, почти все —
Ранее в интернете я натыкался на упоминание «вечных» игл, пользуясь случаем, проконсультировался. Увы, «вечных» (корундовых и сапфировых) игл для таких аппаратов не существует, не позволяют конструктивные особенности, поэтому придётся использовать обычные, стальные.
А это неудобно. Про их недостаток я уже писал — одной иглой можно проигрывать только одну сторону одной пластинки, так как игла стачивается под форму дорожки. Потом надо брать следующую. У меня 45 игл, закончатся и снова придётся отдавать их мастеру на правку. Но раз выбора нет, то нечего и горевать, будем играть по правилам семидесятилетней давности.
Очень надеюсь, что когда дочка подрастёт, ей будет интересно узнать какие песни любили слушать её прадедушка и прабабушка.
ФИДО ★
Не знаю как кратко объяснить что такое Фидонет (Фидо) тем, кто никогда о нём не слышал. Наверное можно сказать, что это одна из первых социальных сетей, некогда связавшая очень специфичных людей — в те времена, когда интернет ещё не был распространён. Сложность подключения была своеобразным тестом на интеллект, а строгие правила требовали владения социальными навыками,
В моём случае так получилось, что высокоскоростной доступ к интернету я получил раньше, чем Фидо смогло заинтересовать меня своими преимуществами, поэтому я
Самое моё значимое участие в жизни Фидо —
Для айтишника старой школы, к которой я себя отношу, отсутствие интереса к легендарному Фидонету
Сегодня заявку одобрили и дали мне поинта (адрес) 2:5020/723.67. Скачал клиента HotdogEd под Андроид, установил ему плагин HotdogEd Fidonet Provider, заполнил настройки из присланного в ответ на заявку письма, и вот я в Фидо.
Для меня названия настроек были настолько не самоочевидны, что я было приуныл, но оказалось, что обязательных всего четыре. Если вдруг тоже захотите подключиться, то указывать надо следующее:
- «Boss 3D FTN address» — адрес ноды (в моём случае — 2:5020/723)
- «Your name» — «имя» из ответного на заявку письма
- «Your 4D FTN address» — ваш
поинт-адрес (в моём случае — 2:5020/723.67) - «Password» — пароль из письма
Потом останется подписаться на интересующие вас «эхи» (каналы) и можете начинать общаться. Я пока подписался на две локальные и на su.talks — всероссийскую болталку.
Пока причастности к легенде не почувствовал, но гештальт, надеюсь, закрыл.
Яндекс.Драйв ★
Я в Москве — мы тут с коллегами, втроём запускаем новый проект, находимся в длительной командировке. Вчера попробовали добраться до офиса при помощи каршерингового сервиса «Яндекс.Драйв», так как в метро по нашей ветке
Очень расстроен. Мне не понравилось.
Навигатор в машине очень тормозит. Нам достался автомобиль «Рено Каптюр», не знаю везде ли работает одинаково плохо. Карта поворачивается с заметной задержкой, скачкообразно, новый маршрут прокладывается иногда с минутным или больше опозданием. Однажды мы проехали поворот и две минуты ехали в неизвестности, пока навигатор пытался разобраться где мы.
А ещё неожиданно оказалось, что голосовой помощник «Алиса»
Чёрт с ним с помощником, но этой информации в доступной форме нет и нигде в автомобиле — когда приехали на заправку, пришлось звонить в техподдержку и ждать когда они нам объяснят чем, сколько заправлять, а главное — чтобы разблокировали топливную карту, которая лежит с пакетом документов в автомобиле. И лично для меня не очевидно, что карту можно использовать не на любой заправке. Неплохо бы положить в автомобиль небольшую ламинированную одностраничную инструкцию.
☹️Я не впечатлён.
Физическое воплощение TCP-пакета
★
В чате бывших сотрудников «Яндекса» сегодня всплыла безвестная картинка с пакетом (на самом деле — сумкой) с принтом в виде TCP-пакета. Каламбур зашёл, местные гики изошли слюной.
Я тоже заинтересовался — где такую взять и ценой вопроса. С заметным трудом разыскал источник — китайский мономагазин, сумка стоит
Видимо не удастся такую получить, разве что найти
Apple I ★
Заметил позитивную тенденцию — меня снова стали интересовать статьи на «Хабре», вплоть до зуда
Не знаю, что ребята сделали, но направление верное, молодцы!
В общем, прочитал недавно там статью про самодельный «Эпл I» и сегодня не спал до двух ночи.
Нет, свой компьютер я не собрал, да и начиналось всё невинно — сначала скачал несколько эмуляторов, попробовал
Для этой цели мне очень подошёл «ОупенЭмулятор»
Первая моя программа умела совсем мало — только бесконечно выводить на экран таблицу символов. Она такая короткая (всего восемь байт), так как для самого сложного — печати на экран, используется вызов ECHO, встроенной в «Эпл I» программы «Woz Monitor», — по всей видимости её писал Возняк, поэтому она так называется.
В ассемблере 6502 особо не развернёшься — три восьмибитных регистра (A, X, Y), 56 команд (не считая нескольких недокументированных), только целые числа, нет деления и умножения. Я совсем не помню свой первый ассемблер
Тем интереснее было написать
Кстати,
Там всего несколько страничек, вникнуть просто и сейчас (о ужас!) мне даже удобно.
Самый долгий merge в моей жизни ★
Заметка будет интересна только программистам.
Фотография ниже лежит у меня на ноуте с августа 2013 года. Очень не люблю такое — всё нужное я привык закачивать в интернет, всё ненужное — удалять. Не мог определиться куда деть это фото, решил положить в блог, снабдив небольшим рассказом.
Наверное все программисты знают что такое «мерж» (merge) — слияние двух веток и согласование изменений, сделанных в файлах в рамках этих веток. Если системе контроля версий удаётся справить самостоятельно, то «мержи» происходят автоматически, это, в моей практике, наиболее частая ситуация. В противном случае возникает «конфликт» — «мерж» останавливается до разрешения конфликта человеком. Только человек может решить как будет выглядеть сводный код, учитывающий изменения, сделанные в двух слияемых ветках.
Я однажды попал в неприятнейшую ситуацию, когда две команды в нашей компании, в силу многих причин, независимо работали над одним и тем же продуктом около года.
Одна из команд работала над функциями, которые нужны в продукте заказчику, вторая, которой руководил я, — делала несколько довольно серьёзных изменений с заделом на будущее, в частности — внедряла шаблонизацию.
Через год попытались слить две ветки воедино и получили конфликты почти во всех основных файлах проекта. Ничего совсем уж неожиданного, конечно, особенно с учётом того, что часть кода была переписана с ПХП на «Твиг», но никогда в ещё в жизни я не видел столько конфликтов. Затронуты были, если мне не изменяет память, несколько сотен файлов.
С одной стороны, других вариантов, кроме как собрать это всё воедино, не рассматривалось, с другой стороны, объём предстоящей работы удручал.
В общем, погрустил я, погрустил, повесил табличку «Не беспокоить» и заперся в кабинете на неделю. Каждый файл с конфликтом распечатывал дважды — из каждой ветки. Потом раскладывал распечатанное на полу, выделял маркером одинаковые места, рисовал стрелками что куда переместилось, шёл к ноутбуку и так или иначе разрешал конфликт.
На фотографии — процесс разрешения конфликтов одного из файлов. Через неделю я был полностью разбит монотонностью работы, но ветки слил.
Барахолка на Гудованцева ★
Если про блошиный рынок в парке Тинчурина знают почти все казанцы, то про барахолку на Гудованцева слышало гораздо меньше народу. Я случайно узнал о ней
Сегодня едва успел к закрытию (торговать там начинают часов с 8, заканчивают около 12), к тому же сильно мешал снегопад, но всё же одним глазком глянул.
Ассортимент — поздний СССР, современный Китай и всякий подержанный скарб. Через снег трудно оценить, но в среднем
Ходили с дочкой, поэтому в основном покупали игрушки (олень — 30₽, енот — 100₽), а мне приглянулась советская звезда на ёлку (150₽), два раза мимо неё прошёл, но всё же купил. Поторговаться пришлось только за звёздочку (сбил цену почти в два раза), остальное взял так.
Ещё не проверял, исправна ли звезда, если нет, поставлю внутрь яркий светодиод, сменю питание с 220 на низковольтное, так ещё и безопаснее. Главное ведь не лампочка накаливания внутри, а эмоциональный накал, который дарят такие, с историей вещи.
ТЭГК 2-2
★
Полвека назад на территории нашей необъятной Родины многое было иначе. Люди обходились без «айфонов», интернета и иногда — электричества.
Электрификация страны началась в двадцатых, но к 50—60 годам ещё немало деревень и прочих населённых пунктов не знало «лампочки Ильича» — вместо неё избы освещала керосиновая лампа. Конечно и там людям хотелось быстро получать новости, знать чем живёт остальная страна.
Для удовлетворения культурного голода в условиях отсутствия электроэнергии, советская промышленность выпускала домашние термоэлектрогенераторы — приборы, преобразующие тепловую энергию в электрическую.
На фотографии — «ТЭГК
Немаленькая бандурина в 6,6 килограмма, состоящая из термоголовки и керосиновой лампы «Молния». Выдаваемой мощности в два ватта хватало для питания ламповых радиоприёмников «Новь»,
Судя по тому, что инструкция к нему шла на трёх языках — русском, французском и английском, эта модель шла и на экспорт.
При объёме лампы 0,75 литра, расходе керосина в 70—80 г/ч и плотности 830—860 кг/м³, легко подсчитать, что радио можно было слушать около 7—9 часов на одной «заправке» (правда порядка 20 минут ещё съедал прогрев после каждого включения). Одновременно генератор являлся и источником света.
Красная ртуть ★
Люблю лавки старьёвщиков, блошиные рынки. Полюбил ещё заочно, прочитав в детстве описание
После возвращения в Казань прочитал про «блошку» на Тинчурина у своего приятеля Б. К. и загорелся сходить. С тех пор иногда там
Блошинные рынки интересны не только вещами, но и позабытыми идеями — мемами времён СССР.
Например сегодня, пока выискивал взглядом в пыльных книжных залежах идеологии прошлого века
Про красную ртуть в своём советском детстве я узнал от Д. П., мы тогда очень дружили, именно он мне рассказал о легендарной в те времена «ртутной антенне» — чудодейственном устройстве, обладающим демонической силой улавливать и усиливать любой сигнал.
Антенна, по его словам, представляла из себя запаянную стеклянную трубку с красной ртутью внутри. Сейчас я думаю, что эта «антенна» была
Не помню зажёгся ли я идеей, но отсутствие источника красной ртути должно было охладить пыл. В «Википедии» пишут, что миф был очень живуч и спрос рождал предложение — под видом красной ртути продавали воду с красителем, ртуть с битым кирпичом и так далее, но мне такие предложения в детстве не попадались.
Музыкальная шкатулка ★
Пришла в голову неплохая, как мне кажется, идея — вместе со студентами высшей школы ИТИС перевести в цифру диски для музыкальных шкатулок, которые хранятся в институте, куда я передавал найденную в этом году в заброшенном сельском доме дореволюционную библиотеку.
А то дисков у них много, а сил всё это перевести в электронный вид нету.
Возни, вроде, не так много — снять микрофоном звук с разных музыкальных шкатулок (их там два вида под разные диски), после чего сделать систему, в которую загружаешь фотку диска, а она его проигрывает, ориентируясь по прорезям, которые надо научиться распознавать на фото.
Свёл между собой директора ИТИСа и заведующего Центром письменного и музыкального наследия, надеюсь сотрудничество даст плоды.
Я знаю, что есть работы по распознаванию виниловых пластинок по тому же принципу (естественно только моно, у стереофонических второй сигнал записан в глубину, по фото такое не проиграешь), тут должно быть попроще, я бы в студенческие годы такую работу с руками у руководителя оторвал.
41 ★
У меня есть такая традиция — каждый год на свой день рождения писать список того, что изменилось за время, прошедшее с предыдущего дня рождения. Кажется эта одна из немногих традиций, которую я пока не сломал, хотя писать этот
По ощущениям это был сложный год, я много работал и мало отдыхал, тем обиднее, что многое задуманное не успелось и переносится на следующий отчётный период. ?
Наверное не сюрприз, многие начинают сталкиваться с этим эффектом
- начал регулярно стричься налысо, теперь даже бывшие одногруппники не узнают;
- прочитал 36 книг, на девять больше, чем в прошлом году;
- съездил в отпуск в Грецию и в Турцию (в Белек), последней поездкой сломал традицию отдыхать каждый отпуск в новой стране;
- получил два экспоната для нашего Музей вычислительной техники — чёрную перфоленту и радиационную линейку;
- стал намного активнее писать в блог, сменил ему движок на Эгею (адский по сложности переезд), хостинг и перешёл на протокол ХТТПС;
- осуществил свою детскую мечту — нашёл клад! из всего списка остался только полёт в космос;
- нашёл в заброшенном доме и передал учёным дореволюционную библиотеку книг на татарском языке, можно сказать, что это тоже клад, только культурный;
- решил не писать больше о выездах «по монеты», буду теперь только интересные находки описывать, такие как «татарстанская монета», жетон на монисто с луной и солнцем и серебряная чешуйка;
- съездил дважды с военными поисковиками, надеюсь в этом году плотнее примкнуть к этому движению;
- попал на Баш, дважды;
- подзабросил велосипед, но не забросил спортзал, спасибо моему тренеру Н. С., «день ног» дал плоды — разогнался до 55,5 км/ч на велике на дороге без видимого уклона;
- попробовал такую штуку как «боксы», сильно не впечатлился, но опыт интересный;
- запрограммировал «песню о пиве» на «SCSS», «Постскрипте», «Cmm» и «Расте», вообще сделал набег на «Раст» — разобрался в синтаксисе, немного попрограммировал;
- а так же написал аналог команды tee на ассемблере под Линукс, посмотрел как пишутся модули ПХП на Гоу, развлёк себя азбукой Морзе на языке Эр и тетрисом на ЭплСкрипте (кажется это первая игра в реальном времени на этом языке в мире);
- всё ещё интересуюсь неубитыми пока в Казани кусочками старины — на поприще кирпичных клейм нашлось новое клеймо Victoria, заинтересовался другими элементами городской среды — люками и страховыми досками;
- поучаствовал в этом году в «Том Сойер Фесте», в том числе поменджерил проект изготовления реплик страховых досок для казанских деревянных домов;
Родовое дерево ★
Меня в последнее время несколько раз спрашивали — почему не публикую никаких новостей по родовому дереву? Забросил исследования?
Нет, не забросил, прекратил. Тому есть две причины.
Если все архивы были бы переведены в текст, составление родословной заняло бы совсем небольшое время, несравнимо меньшее, чем годы, которые потратил на это я. Причём точность была бы выше. Препятствие одно — машины пока не умеют распознавать рукописный текст. Пока. Но они научатся. Думаю осталось потерпеть 5—7 лет.
И тогда часть моих трудов, та что касается сидения над архивными делами, обесценится. Так к чему тратить время?
Клад! ★
С детства мечтал найти клад. Сны годами снились, разнообразные, но с одной сутью — в них я зачерпывал мягкую землицу руками, а в руках оставались монеты…
Но всерьёз найти
Тем не менее на днях повезло — на частной территории (всё с ведома хозяев, всё легально) наткнулся на клад из более чем 170 медных монет времён Николая Второго. Ценность у него, естественно, никакая, но это не умаляет того факта, что это настоящий клад.
Выкапывал три дня — клад был насыпан узкой полоской, но небольшая часть монет «мигрировала» в силу
Кстати монеты почти одинаковые —
Книги детства ★
Потихоньку формирую дочке библиотеку «на вырост», чтобы ко времени, когда у неё проявится интерес к самостоятельному чтению, были готовы объекты, на которые его можно было бы направить.
Пока формирую на основе своих детских воспоминаний, — закуплены «Анечка Невеличка и Соломенный Губерт» Витезслава Незвала и две повести о приключениях Алисы Льюиса Кэррола. Причём именно в тех изданиях, которые у меня были в детстве.
Как раз сегодня получил вторую книгу и задумался — девочек и мальчиков, очевидно, воспитывают
В этой связи вопрос к родителям девочек и женщинам, которые любили читать в детстве — что бы вы порекомендовали купить девочке на возраст, когда текст начинает преобладать над картинками?
Находки с Волкова ★
Во дворе того же дома на Волкова, где мне показали два дореволюционных клейма на кирпиче, прошёлся сегодня с металлодетектором. Спасибо хозяевам — А. и О., а так же М. за гостеприимство!
Искать было непросто — во дворе, как это обычно и бывает, очень много бытового металла — гвоздей, пробок от спиртного, фольги, но всё же упорство было вознаграждено.
Большой вопрос откуда взялась гильза. Я думал, что руку приложила революция, например
Год назад этот дом уже посещали знакомые хозяев с металлоискателем в руках, вроде ничего не нашлось тогда, кроме вечных пробок, конечно, они постоянно мешают.
Одну из находок оставил хозяевам — в мощённой тропике нашёлся железнодорожный костыль. Вышел довольно легко, видимо был просто забит в землю. С какой такой стати — ещё одна загадка.
С днём Победы! ★
Элиуд Кипчоге ★
Я бегал ещё до того, как это было модно — когда готовились к спуску в пещеры
Я не являюсь хорошим бегуном, да и комплекция у меня не беговая, для меня бегать — трудно. Я никогда не пытался осилить марафон (42 километра, напоминаю), уверен, что пробегу его, если буду тренироваться. Но я никогда не считал это плёвым делом.
Каждый раз, когда я слышу, что
Это почти в два раза быстрее меня на всей дистанции! Со средней скоростью выше, чем я обычно езжу по городу на велике!
Я вспомнил себя, бегущего эти чёртовы бесконечные десять километров, уговаривающий свои мышцы потерпеть и вот я
Чёрт возьми, такие достижения я уважаю!
PHP8 ★
Пока всё прогрессивное человечество переходит на ПХП7, а менее прогрессивное до сих пор чахнет
В официальной вики есть страница, где можно ознакомиться с довольно пока скудным списком предложений на восьмую версию. Меня больше всего заинтересовали два изменения, серьёзно ломающие обратную совместимость:
Изменение оправдано унификацией синтаксиса — сейчас используемая сущность выводится из контекста, скажем статические свойства начинаются с доллара, а методы — нет, но если имя метода хранится в переменной, синтаксис разваливается — нет способа указать что же имел ввиду программист.
Или вот похожий пример с константой:
class Sample
{
const test = 'const';
public static $test = 'variable';
}
$test = 'test';
// что ты такое?
var_dump(Sample::$test);
// на самом деле вернётся «variable», очевидно; константу придётся получить так:
var_dump(constant("Sample::$test"));В действительности можно было бы выкрутиться скобками (сейчас так можно вызывать анонимную функцию, записанную в свойство класса), не знаю рассматривали ли такой вариант, но возможно он менее интуитивен.
// так можно было бы получать константу по имени в переменной (не работает!)
var_dump(Sample::($text));Самым серьёзным внутренним изменением нового релиза, вероятно будет добавление JIT, Дмитрий Стогов, человек, которому мы обязаны фантастическим ускорением в «семёрке», ещё в позапрошлом году написал в рассылку php.internals, что работа над динамической компиляцией начата. Получившийся к тому времени прототип показал 20% прироста на синтетических тестах и снижение производительности на реальных приложениях.
Кстати, это не первая попытка совместить динамическую компиляцию и ПХП, в языке HHVM, диалекте ПХП от «Фейсбука», такая компиляция даёт хороший прирост в скорости. Да и Дмитрий сотоварищи ещё
Более свежий тест того, что будет в ПХП8 показывает, что на трёх тестах (два стандартных зендовских теста и построение множества Мандельброта) динамическая компиляция уделывает версию 7.1.0 примерно вдвое. Это отличный результат! Но понятно, что в реальной жизни всё будет скромнее.
Когда же выйдет «восьмёрка»? Дата, увы, неизвестна, но есть предположение, что новую мажорную версию вряд ли можно ожидать раньше сентября 2021 года.
Баг ★
Принято считать, что слово «баг» появилось 9 сентября 1946 года, когда Грейс Хоппер, которая работала в тот момент в Гарвардском университете с ЭВМ «Марк II», проследила ошибку в работе программы до реле машины, куда попал мотылёк. Грейс вклеила насекомое в технический журнал, сопроводив шуткой «Первый реальный случай обнаружения жучка» («First actual case of bug being found»).
На самом деле это одна из версий проникновения термина в среду компьютерщиков. В выпущенном в 1892 году «Стандартизованном словаре электротехники» можно прочитать:
Баг — это любая неисправность или дефект в электрических соединениях или работе электрических аппаратов
Как видим слово появилось раньше 1946 и даже не в 20 веке. По одной из версий термин придумал и популяризировал Томас Эдисон — известный американский предприниматель, Стив Джобс своего времени.
В своих письмах и дневниковых заметках он нередко употребляет это слово. Выше — скан его письма от 3 марта 1878 года (оригинал можно купить за пару тысяч долларов). В пятой строчке, сразу после артикля, написано «bug».
Употреблял ли Эдисон это слово в знакомом нам значении? Да! Так 18 ноября 1878 года он написал Тивадару Пушкашу (венгерскому учёному, физику, и изобретателю первой в мире телефонной станции):
Так было со всеми моими изобретениями. Первый шаг — интуиция, которая приходит как вспышка, затем возникают трудности — устройство отказывается работать, и именно тогда проявляются «баги» — как называют эти мелкие ошибки и трудности — и требуются месяцы пристального наблюдения, исследований и усилий, прежде чем дело дойдёт до коммерческого успеха или неудачи.
Так что термину в этом году исполняется по меньше мере 140 лет.
Казанская страховая доска ★
Страховые доски — металлические таблички, которые до революции крепились на фасад застрахованного строения (или над дверью застрахованной квартиры). Они всё ещё попадаются на старинных зданиях в российских городах, но всё реже — за ними охотятся коллекционеры.
Предпоследняя, довольно известная в Казани страховая доска висела на улице Волкова, но в прошлом году я заметил, что её нет на прежнем месте — говорят выкупил у хозяев известный в Казани коллекционер. Большинство сохранившихся досок сейчас в плачевном состоянии — без краски, ржавые,
Узнать местоположение последней страховой доски оказалось непросто, возможно поэтому коллекционеры пока до неё не добрались. Даже зная примерный адрес, нашёл только через полчаса поисков. Доска маленькая, сильно заржавела, пришлось занимать объектив у приятеля, чтобы снять.
Написано там следующее: «въ обществѣ РОССІЯ застраховано». На фоне — почти уже незаметная восьмиугольная звезда, намёк на икону «Неопалимая Купина». «Неопалимая Купина» почитается как заступница при пожарах, так что такая страховая доска одновременно играла ещё и роль оберега.
Дополнение: позже оказалась, что эта страховая доска вовсе не последняя.
ProxyJump ★
Host 10.1.10.*
IdentityFile ~/.ssh/id_rsa
#ProxyCommand /usr/bin/ssh -W %h:%p bolk@rptn.tunnel
ProxyJump rptn.tunnelВозможности её у́же, зато пользоваться ею проще. Кроме указания в конфиге, её просто использовать и из командной строки, как ключ, причём цепочки выстраиваются очень просто:
ssh -J bolk.sed-php7:2258,rptn.tunnel 10.1.10.158Сейчас в большинстве случаев использую именно этот ключ. С его помощью указывать туннели до того просто, что я даже не утруждают с занесением в конфигурационный файл.
🍎 + 🍍 + 🍌 = 🥗 ★
По интернету ходят сотни картинок, где надо «решить фрукты» — в уравнение в качестве имён переменных подставлены
Когда я увидел картинку выше, ради развлечения сунул её в «Вольфрам» — хотелось посмотреть как ему указать, что числа должны быть целые. Заинтересовало, что решения не нашлось. Я задумался и внимательно посмотрел на фрукты, в них подвоха тоже не увидел.
Оказалось, что картинка выше — пранк по мотивам статьи на «Кьюоре». Решить уравнение, которое на ней, сможет лишь небольшое количество людей со специальными знаниями, а прямой перебор значений займёт совершенно нереальное время.
Минимальные подходящие числа для уравнения такие (ответ проверял на ЯП «Эр»):
`🍎` <- 154476802108746166441951315019919837485664325669565431700026634898253202035277999
`🍌` <- 36875131794129999827197811565225474825492979968971970996283137471637224634055579
`🍍` <- 4373612677928697257861252602371390152816537558161613618621437993378423467772036
print(`🍎` / (`🍌` + `🍍`) + `🍌` / (`🍎` + `🍍`) + `🍍`/(`🍎` + `🍌`)) # [1] 4Это числа от 79 знаков и больше! Где уж такое решить!
Ассемблер под Линукс ★
Заметка про полноту по Тьюрингу команды присваивания в ассемблере натолкнула меня на мысль, что я
Тогда не довелось, решил вчера попробовать. Теорию в очень общих чертах я знал — есть системные вызовы (сисколы), которые можно дёргать
MOV RAX, 3 ; sys_read
MOV RBX, 0 ; stdin
MOV RCX, string ; адрес строки, которую выведем на экран
MOV RDX, len ; длина строки
INT 0x80Но я
MOV RAX, 0 ; sys_read
MOV RDI, 0 ; stdin
MOV RSI, string ; адрес строки, которую выведем на экран
MOV RDX, len ; длина строки
SYSCALLК тому времени меня посетила мысль сделать простенький аналог линуксовой утилитки tee, но для этого нужно было
Так как системный вызов для открытия файла (sys_open) как раз требует на вход сишную строку, я передал указатель, который взял со стека, в сискол, ожидая, что всё заработает. Это было моей ошибкой. Я потратил не меньше часа, разбираясь, что я сделал не так, перебирал способы передачи параметров, ползал по стеку при помощи отладчика gdb, ничего не помогало, пока не забрезжила догадка, что сами параметры командной строки тоже лежат на стеке и системному вызову это может не нравится.
Попробовал скопировать строку оттуда в данные и всё заработало. Не знаю что это было, пока не гуглил, возможно сделано из соображений безопасности. Времени потерял изрядно.
Пока получилась очень простая утилитка, но хочу её дописать как выпадет свободный вечер — сделать поддержку указания нескольких файлов и флага для режима присоединения. Размер радует, кстати, — всего 752 байта.
Дизассемблируй это ★
В моей жизни последовательно сменяли друг друга три ассемблера. Первый, для компьютера
В те времена я думал, что всю жизнь буду программировать на ассемблере, на деле же последнюю программу на нём написал в начале
В ассемблере есть такая команда — MOV (в некоторых ассемблерах — LD), записывает содержимое одного аргумента в другой. Сейчас набор комманд разросся, аргументом может быть почти что угодно — регистр, ячейка в памяти, сумма некоторого числа, одного регистра и другого, умноженного на число, но по сути это всегда присваивание.
И вот оказалось, что эта команда — полная по Тьюрингу. Звучит невероятно, но это так. Некие ребята заморочились и сделали компилятор, который компилирует любую программу на Си в последовательность команд MOV. Причём им даже ДУМ удалось скомпилировать, правда один кадр рисуется семь часов. Кстати, такая программа неуязвима для горюшка века — Мелтдауна и Спектра.
Есть небольшая (на 156 страниц и 90% воды) презентация, достаточно популярно объясняющая как этого удалось достичь, но для её чтения надо знать ассемблер, поэтому я позволю себе раскрыть детали трансляции двух инструкций, чтобы пояснить принцип для тех, кто ассемблера не знает или ленится причитать.
Например, сравнение двух чисел делается при помощи следующего псеводокода:
mov [X], 0
mov [Y], 1
mov R, [X]У нас есть два числа в аргументах «X» и «Y», результат сравнения которых попадает в «R» — там будет ноль, если числа не равны и единица в противном случае. Как же это работает?
Первой командой ноль записывается в ячейку по адресу «X». Это ассемблер, у нас тут всё — число, остальное — человеческие интерператации, поэтому записанное в «X» мы используем как адрес. Второй командой единица записывается в ячейку по адресу «Y». Третьей командой мы читаем значение по адресу «X» и если значения в «X» и «Y» совпадают, то ноль перетрётся единицей (и она попадёт в R), если нет, то в ячейке по адресу «X» ноль останется (который попадёт в R).
Несложно. Но из кода выше непонятно как получаются другие необходимые инструкции. Увы,
Возьмём, например, логическое «ИЛИ» («OR»), тут чуточку сложнее:
OR_ADDRS: dd OR_0, OR_1
OR_0: dd 0, 1
OR_1: dd 1, 1
; …
mov eax, X
mov edx, [OR_ADDRS + eax]
mov eax, Y
mov eax, [eax + edx]
mov R, eaxВо всех логических операциях ребята используют записанные заранее неизменяемые массивы значений.
Что тут происходит? В регистр (переменную, с которыми работает процессор) «eax» записывается значение «X» (возможные входные значения у нас тут — ноль или единица, численное представление булевых значений).
Далее в регистр «edx» записывается число из адреса, который является суммой адреса массива OR_ADDRS и содержимого регистра eax. Таким образом в eax попадёт OR_0 или OR_1, в зависимости от того былы записаны в eax ноль или единица. Эти значения — тоже числа и являются адресами двух других массивов из двух элементов.
Далее в eax мы записываем аргумент Y, его значение складывается с адресом полученным на предыдущем шаге и из получившегося адреса мы читаем записанное там значение. В переводе на ПХП получается следующее:
function mov_or(int $X, int $Y): int
{
define('OR_0', [0, 1]);
define('OR_1', [1, 1]);
define('OR_ADDRS', [OR_0, OR_1]);
$R = OR_ADDRS[$X][$Y];
return $R;
}Кстати, интересно, что у знаменитого дисассемблера «ИДА» от полученной таким образом программы крепко уносит крышу — при попытке отладки диссасемблер не видит никаких ветвлений и падает на анализе кода. Получился бы неплохой метод защиты от анализа, если бы не производительность.
Интернет-археология: браузер ViolaWWW
★
Пока читал про «
Эта вещь достойна внимания
Автор написал несколько программ на своём языке, например — шахматы. Я пока не нашёл документацию, зато обнаружил несколько примеров. Например, скрипт выводящий синусоиду:
\class {field}
\name {wave}
\parent {}
\children {wave.sb}
\script {
switch (arg[0]) {
case "graph":
f = float(arg[1]);
xx = width();
r = height() / 2.0;
theta = 0;
for (x = 20; x < xx; x += 2) {
theta = theta + 0.1;
y = sin(theta * f) * r + r;
drawLine(x, y, x, y + 1);
}
return;
break;
}
usual();
}
\width {300}
\height {200}
\
\class {slider}
\name {wave.sb}
\parent {wave}
\script {
switch (arg[0]) {
case "_shownPositionV":
usual();
send(parent(), "graph", arg[1]);
return;
break;
}
usual();
}
\x {2}
\y {2}
\width {15}
\height {200}
\shownSizeV {10}К сожалению, позапускать программы пока нечем. Исходный код я нашёл, но под Линуксом он компилироваться не захотел, собственно, судя по коду, он никогда под ним и не собирался. Я сделал минимально необходимые правки, код собрался, но попытка запуска завершилась крахом. Подумаю стоит ли тратить силы дальше.
Даже интересно какой бы веб мы увидели сейчас, если бы этот браузер тогда получил дальнейшее распространение! Получается
Насколько я могу видеть, поддерживалось более десятка форматов графики, в том числе всем знакомый GIF, правда без анимации и в формате 1987 года, а так же сейчас уже экзотический XBM (до относительно недавнего времени поддерживался «Эксплорером», «Сафари» и «Оперой»).
Военный поиск ★
Давно хотел присоединиться
Обычно они занимаются Великой Отечественной, а тут под закрытие сезона выехали на захоронение предположительно времён Гражданской.
Нашлось более дюжины захоронений, но похоже всё это гражданские — в могилах никаких металлических предметов, кроме кованых гвоздей — остатков гробов. Предположительно эти люди умерли от голода, либо
В могилах мужчины, женщины и дети, все захоронения по краям силосной ямы, видимо так их и обнаружили —
Находки было, но ничего относящего к войне, выложу отдельным постом, конечно кроме того, что я отдал поисковикам.
Билл «Кон» Гейтс ★
Какой херни только по радио не услышишь! Ехал вчера в такси, а по радио рассказывают про файл с именем CON, который нельзя создать в Винде, якобы потому что это было прозвище Билла Гейтса в детстве и он поклялся, что в его системе такой файл нельзя будет создать!
Ну что за бред?
AppleScript и Тетрис ★
Я тут книгу читаю про хакеров (в первоначальном смысле слова) — «Хакеры. Герои компьютерной революции». Книга довольно занудная, но тот дух, который она пытается передать, я ещё очень хорошо помню. Ассемблер, такты, хаки, придуманные трудности — всё это было как специи в программировании. Сейчас
И так тоскливо
Трудности, которые мне тут успешно самому себе удалось придумать, заключаются в том, что ЭплСкрипт в этой плоскости очень бедный язык. Если не сказать нищий. У него нет встроенных средств рисования
Для тех, кто не знает, надо наверное пояснить. ЭплСкрипт — это язык автоматизации пользовательских сценариев работы, он умеет управлять приложениями (с разной степенью успеха)
Так как возможности
Дольше всего я ломал голову над управлением, пока не придумал следующее — ЭплСкрипт умеет опрашивать значение громкости, так что клавиши уменьшения и увеличения я приспособил под сдвиг фигуры, а кнопку включения/выключения звука — под поворот.
Над скоростью игры я в некоторых местах поработал, но сильно углубляться не стал — ЭплСкрипт относительно шустрый, основную задержку вносит создание окон, это место вряд ли можно
Кажется это первая и единственная игра в реальном времени на ЭплСкрипте.
Крещение дочки ★
Неделю назад крестили дочку. Друзья и знакомые, когда об этом узнают, недоумевают — знают, что я атеист. Я атеист, да, правда, но это не значит, что я должен относиться к религии как ко злу.
Многие годы назад я был воинствующим атеистом и не понимал какой прок от религии. С годами многое изменилось, я понаблюдал за людьми, прочитал много статей на эту тему и понял, что религия многим нужна.
Не просто нужна, а очень нужна. Религия — последняя опора для многих людей в сложной ситуации, вера в то, что «всё не бессмысленно», что
Это не значит, что этот механизм единственный, в конце концов у меня в прошлом было полно таких ситуаций (наверняка будут и ещё), но я не тот атеист, что «до первой тряски в самолёте», у меня
Поэтому, совершенно не усматривая ничего плохого в религии, дочку я крестил даже
«Жизнь» Конвея на «R» ★
Игра «Жизнь» знакома, наверное, каждому программисту. Интересна она тем, что этот незатейливый алгоритм оказал существенное влияние на целый ряд научных дисциплин.
Не помню, чтобы я её
Сегодня ночью постарался написать классическую версию игры «Жизнь» на языке «Эр». Мне показалось это интересной задачей, так как «Эр» очень удобным образом позволяет работать со множествами так, как будто это скалярные значения.
Это можно увидеть почти сразу, в строке, где создаётся матрица случайных значений:
life <<- matrix(as.integer(runif(rows * cols) < ratio), rows, cols)Сравнение с переменной ratio и вызов as.integer тут применяется к каждому значению из множества, генерируемого функцией runif (Random Uniform Distribution, генерирует случайные значения с нормальным распределением). Так матрица игры заполняется случайными нулями и единицами.
Ниже по коду довольно много манипуляций с этой матрицей и выполнение правил алгоритма за счёт конструкций языка занимает всего несколько строк.
Суть такова: матрица двигается во все восемь направлений (с шагом 45°), все получившиеся матрицы складываются, это позволяет оценить количество соседей любой клетки в каждом из направлений. Далее в две строки выполняются основные условия:
# Any dead cell with exactly three live neighbours becomes a live cell
life.new[life == 0 & life.neighbors == 3] <- 1
# Any live cell with fewer than two or more than three live neighbours dies
life.new[life == 1 & (life.neighbors < 2 | life.neighbors > 3)] <- 0Тут участвуют три матрицы: life — поле игры на предыдущем шаге, life.new — поле игры на текущем шаге и life.neighbors — матрица соседей (точка в «Эре» не имеет специального значения). Как видите матрица сравнивается с числом, как будто она скаляр, результат этой операции тоже матрица, но из булевых значений, в каждой клетке — результат операции. Такую матрицу можно использовать как индекс, в результате чего вернутся только те ячейки, по адресам которых в булевой матрице было TRUE.
Дальше просто, поскольку ячейки возвращаются по ссылке, им скопом присваивается требуемое значение.
Погодный плагин для «Sublime Text» ★
Написал свой первый плагин для «Саблайма» — для отображения в строке состояния погоды и пробок «Яндекса». Заодно немного повспоминал «Пайтон», давно на нём ничего не писал.
Удивительно, но факт — другого работоспособного плагина на эту тему не обнаружилось. Единственный конкурент использует старое АПИ «Яху», которое уже не работает, потому не работает и плагин.
Отдельное спасибо «Яндексу» за то, что их АПИ умеет определять текущее местоположение — ничего задавать в конфиге не надо, удобно.
Поскольку в строке состояния можно выводить только буквы, воспользовался Юникодом для вывода погодных значков, для уровня пробок не нашлось ничего лучше фруктов, так что индикатором загруженности дорог у меня служат зелёное яблоко, жёлтый лимон и красный помидор. Не знаю будут ли видны эти символы пользователям Линукса или Виндоуза, мне негде посмотреть.
Пришлось повозиться с АПИ самого «Саблайма».
В настройках есть шаблон вывода, можно убрать пробки или погоду, если они не нужны.
Подал пул реквест на включение в саблаймовский пакетный менеджер, но особо упорствовать не буду, если откажут.
➿ Зарождение fashion'а на латиницу с русским окончанием ★
Всегда было интересно насколько давнее изобретение — склонение слов, написанных латиницей, при помощи присобачивания к ним окончаний через апостроф. Я
Ан нет, Яков Карлович Грот на странице 71 своей книги «Русское правописание» отмечает, что в в 1830 годах «Библиотеке для чтения» некто Сенковский подал этот дурной и невероятно заразительный пример. То есть этому способу уже почти два века.
🎬 Здравствуй, трёхмерное кино ★
…Перед небольшим полупрозрачным экраном — всего четыре кресла. Вот и весь «зрительный зал» первого в мире голографического кино. Да и фильм невелик: на экране — вернее, в рамке экрана, но совершенно отдельно от его плоскости! — появляется девушка и складывает цветы, доставая их
Недолго длился и первый фильм братьев Люмьер, основателей кинематографа. Но несомненно, этот голографический «ролик» займёт в истории кино почётное место. Голографическое кино родилось в Москве, во Всесоюзном
Даже создатель отечественной голографии Юрий Денисюк, удостоенный за своё открытие Ленинской премии и избрания в Академию наук, выражал сомнение в возможности скорого применения голографии для кино.
За решение проблемы взялись видные учёные многих стран. Успех пришёл к группе московских специалистов, которыми руководил профессор В. Комар. Высоко оценили работу учёных участники конгресса Международного союза технических кинематографических ассоциаций, которым довелось стать первыми зрителями фильма.
Исследования продолжаются, а московские учёные разрабатывают проект первого голографического цветного кинотеатра на 200—400 мест. Мы ещё будем зрителями необыкновенного кинематографа.
Это была цитата из книги «Москва», издательство «Советская Россия», 1981 год. Виктор Григорьевич умер два года назад, а голографическое кино в кинотеатрах мы так и не увидели — только стереографическое (которое принято называть
С создания первого голографического фильма прошло почти 40 лет — премьерный показ состоялся 7 октября 1976 года. На экране первая в мире актриса голографического кино, Мария
🎱 Сложности при написании «99 бутылок» на «Электронике МК-61»
★
Как и обещал в прошлый раз, хочу рассказать с какими сложностями мне пришлось столкнуться при написании «Песни о пиве» на программируемый калькулятор «Электроника
Калькулятор попал ко мне для передачи в компьютерный музей, который готовится к открытию в высшей школе «ИТИС» и у меня
В процессе изучения я наткнулся на заинтриговавшую меня вещь. В некоторых операциях калькулятор переключался в режим шестнадцатеричного счисления, о чём сигнализировала восьмёрка и точка в первом разряде.
Как видно по таблице выше, отображение этих чисел сильно отличается от общепринятого (как правило для цифр больше девятки используются латинские буквы от A до F) и я не мог не отметить, что с их помощью легко написать английское «beer» («пиво»).
Тем более мне очень повезло в том, что индикацией этого режима является именно восьмёрка, стоящая спереди — так похожая на первую букву в нужном мне слове. Как вы теперь понимаете, на экране в моей программе написано не «BEEr», с точки зрения калькулятора там одни числа и индикатор режима — «8.EEГ» или «EED» в привычной записи (десятичное «3821»).
Так же я воспользовался тем, что «F» в этой странной нотации — пробел, что позволило мне отделить число от «надписи». Дальнейшее — дело техники.
Листинг из предыдущего поста начинается с подготовки данных в регистрах — нескольких масок на которые битовыми операциями в дальнейшем наложатся числа так, чтобы получилась нужная мне «строка». Настоящая программа начинается с нажатий на «В/О» и «ПРГ», и активно пользуется подготовленными данными.
Маски и оставшиеся числа побитно накладываются двумя подпрограммами — по отдельности на диапазоны
Для примера кусочек подпрограммы, номер слева соответствует номеру инструкции при вводе в калькулятор и каждую строку я прокомментирую, но следует понимать, что в реальности эти комментарии частью программы не являются:
// когда что-то попадает в «X» предыдущее значение смещается в «Y» (там стек из 4 позиций)
45 1 // «1» кладётся в регистр «X», входной параметр сместился в «Y»
46 + // Y + 1, передаётся в «X», это коррекция данных после операций, которые шли выше
47 К П→Х 7 // в «X» помещается число из регистра (маска), указанного в регистре №7
48 + // Y+X → X
49 ИНВ // инвертирование битов в «X», сейчас на экране написано «8.EEГ» плюс некий пока мусорный символ
50 К П→Х 8 // в «X» помещается число из регистра, указанного в регистре №8
51 ^ // операция «И», на экране — «8.EEГ», из некого символа получилось требуемое число
52 В/О // возврат из подпрограммыДесятки и единицы выбираются адресами масок, которые я передаю при помощи косвенной адресации, хорошо, что такое вообще есть в языке — это позволяет эффективно пользоваться подпрограммами.
Подпрограмма вызывается два раза с разными параметрами — для десятков и единиц, получаются две маски, которые позднее накладываются друг на друга.
Сильно расстраивает отсутствие памяти для долговременного хранения, в устройстве хоть и есть батарейный отсек, но при любом сбое питания (батарейки сели, а блок питания не подключен), память калькулятор сбрасывается и программу придётся набрать заново. То же ожидает и в случае, если одну программу нужно будет заменить другой — хотя программы можно запускать с произвольного адреса, много их в память не уместится — её ёмкость всего 105 инструкций.
Оглядываясь на шахматы на sed (SedChess) ★
Это информационный пост, больше для себя. Для того, чтобы не забыть выводы и ощущения от сделанного.
Несколько месяцев назад я написал шахматы на утилите «сед», ненадолго заинтересовав публику. Особенно доставляли комментарии на «Реддите» — кажется, я поддержал имидж русских программистов, как людей для которых нет ничего невозможного.
Пара комментариев оттуда:


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

Ещё один плюс — мне много пришлось поупражняться в борьбе с собственной ленью и желанием бросить проект, когда я встречался с трудностями, которые казались непреодолимыми или заставляли переделывать половину проекта.
Конечно, мной двигали вовсе не рациональные побуждения, а желание сделать
Тяга делать
Удаляем раскладку «США» («U.S. English») из Mac OS X 10.9 («Maverick») ★
Как стало известно ещё на этапе появления ранних сборок «Маверика», раскладка «США» не удаляется из неё способом, который описал Артём Поликарпов (а я написал скрипт, автоматизирующий этот процесс).
Зато читатели в комментариях к скрипту указали на другой, очень несложный способ сделать то же.
Напомню в чём проблема. Лично я использую для работе на «Маке» раскладку Бирмана.
После установки раскладки Бирмана, раскладок становится три: русская Бирмана, английская Бирмана и системная — «США». Последняя явно лишняя, но система удалить её не позволяет. Её удаётся удалить только в обмен на установку любой другой системной раскладки.
Но есть баг, спасибо ему, что он существует.
Нужно поставить японскую раскладку «котоэри», потому удалить раскладку «США», потом «котоэри». В системе останутся только две раскладки Бирмана.
JavaScript, совмещённый с Brainf*ck: «hello friends» ★
Помните моё поздравление с Новым годом, написанное на запутанном Джаваскрипте? Такой же принцип я использовал для привлекающего внимание баннера нашей компании.
Я давно уже заметил, что это сильно похоже на язык Брейнфак. Давно хотелось попробовать смешать эти два языка в одном листинге. Со стороны Брейнфака всё довольно гладко — надо только балансировать квадратные скобки (но Джаваскрипт требует того же) и избегать вечных циклов (тут уже сложнее, так как листинги на запутанном Джаваскрипте часто требуют пустых циклов), незнакомые символы этот язык пропускает. В Джаваскрипте синтаксис построже, там нужно было помучаться больше.
Получилась следующая программа (используется расцветка для Брейнфака, чтобы было видно какие части программы он пропускает):
($=!{}[/-/+/\+@+@+!+/)-!{$:/>/+/!>/+/</}+
(_=!-{}-$+/>/)-~(/</)+
(_$=-$-{}-$+/>/)[$$=-(~-~$+~-~$-!+{$:/!</})+
_[$$+=~-~{$:/]/}+
_$-~{}+
_$[$$+~{_:-$>/]/}+
$-$$]
Оба интерпретатора выполняют её с разным результатом, Брейнфак выводит «hello», а Джаваскрипт — «friends»:
bolk@Bolk ~$ ./brainfuck <<<'($=!{}+[/-/]+/\+@+@+!+/)[-!{$:/>/+/!+>/+/<</}]+(_=!-{}+[-$]+/>/)[-~(/>[->+>+<<]>>[-<+<+>>]<<</)]+(_$=[-$][-{}]+[-$]+/>>/)
[$$=-(~-~$+~-~$-!+{$:/!+>+>+>+>+>+<<<<</})]+_[$$+=~-~{$:/[->++++>+>++++++++>++++++++>+++++++++++[<]]/}]+_$[-~{}]+_$[$$+~{_:-$>/[.>]/}]+$[-+-$$]'
hello
bolk@Bolk ~$ v8 -e 'print(($=!{}+[/-/]+/+@+@+!+/)[-!{$:/>/+/!+>/+/<</}]+(_=!-{}+[-$]+/>/)[-~(/>[->+>+<<]>>[-<+<+>>]<<</)]+(_$=[-$][-{}]+[-$]+/>>/)
[$$=-(~-~$+~-~$-!+{$:/!+>+>+>+>+>+<<<<</})]+_[$$+=~-~{$:/[->++++>+>++++++++>++++++++>+++++++++++[<]]/}]+_$[-~{}]+_$[$$+~{_:-$>/[.>]/}]+$[-+-$$])'
friendsПовозиться пришлось прилично, если честно, некоторые конструкции ДжЭс делит с Брейфаком (большинство квадратных скобок),
Слово «friends» я выбрал потому что его легко записать:
"false"[0]+"true"[1]+"undefined"[5]+"true"[3]+"undefined"[1]+"undefined"[2]+"false"[3]Принцип я
Первый язык программирования высокого уровня — Планкалкюль ★
Планкалкюль (Plankalkül) — первый в мире язык программирования высокого уровня, разработанный немецким инженером Конрадом Цузе между 1942 и 1946 годами для его компьютера «Z4».
Шла Вторая Мировая Война, Цузе работал в отрыве от учёных других стран, совершенно самостоятельно. За это время он создал не только язык программирования, но и написал на нём 49 страниц программ для оценки шахматных позиций. Полностью его работа была опубликована много позже, в 1972.
Только в 1957 году (работы были начаты в 1954) появился Фортран — язык, который большинство считает первым языком высокого уровня.
«Z4» был
Диалект, который реализуется, назван
Язык довольно богатый, на мой взгляд, для сороковых
Все переменные делятся на четыре вида.
- Variablen (Входные переменные) — это входные переменные подпрограмм, доступны только для чтения начинаются с буквы V и номера;
- Zwischenwert (Значения промежуточные), доступны для чтения и записи, предназначены для хранения промежуточных вычисляемых значения, начинаются с Z и номера;
- Resultatwerte (Результат) — в этих переменных возвращается результат вычисления, начинаются с R и номера;
- Indizes (Индексы) — переменные цикла (аналога for), начинаются с i, дальше может быть номер, номер необходим для организации вложенных циклов.
Доступны три типа переменных. Несмотря на то, что «Z4» умел оперировать числами с плавающей точкой, интерпретатор этого не умеет.
Для целого неотрицательного указывается размерность в битах. Есть две формы записи 0 — один бит, n.0 — «n» бит, например, 8.0 — один байт (8 бит). Кортеж указывается в скобках, например (3.0, 4.0) — это две переменные в три и четыре бита, кортеж должен иметь более одного элемента. Массив записывается через точку, к примеру: 4.5.0 — массив из четырёх элементов по пять бит в каждом, 32.(0, 8.0, 16.0) — 32 кортежа, в каждом из которых три переменных: один бит, восемь и шестнадцать.
«Планкалкюль» явно можно сильно упростить по синтаксису, но современный диалект почти в точности копирует ту запись, которую использовал Цузе, я полагаю, что такой синтаксис родился
Одна из них вычисляет указанное (по порядку) число Фибоначчи:
P0 FactEvgenyStepanischev (V0[:4.0]) => (R0[:10.0])
(0, 1) => (Z0[:10.0], Z1[:10.0])
W1 (V0[:4.0]) [
i > 0 -> (Z0[:10.0] + Z1[:10.0], Z1[:10.0] - Z0[:10.0]) => (Z1[:10.0], Z0[:10.0])
]
Z1[:10.0] => R0[:10.0]
ENDЗапускать следует так: открываете страницу с интерпретатором, копируете в окно мою программу, нажимаете «Compile», открывается отдельное окно
Подпрограммы в языке начинаются с символа P и уникального номера, дальше идёт имя, по которому её можно будет вызвать, у меня подпрограмма называется FactEvgenyStepanischev, заканчивается подпрограмма ключевым словом END (в оригинальном Планкалкюле его не было).
У подпрограммы описываются принимаемые и возвращаемые значения, у меня используется одна переменная на вход, размерностью 4 бита и одна на выход, размерность в 10. Первой строкой присваиваются значения «ноль» и «один» промежуточным переменным Z0 и Z1. Тип переменных приходится указывать при каждом их использовании, преобразовать переменную в другой тип нельзя.
Ниже идёт цикл for (W1), поскольку номер переменной цикла я не указал (указывается в первых квадратных скобках, которые тут опущены), используется переменная цикла i, без номера. В круглых скобках указывается количество повторений, а в последующих квадратных — тело цикла. Подробности можно найти в описании.
Операция «стрелка» (->) — условная конструкция, часть справа будет выполнена, если выражение слева истинно. В диалекте работают только самые простые выражения, например цикл туда подставить можно, но кнопка «Run» в аплете у меня не появилась, поэтому я ограничился присваиванием внутри цикла.
Я тут использовал комплексное присваивание, которое хорошо знакомо тем, кто использует Перл, Пайтон или ПХП, но работает оно иначе — присваивания выполняются последовательно, слева направо, поэтому я не могу ограничиться,
(Z0[:10.0] + Z1[:10.0], Z1[:10.0]) => (Z1[:10.0], Z0[:10.0])результат будет не тот, который ожидается.
В конце я присваиваю промежуточное значение результирующему значению подпрограммы.
Кроме этого в языке почти ничего и нет. Обращение к элементам массива, вызов функции и цикл while описывать отдельно смысла не имеет, они выглядят достаточно естественно в рамках этого синтаксиса. Все операции, поддерживаемые языком (их немного — логические операции, битовые операции и четыре арифметические действия) выглядят привычно.
Интерактивная игра на bash: «Арканоид» ★
После шахмат, где я решал проблему опроса клавиатуры, мне захотелось попробовать сделать
Забегая вперёд, скажу, что проблему решить вполне удалось. Я разделил игру на два процесса, один из которых опрашивает клавиатуру и сообщает о нажатии второму при помощи сигналов — USR1, USR2 и HUP, как раз три сигнала по трём управляющим клавишам — „←“, „→“ и «пробел». Последняя нужна, чтобы пускать шарик.
Решил сделать «Арканоид», не совсем классическую версию (на неё мне ещё бы пара вечеров потребовалась), но близкую. В игре есть три типа блоков разных цветов — вишнёвый разбивается сразу, синий при первом ударе превращается в вишнёвый, а от зелёного (самое интересное!) при ударе иногда отваливается часть, поймав которую, можно получить приятный бонус — более широкую ракетку, дополнительную жизнь или липкость. Последнее означает, что шарик в этом режиме не отскакивает от ракетки, а прилипает.

Ещё одна фишка игры — звуковое оформление, которое нечасто услышишь в консоли, я думаю. Правда, только для «Мака» (сделано командой «say», я заставляю её проговаривать буквы с большой скоростью), знаю, что для Линукса тоже есть команды для синтезатора речи («espeak», например), но мне негде их попробовать.
В игре пять жизней и пять уровней, кстати второй посвящён моей любимой жене, большой любительнице кошек (этот уровень как раз на скриншоте). Я сделал щадящую скорость полёта шарика, так что игру можно пройти даже без потерь, если хорошо потренироваться. Код, как водится, выложен на «Гитхаб».
От терминала, как и в шахматах, требуется уметь отображать 256 цветов и хорошая поддержка «Юникода». Нигде, кроме как под «Мак» игру я не тестировал,
Я записал небольшое видео игрового процесса. Я попробовал две программы для записи видео с экрана — «Скрини» и «КвикТайм», к сожалению обе нагружают процессор так, что игра начинает тормозить.
Видео выложил на «Яндекс.Видео». Добавлено позднее: сервис «Яндекс.Видео» прекратил своё существование.
Сетевая игра на bash: шахматы ★
Я давно хотел написать
Поскольку тонкости управления с клавиатурой съели очень много моего времени, я не стал заморачиваться с тонкостями совместимости, поэтому игра тестировалась только под Mac OS X, есть ненулевая вероятность, что она заработает и под Linux и уж точно её можно допилить там до рабочего состояния.
Для работы игра требует наличия nc (aka Netcat) и терминала с поддержкой 256 цветов (под Mac OS рекомендую iTerm2). При наличие интереса к игре, допилю до терминала на 16 цветов и /dev/tcp. Кстати начал выкладывать все свои
Эта игра запускается посложнее, так как сетевая, у неё два параметра, о которых она расскажет, если её запустить без них. Первый — адрес машины противника, второй — порт. Порт выбирается одинаковым на обеих машинах. Игру можно запустить и на одной машине, в двух консолях (на скриншоте как раз такой случай).
Играть просто — в каждый момент времени активна только одна доска (на скриншоте — правая, у неё буквы и цифры вокруг доски ярче), на активной доске курсор двигается курсорными клавишами — ←, →, ↑ и ↓, взять фигуру и поставить её на доску — по клавише пробела или Enter. Как только вы поставили фигуру на доску, ход переходит к сопернику. «Съесть» фигуру соперника проще простого — достаточно поставить свою фигуру на чужую. В игре есть защита — нельзя «съесть» свою фигуру.
Ничего помимо этого в игре нет — не производится правильность контроля ходов, нет проверки на завершение игры, можно даже ходить фигурами соперника. Было очень сложно придумать как обрабатывать нажатия в shell, так что остальное сделать я просто не успел, не поместилось в формат «игрушка за вечер».
#!/bin/bash
# Network chess by Evgeny Stepanischev //bolknote.ru 2011
if [ $# -ne 2 ]; then
echo Usage: $0 host-of-opponent port
exit
fi
# Хост оппонента
HOST="$1"
# Общий порт
PORT="$2"
# Клавиатурные комбинации извстной длины
SEQLEN=(1b5b4. [2-7]. [cd]... [89ab].{5} f.{7})
# Фигуры
WHITE=(♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖)
BLACK=(♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜ ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟)
# Наш ход?
OURMOVE=
# Я чёрный или белый?
MYCOLOR=
# Доска
declare -a XY
# Курсор
CX=1 CY=7
TAKEN=
# Необходимые нам клавиатурные коды
KUP=1b5b41
KDOWN=1b5b42
KLEFT=1b5b44
KRIGHT=1b5b43
KSPACE=20
# Восстановление экрана
function Restore {
echo -ne "\033[5B\033[5B\033[?25h\033[m"
stty "$ORIG" 2>/dev/null
(bind '"\r":accept-line' 2>/dev/null)
}
trap Restore EXIT
# Выключаем Enter
(bind -r '\r' 2>/dev/null)
# Выключаем остальную клавиатуру
ORIG=`stty -g`
stty -echo
# Убирам курсор
echo -e "\033[?25l"
# Отдаём события клавиатуры в сеть
function ToNet {
echo $1 | nc "$HOST" "$PORT"
}
# Реакция на клавиши курсора
function React {
case $1 in
$KLEFT)
if [ $CX -gt 1 ]; then
CX=$(($CX-1))
PrintBoard
fi
;;
$KRIGHT)
if [ $CX -lt 8 ]; then
CX=$(($CX+1))
PrintBoard
fi
;;
$KUP)
if [ $CY -gt 1 ]; then
CY=$(($CY-1))
PrintBoard
fi
;;
$KDOWN)
if [ $CY -lt 8 ]; then
CY=$(($CY+1))
PrintBoard
fi
esac
# Отдаём события клавиатуры в сеть
[ "$OURMOVE" ] && ToNet $1
}
# Проверка совпадения с известной клавиатурной комбинацией
function CheckCons {
local i
for i in ${SEQLEN[@]}; do
if [[ $1 =~ ^$i ]]; then
return 0
fi
done
return 1
}
# Функция реакции на клавиатуру, вызывает React на каждую нажатую клавишу,
# кроме KSPACE — на неё возвращается управление
function PressEvents {
local real code action
# Цикл обработки клавиш, здесь считываются коды клавиш,
# по паузам между нажатиями собираются комбинации и известные
# обрабатываются сразу
while true; do
# измеряем время выполнения команды read и смотрим код нажатой клавиши
# akw NR==1||NR==4 забирает только строку №1 (там время real) и №4 (код клавиши)
eval $( (time -p read -r -s -n1 ch; printf 'code %d\n' "'$ch") 2>&1 |
awk 'NR==1||NR==4 {print $1 "=" $2}' | tr '\r\n' ' ')
# read возвращает пусто для Enter и пробела, присваиваем им код 20,
# а так же возвращаются отрицательные коды для UTF8
if [ "$code" = 0 ]; then
code=20
else
[ $code -lt 0 ] && code=$((256+$code))
code=$(printf '%02x' $code)
fi
if [ $code = $KSPACE ]; then
[ "$OURMOVE" ] && ToNet $KSPACE
SpaceEvent && return
continue
fi
# Если клавиши идут подряд (задержки по времени нет)
if [ $real = 0.00 ]; then
seq="$seq$code"
if CheckCons $seq; then
React $seq
seq=
fi
# Клавиши идут с задержкой (пользователь не может печатать с нулевой задержкой),
# значит последовательность собрана, надо начинать новую
else
[ "$seq" ] && React $seq
seq=$code
# возможно последовательность состоит из одного символа
if CheckCons $seq; then
React $seq
seq=
fi
fi
done
}
# Проверяем чёрная или белая фигура
function CheckColor {
echo -n ${1:0:1}
}
# Первичное заполнение доски
function FillBoard {
local x y ch
for y in {1..8}; do
for x in {1..8}; do
ch='S '
if [ $y -le 2 ]; then
ch=B${BLACK[$x+8*$y-9]}
else
if [ $y -ge 7 ]; then
ch=W${WHITE[$x+8*$y-57]}
fi
fi
XY[$x+100*$y]=$ch
done
done
}
# Вывод букв по краю доски
function PrintBoardLetters {
local letters=abcdefgh
[ -z "$OURMOVE" ] && echo -ne "\033[30m" || echo -ne "\033[0m"
echo -n ' '
for x in {0..7}; do
echo -n "${letters:$x:1} "
done
echo
}
# Вывод цифры по краю доски
function PrintBoardDigit {
[ -z "$OURMOVE" ] && echo -ne "\033[30m"
echo -en " $((9-$1))\033[0m "
}
# Вывод доски
function PrintBoard {
local x y c ch
local colors=('48;5;209;37;1' '48;5;94;37;1')
PrintBoardLetters
for y in {1..8}; do
PrintBoardDigit $y
for x in {1..8}; do
c=${colors[($x+$y) & 1]}
ch=${XY[$x+100*$y]}
if [[ $CX == $x && $CY == $y ]]; then
c="$c;7"
[ "$TAKEN" ] && ch=$TAKEN
[ $MYCOLOR == B ] && c="$c;38;5;16"
fi
[[ $(CheckColor "$ch") == "B" ]] && c="$c;38;5;16"
echo -en "\033[${c}m${ch:1:1} \033[m"
done
PrintBoardDigit $y
echo
done
PrintBoardLetters
echo -e "\033[11A"
}
# Приём событий
function NetListen {
nc -l $PORT
}
# Готовы слушать события сети
function NetEvents {
local code
while true; do
code=$(NetListen)
[[ "$code" == "$KSPACE" ]] && SpaceEvent && return
React $code
done
}
# Реакция на нажатие Space и Enter — взять или положить фигуру
function SpaceEvent {
local xy
# Проверяем, есть ли фигура под курсором
let xy="$CX+$CY*100"
# Фигуры нет
if [ "${XY[$xy]:-S }" = "S " ]; then
if [ -z "$TAKEN" ]; then
echo -en "\007"
else
# Положили фигуру
XY[$xy]=$TAKEN
TAKEN=
return 0
fi
# Фигура есть
else
# Мы не должны позволять «съесть» свою фигуру
if [[ $(CheckColor "$TAKEN") == $(CheckColor "${XY[$xy]}") ]]; then
echo -en "\007"
else
# Фигура есть «в руке», мы «съедаем» противника
if [ "$TAKEN" ]; then
XY[$xy]=$TAKEN
TAKEN=
return 0
else
# «В руке» ничего не было, мы взяли фигуру
TAKEN=${XY[$xy]}
XY[$xy]="S "
fi
fi
fi
return 1
}
# Очистка клавиатурного буфера
function ClearKeyboardBuffer {
# Быстро — через zsh
which zsh &>/dev/null && zsh -c 'while {} {read -rstk1 || break}' && return
# Медленно — через bash
local delta
while true; do
delta=`(time -p read -rs -n1 -t1) 2>&1 | awk 'NR==1{print $2}'`
[[ "$delta" == "0.00" ]] || break
done
}
FillBoard
# Кто будет ходить первым
ToNet HI
[[ "$(NetListen)" == "HI" ]] && OURMOVE=1
sleep 0.2
ToNet ULOOSE
[ "$OURMOVE" ] && MYCOLOR=W || MYCOLOR=B
PrintBoard
# Основной цикл — обрабатываем события из сети или с клавиатуры
while true; do
if [ -n "$OURMOVE" ]; then
ClearKeyboardBuffer
PressEvents
OURMOVE=
else
NetEvents
OURMOVE=1
fi
PrintBoard
done
TrueColor GIF ★

Была у меня такая задумка — попробовать сделать полноцветную
Разбиение для начала выбрал простое — исходя из площади покрытия, думал потом взяться за оптимизацию (выбирать площадь, потом брать все цвета, которые в ней содержатся), но этого не понадобилось, оказалось, что если поставить задержку между кадрами ноль, то каждый браузер всё равно будет отрисовывать анимацию с очень заметной на глаз задержкой. Кажется в спецификации вообще не определено что означает нулевая задержка:
Delay Time — If not 0, this field specifies the number of hundredths (1/100) of a second to wait before continuing with the processing of the Data Stream. The clock starts ticking immediately after the graphic is rendered. This field may be used in conjunction with the User Input Flag field.
Но и если поставить задержку в 1/100 секунды, браузеры всё так же неторопливо отрисовывают картинку. Нарезанные кадры я собирал через утилиту gifsicle, она ещё и оптимизирует изображение — ненужные мне области я заливал прозрачным цветом, gifsicle умеет такие области отбрасывать, что уменьшает размер изображения:
gifsicle --delay 0 --crop-transparency -O3 out/*.gif > out.gifЖаль, что ничего не получилось.
Зато выяснились любопытные подробности. Не знаю как это выглядит в IE (негде попробовать), а вот FireFox и Chrome умеют, один раз отрисовав конечную анимацию, потом мгновенно доставать её из кеша на перезагрузке страницы. «Опера», как и следовало ожидать, постоянно перерисовает анимацию — стоит только вернуться на страницу с другого таба или прокрутить её обратно до анимированного изображения.
data URL в IE ★
Пару лет назад я занимался проблемой data URL в Internet Explorer, добился определённых результатов, но то, что получилось, использовать было невозможно. Data URL (иногда его ещё называют «протокол data:») — возможность вставлять ресурсы (графику, CSS, JavaScript и так далее) в HTML код.
Выглядит это примерно так:
<img
src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
hhx4dbgYKAAA7" />В Data URL указывает тип содержимого и способ его кодирования. Способа кодирования два — base64 (именно он и указан в примере), увеличивающий содержимое на треть и URL encoding (в этом случае способ кодирования не указывается) — привычный многим способ кодирования при помощи %xx, в лучшем случае вообще не увеличивает размер содержимого, в худшем — увеличивает в три раза.
Кстати, в настоящее время IE8b1 поддерживает data URL, но, увы, длиной не более 32Кб.
Теперь амбула.
Вчера ночью мне пришла в голову идея как можно попытаться корректно совместить data URL и включение картинок через протокол mhtml. То, что у меня не получилось два года назад, получилось сейчас.
Результат — готовый код на PHP из двух функций. Первую функцию («bolk_data_uri_header») нужно вызвать в самом начале перед выводом любого вашего кода, вторую («bolk_data_uri») собственно для включения картинки в код. Надеюсь на примерах всё понятно:
bolk_data_uri_header();
bolk_data_uri('myjpeg.jpg');
bolk_data_uri('ourpng.png', 'border: 2px dotted red');Код самой библиотеки:
function bolk_data_uri_header()
{
echo "<!--\n"
."Content-Type: multipart/related; boundary=\"=_NextPart_01C6A9B1.539AB070\"\n\n"
."--=_NextPart_01C6A9B1.539AB070\n"
."Content-Transfer-Encoding: base64\n"
."Content-Type: text/html\n"
."-->\n\n";
}
function bolk_data_uri($file, $style = '')
{
if (!( file_exists($file) && ($data = @getimagesize($file)) )) return false;
$name = uniqid('', true);
if ($style <> '') $style = ' style="'.htmlspecialchars($style).'"';
echo "<!--\n"
."--=_NextPart_01C6A9B1.539AB070\n"
."Content-Location: {$name}\n"
."Content-Transfer-Encoding: base64\n"
."Content-Type: {$data['mime']}; -->\n"
."<object data='data:{$data['mime']};base64,\n\n";
echo base64_encode(file_get_contents($file));
echo "' {$data[3]}{$style} type='\n{$data['mime']}'><img "
."src='mhtml:http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}!{$name}' {$data[3]}{$style} /></object>\n\n"
."<!--\n"
."--=_NextPart_01C6A9B1.539AB070-->";
return true;
}У данного метода, по сравнению с обычными data URL есть масса ограничений: необходим специальный заголовок в начале файла, т. е. этот метод невозможно использовать на чужих сайтах, этим методом нельзя воспользоваться (по крайней мере не в таком виде) для включения ресурсов внутрь CSS или JavaScript. В принципе, тут есть достаточно большое поле для экспериментов, возможно все или некоторые из проблем можно решить.
В разделе «храню» есть пример, который можно потестировать на имеющихся у вас браузерах. Уже протестировано на Opera 9.25 и 9.50b, FF 2.0.0.13 и 4 (Minefield), Safari 3.1 (Safari под iPhone — тоже), Internet Explorer 6.0SP2 и 7.0, Sony PSP browser, Opera mini, Netscape Navigator 9.0.0.5.