Rose debug info
---------------

Избранное

Позднее Ctrl + ↑

JUnix

Вкратце: выложил на гитхаб свой старый проект «эмулятора» Линукса, который я писал в 90-е и начале 2000-х

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

Мне тогда этот язык невероятно нравился, я был в бешеном восторге и такое вот несерьёзное к нему отношение меня очень задевало. Как-то я фантазировал на тему того, что можно было бы такого интересного сделать в браузере, чтобы показать значимость ДжаваСкрипта, и как-то мало-помалу в голову пришла идея запрограммировать эмулятор «Линукса» — я как раз активно изучал эту ОС в те годы.

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

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

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

Реализованы кое-какие горячие клавиши, работа с историей и буфером обмена, основные команды (список выводится по команде «?»), перенаправление ввода-вывода, «пайп», работа с переменным, ветвления и циклы, виртуальная файловая система с возможностью написания плагинов и многое другое.

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

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

Постепенно домен, на котором это всё располагалось, потерялся, а потом со старым винтом умер и бакап сайта. Осталась только копия в «Веб-архиве».

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

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

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

Кстати, если вам нравится в таком копаться, можете посмотреть сколько костылей в то время приходилось городить и как беден был раньше этот ДжаваСкрипт.

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

Репозиторий проекта: https://github.com/bolknote/junix.
Сайт проекта, где можно посмотреть всё в действии: https://bolknote.github.io/junix.

День Радио

Сегодня, 7 мая в России отмечают День радио — в этот день, 125 лет назад российский физик Александр Степанович Попов на заседании Русского физико-химического общества продемонстрировал «прибор, предназначенный для показывания быстрых колебаний в атмосферном электричестве».

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

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

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

В итоге, для этого я выбрал «Морской бой». В моём варианте игрок вводит информацию клавишей левого «Шифта», а компьютер отвечает, мигая светодиодом кнопки «Капс Лок». Чуть более подробные правила есть в репозитории проекта.

Обёртка и некоторые функции (мигание светодиодом, опрос «Шифта» и функция задержки) написаны на Си, остальная часть — на языке «Лу́а» (Lua). Давно хотелось изучить этот странноватый язык поглубже, а тут ещё удалось поучиться встраивать его в Си.

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

Диграфы в Си немного запутывают и вносят в код толику безумия

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

Для тех безумцев, которые захотят попробовать скопмилировать этот вариант «Морского боя» и сыграть, ещё раз привожу репозиторий проекта (только под «МакОСь») — https://github.com/bolknote/battleship.

Детская частная жизнь

Вкратце: есть ли у вас какие-то правила — что можно выкладывать о своих детях в интернет, а что нет?

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

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

Но эти видео — история более-менее приватная, их видим мы и бабушки-дедушки.

Теперь же я задумался над тем как и что писать о дочке тут — как она отнесётся к написанному, когда вырастет и существует ли уже такое явление как травля одноклассниками/одногруппниками за выложенное родителями в интернет?

Те, чьи похождения родители выкладывали в «Инстаграмм» в самом его начале, уже учатся в третьем классе, а блоги вообще существуют более 20 лет! Их фигуранты уже могут и своих детей позорить в каком-нибудь «Тик-токе». 20 лет, вы только вдумайтесь! В те времена первобытнообщинного интернета мало кто думал — что можно писать, а что нет (и сейчас-то это не всегда понятно). Если начать копаться в заброшенных блогах девяностых, наверняка можно порушить немало чьих-то судеб.

Расскажите что вы считаете возможным выкладывать на публику о своих детях, а что у вас под запретом? Были ли конфликты с детьми на эту тему? Была ли травля сверстниками по мотивам того, что вы выкладывали? Хочу изучить чужой опыт, прежде чем вырабатывать какие-то свои правила.

«Глазелки»

Перерождённый на «Эгее» блог моего друга — «Глазелки.ру»

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

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

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

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

Рекомендую посетить обновлённые «Глазелки». Надеюсь Олег в скором времени напишет туда что-нибудь новое.

 3 комментария    546   2020   эгея

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 — моя собственная функция взятия знака, у ЭплСкрипта нет встроенной.

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

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

Полный исходный код есть на гитхабе.

Друг наш Лазарь уснул. Я иду разбудить его

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

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

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

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

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

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

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

В общем, киберпанк стал на шаг ближе.

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

Але́кса против Яндекс.Станции

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

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

«Але́кса» во всей красе — из минусов английский язык и плохая интеграция с «Сяоми»

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

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

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

«Яндекс.Станция» в миниатюрном исполнении — глуховатый Петросян

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

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

Тут за натужный юмор «Алисы» начинаешь испытывать настоящий испанский стыд. Если кто не знает, «Алиса» пытается притворяться человеком — шутит, отвечает разнообразными фразами. Наверное это ещё будет хорошо работать, но пока всё портят две вещи — огрехи синтеза голоса и выхватывание случайных фраз из фонового разговора. «Алекса» в этом случае отвечает «I’m not sure» или подобное, а «Алиса», что-то там сконструировав себе из услышанных фрагментов, попадает впросак.

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

Из плюсов — русский язык. Общаться с помощником на русском заметно проще, русские названия «Алиса», разумеется, понимает лучше «Алексы» — особенно смешно, когда мы пытались заставить «Алексу» поставить песню Ёлки (на «Дизере» она есть), а получали сборник для йоги.

За 169 рублей подписки на «Яндекс.Плюс» получаешь возможность слушать музыку и сказки, вчера вечером укладывали дочку под плейлист колыбельных, удобно.

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

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

Старость и смерть

Дочка пытается написать «Вспыш» — это персонаж из мультфильма «Чудо-машинки», с которым она себя ассоциирует

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

— Папочка, а ты немно́жечко постарел? Вот столько?

Почему-то мне стало весело, усилий стоило не рассмеяться, но отвечаю серьёзно:
— Да, совсем немножечко.

Продолжая тревожно на меня смотреть:
— А мы с тобой скоро в скелетиков превратимся?

Тут у меня как-то смех прошёл, меня самого эта тема тревожит.
— Нет, — отвечаю, — пройдёт много-много лет.
— А когда люди умирают, он потом исчезают?
— Ну… да.
— А потом снова появляются?
— Нет, доченька, не появляются.
— Почему?
— Так заведено, такие правила.

Долгая пауза. Потом хитрый вопрос с улыбкой в глазах:
— А Чеширской Кот пропадает, а потом появляется?
— Конечно!
— Ну что же, папочка, ты этого не знал, да?

Кажется ушли от темы.

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

Бум!

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

Агент Смит бьёт по Нео, а попадает по подготовленной для удара колонне

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

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

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

На помощь приходит Мэтт Каррикер — известный оружейный видеоблогер, ведущий канала «Разрушительное ранчо». На видео он проводит эксперимент — стреляет в замки́ из различного оружия, начиная с пистолета П22, заканчивая снайперской винтовкой Барретт 50-го калибра. Попробуйте угадать из какого оружия удастся так же непринуждённо открыть замок, как это делают в фильмах.

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

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

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

Расцветка синтаксиса программы редактором «СаблаймТекст 3»

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

Ранее Ctrl + ↓