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

Избранное

Позднее Ctrl + ↑

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 комментария    491   11 мес  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 1 комментарий    540   1 год   гаджет

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

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

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

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

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

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

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

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

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

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

 5 комментариев    582   1 год   дочка

Бум!

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

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

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

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

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

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

 9 комментариев    460   1 год  

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»

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

Новости майнинга

Ферма по майнингу какой-то «крипты» на «айсиках»

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

На очередном перекуре один из бывших одногруппников — А. А. упомянул, что занимается ремонтом майнинговых ферм на «айсиках» (специализированных процессорах для «майнинга»). «Майнингом» сейчас называют задачу по вычислению «криптовалюты» — своеобразных электронных денег.

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

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

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

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

 Нет комментариев    246   2019  

PythonFuck

Давайте вспомним, что у меня блог ещё и про программирование.

Есть такое развлечение — не используя алфовитно-цифровые символы, писать осмысленные программы на разных языках программирования. Для конкретного языка это называется «имя языка»+«Fuck». Меня это занятие не то чтобы захватило, но иногда интересно поразмяться и попробовать себя в этой забаве.

Для некоторых языков такого ещё никто не делал, приходится изобретать собственные приёмы, в конечном счете это интереснее всего. Я уже делал PHPFuck, BashFuck (и даже не один раз) и совмещал JavaScriptFuck с языком программирования Brainfuck.

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

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

_=(''<())+(''<());__=_**_**_
___='%'+('%'+`'±'`[_])%(__-_-_)

___*(_*_*_-_)%((
(__+_)*_*_,
`{_}`[_/_],
)+(`(''<'')`[_],)*_+\
(
__*_*_*_-__-_/_,
__*_+_/_,
))

Это запускается и работает (выводит строку «Hello!»), но только из командной строки и только во второй версии Пайтона. Когда напишу небольшой разбор кода, станет понятным почему.

Кара-бараз

Мойдодыр в книжке Корнея Чуковского «Мойдодыр. Кинематограф для детей», М.-Л., «Радуга», 1924 год

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

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

Умывальник в женской спальне в доме-музее Арбузова (к сожалению снимка бо́льшего размера у меня нет)

Меня же больше интересовало что такое «Кара-барас»:

Он ударил в медный таз
И вскричал: «Кара-барас!»
И сейчас же щётки, щётки
Затрещали, как трещотки,
И давай меня тереть,
Приговаривать…

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

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

Первое появление Бибигона — журнал «Мурзилка» №11, 1945 год

Разгадка нашлась в другом произведении Корнея Ивановича — «Приключениях Бибигона». Там это слово повторяется несколько раз, как… заклинание:

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

И вдруг — о чудо! — в тот же миг
Барбосом сделался старик.

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

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

 Нет комментариев    626   2019  

ДТП

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

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

Если бы не был пристёгнут, без серьёзных травм не обошлось. Берегите себя!

 5 комментариев    195   2019  
Ранее Ctrl + ↓