Электромобили
Вообще я зарёкся писать в блог в отпуске,
Когда мы купили гибридный автомобиль, я понял, что он очень тихий — если не работает бензиновый генератор, шума от него очень мало. Тогда я задумался — насколько тихо было бы в городах, если бы в своё время победили не машины с двигателем внутреннего сгорания, а электромобили.
Мы сейчас в Китае, уже чуть больше недели живём в города Санья, на юге острова Хайнань. Тут уже несколько лет нельзя поставить на учёт автомобили с бензиновыми или дизельными двигателями, они потихоньку доживают своё век, а весь новый автопром, которого тут очень много — электрический. Ещё тут много электрических мотоциклов.
Так вот, город с электромобилями — это действительно очень тихо. Даже на загруженных улицах слышен только шорох шин, двигателей не слышно вообще. Это, конечно, не тишина пустой улицы, но всё равно заметно тише улиц в России.
Особенно хорошо, что тут нет этого натужного рёва двигателя с чихом в конце, который, насколько я понимаю,
В России, к сожалению, погодные условия не позволяют полноценно передвигаться только на электричестве, но технологии не стоят на месте, буду надеяться, что
99 бутылок: Входной язык ПЭВМ Искра-1256
Сегодня у меня рубрике «99 бутылок» язык настолько редкий, что у него даже отдельного названия нет. Иногда его называют «русскоязычным Бейсиком
В редкой профессиональной литераторе по теме его называют «входной язык…» или «символьный язык ПЭВМ
83. Входной язык ПЭВМ
Машина работала
С языком программирования пришлось разбираться по листингу сохранившихся программ, никаких следов его описания к сожалению, не обнаружилось. Впрочем, если прочитать все нашедшиеся программы, основное понять можно, сложного там ничего нет.
Строки нумеруются подряд, видимо в этом
Номер строки тут, кажется, используется только для удобства набора текста программы, переход же в языке делается не на номер строки, а на метку, причём их минимум два вида — метка для передачи управления, начинающаяся с буквы «М» (например — M01), и метка подпрограммы, которая начинается с «П» (П01).
Операторы записываются русскими буквами. Например ПЕРЕХ П01 — вызов подпрограммы, перед которой стоит метка П01. Оператор перехода часто используется с условным оператором, у которого нет
Переменные так же записываются русскими буквами, их буквенные префиксы значимы. Со всеми префиксами разобраться не удалось, но некоторые я понял: например, буквами «И» и «А» обозначаются переменные, содержащие числа. Разница, кажется, в том, что на вторые
Необычно выглядит присваивание — оно тут записывается как => и присваивает левое значение правому операнду.
Но самое странное — это функции.
Вот какая программа получилась у меня после попытки освоить этот язык. Не факт, что она написана без ошибок, но попробовать, как вы догадываетесь, негде:
1 ПЕЧАТЬ(HEX(03),,)
2 ЦИКЛ(И01,0,98)
3 И01-99=>A01
4 ПЕРЕХ П02
5 ПЕЧАТЬ(" ON THE WALL, ",,)
6 ПЕРЕХ П02
7 ПЕЧАТЬ("!",HEX(0A0D),"TAKE ONE DOWN, PASS IT AROUND,",)
8 А01-1=>А01
9 ПЕРЕХ П02
10 ПЕЧАТЬ(" ON THE WALL!",)
11 ЦИКЛ*
12 ПЕЧАТЬ("NO MORE BOTTLES OF BEER ON THE WALL,",)
13 ПЕЧАТЬ("NO MORE BOTTLES OF BEER!",)
14 ПЕЧАТЬ("GO TO THE STORE AND BUY SOME MORE,",)
15 ПЕЧАТЬ("99 ON THE WALL!",)
16 П01
17 "S"=>СА01
18 А01=1ПЕРЕХ М01
19 ""=>СА01
20 М01
21 П02
22 A01=0ПЕРЕХ М02
23 ПЕЧАТЬ(А01(2.0),,)
24 ПЕРЕХ М03
25 М02
26 ПЕЧАТЬ("NO",,)
27 М03
28 ПЕРЕХ П01
29 ПЕЧАТЬ(" BOTTLE",СА01," OF BEER",,)Разобраться в языке мне помогли следующие книги, найденные в интернете. В них нашлось
- «Комплекс вычислительный „Искра 1256“. Комплект контрольных
тест-программ. 1.320.118 Д15»; - «Процессор интерпретирующий
„Искра-1256“. Библиотека программ. 3.050.187 Д14»; - «Задачник по аналитической химии», Н. Ф. Клещев, Е. А. Алферов и другие, М., «Химия», 1993;
- Журнал «Вычислительная техника и её применение», №3, 1988.
Самым большим тёмным пятном остался оператор СЕЛЕКТ(). Без чёткого описания понять его функцию мне кажется невозможным. Всё, что я смог о нём узнать, заключено в цитате, найденной в одном из обсуждений: «там половину языка составлял оператор СЕЛЕКТ(n, параметры). В зависимости от этого n он чего только не делал».
Добавлено позднее: действительно, оператор СЕЛЕКТ() чего только не делал, например через него можно было производить смену режимов дисплея или указывать задержку.
Зумеры в 1988
Однако не только «черные» игры беспокоят сегодня преподавателей компьютерной грамотности.
Например, в Японии «наблюдается поразительная тенденция изоляции печатных изданий от молодого поколения. Покупаются в основном лишь
книги-игрушки с карикатурами и фокусами. На книги объемом более трети печатного листа уже почти не обращают внимание. Юноши стесняются, когда их видят читающими газеты».В то же время многие родители безнадежно пытаются понять своих малышей, которые «еще не могут хорошо написать пустячное поздравление, однако
по два-три часа в день невозмутимо стучат по клавишам домашних ЭВМ»
— журнал «Вычислительная техника и её применение», №3, 1988
Компьютеры портят нам детей уже четвёртое десятилетие!
Мысли о происхождении языка
Я плохо знаком с историей возникновения языка и мнением современных учёных по поводу того как это могло бы быть.
Мне кажется вполне логичным, что в начале истории люди должны были начинать общение с очень коротких, скорее всего звукоподражательных слов. При этом, как мне представляется, словарный запас, необходимый для общения вырастал стремительно — вокруг было много флоры и фауны, про которую грех не пообщаться.
Отсюда, по логике, должно вытекать следующее: все короткие слова должны быть
Не нужно быть учёным, чтобы понимать, что ни то, ни другое не правда. Я могу придумать целую кучу коротких слов, которых нет в русском и вспомнить очень много коротких слов, которые появились недавно, например — загс и вуз.
Почему же так? Наверное потому, что звукоподражательных слов наделать можно довольно мало —
Но каким же образом могли получаться слова для описания «немых» понятий? Вряд ли
Думаю, это могло происходить
Большие жирные жабы имели много мяса и были вкуснее. Это было достаточно важно, чтобы хотеть общаться на эту тему, — всем хотелось больших жаб. Поэтому большие жабы стали называться
Переход «пл» показался очень неудобным для речевого аппарата тех людей и со временем «п» произносить перестали. Конечная «х» произносилась в том языке нечётко, на выдохе, вскоре она стала совсем не слышна и «очень зелёное» стало произноситься со временем как «люлю».
К этому времени люди того племени научились красить одежду, но только
Похожим образом образовалось означающее животное слово «и» — сначала оно означало конкретное животное, издающее такой звук, потом его значение распространилось на животных вообще.
Слово «т» значило «камень», именно с таким звуком, как казалось тем людям, камень падает на землю. Когда камней было много —
Позже, сбегая от лесного пожара, племя переселилось в другое место, гор там не было, а слово
Со временем оказалось, что рядом живёт другое племя, которое
Шли века, слово слилось в «люлюти», потеряв смыслы, которое
Так появились «люди».
75 дней с «совой»
Когда я говорю, что занимаюсь английским с «Дуолиго», все
Я занимаюсь уже 75 дней. Правда, без понятия много это считается или мало — хвастаться или ещё рано? Каждый день делаю обязательные задания, плюс
Чувствую ли я изменения в моём уровне владения языком? О, да! Правда как их количественно измерить я не знаю. Качественно разница безусловно есть.
В Китае я немного пообщался на английском. Несмотря на то, что средний китаец, по крайней мере там, где мы пребывали, английский знает примерно на уровне среднего россиянина, тем не менее даже за пределами отеля у меня состоялось несколько разговоров. В отеле на русском говорят только приезжающие отельные гиды, остальные либо говорят
Самый длинный диалог с внеотельным китайцем у меня случился в супермаркете, где я покупал плавки. Он сам подошёл ко мне пообщаться:
— Oh, is it for swimming?..
— Huh? Oh, yeah, that’s right!
— Ah,
— Excuse me, do you know where the changing room is? No one here speaks English…
— Sorry… my English is not… good…
Нужные слова теперь, безусловно, выскакивают в голове гораздо быстрее и понимаю я язык, по крайней мере простые фразы, гораздо проще. Ощутимо проще. Я не дошёл ещё до такого уровня, который у меня был, когда я регулярно занимался с репетитором, но и занимаюсь я гораздо расслабленнее — с репетитором у меня были трёхчасовые уроки без единого слова на русском.
Кроме того, мне легче читать англоязычные тексты. До занятий с «Дуолинго» у меня были трудности — я понимал текст
Переводчик с китайского
Настоящая китайская загадка — где китайцы берут переводчик, которым переводят свои надписи. Больше половины надписей везде, куда ни кинь в Китае взгляд, написаны
При этом для общения там используют
Почему бы им не пользоваться так же и для перевода надписей — непонятно, ответа нет.
Задача «Шпионы и яд»
Давно хотел проверить не забыл ли я язык «Эр» («R»).
А тут — оказия, у Романа Парпалака в блоге появилась небольшая заметка о задаче «Шпионы за круглым столом»:
На банкете за круглым столом сидят n шпионов. Каждый шпион независимо от остальных случайным образом выбирает одного из двух соседей — левого или правого — и подсыпает яд ему в бокал. Каково математическое ожидание числа выживших шпионов?
Он там её решает аналитически, а я подумал, что это удобный случай запрограммировать
Написал сначала, разумеется, «в лоб» — цикл в цикле в цикле: для каждого числа шпионов цикл по количеству экспериментов, где каждый шпион в цикле решает кого он будет травить. Получилось медленно — «Эр» не очень быстрый язык.
После чего я сделал всё более параллельно — сначала готовлю матрицу выбора, где строки — эксперименты. Каждый элемент матрицы содержит выбор — будет отравлен сосед слева или справа. Следующим шагом преобразую эту матрицу в другую, которая содержит уже позиции отравляемых за столом. Дальше в строках подсчитываются уникальные значения и получается количество отравленных. Если вычесть его из количество шпионов за столом, получится количество выживших. После этого уже совсем просто подсчитать требуемое.
С матрицами получилось намного быстрее, но недостаточно. Поэтому я применил ещё и модуль parallel, который умеет раскидывать задачи по ядрам. Там используются немного другие функции, но в остальном всё работает так же.
Если
GNU bc и random()
Я не задумывался об этом раньше, но это здорово сбивает с толку, что в мире есть две различающиеся версии bc — одна является частью проекта GNU и поставляется в дистрибутивах Линукса, а вторая развивается другим коллективом авторов и входит, например, в состав МакОСи.
Я уже поучаствовал в разработке последней — предложил изменение ускоряющее некоторые операции и исправил одну ошибку, а теперь, пока был отпуске, внёс вклад и в версию проекта GNU.
Как я
Я подумал — чем чёрт не шутит? Если предложить своё исправление и в этот проект, то, может, его тоже примут? Так как открытого репозитория кода у bc проекта GNU нет, свой патч я отправил на почту мантейнеру.
Он ответил почти сразу, поблагодарил за исправление бага и написал, что сейчас же внесёт исправление в код. Так что, вероятно, следующая версия bc выйдет уже с нормально работающей функцией random()!
Анонимные функции в PHP
Относительно недавно в ПХП появился новый способ создания анонимных функций. Раньше мы писали array_filter($strs, 'strlen'), теперь можем писать array_filter($strs, strlen(...)).
В первом случае у нас указывается строка, во втором — анонимная функция. Последнее намного лучше, конечно, потому что помогает строгой типизации и лучше понимается редакторами кода.
Когда этот синтаксис появился, в моей голове он стал частным случаем стрелочного синтаксиса. В самом деле, ведь fn($t) => sin($t) и sin(...) — это одно и то же. Но недавно я понял, что у второго синтаксиса есть побочный эффект.
Если посмотреть на код ниже, всё должно стать понятно, но если нет, то я поясню.
Тут мы видим класс, конструктор которого печатает код, находящийся в строке, которая его вызвала. Ниже класса создаются две анонимные функции, одна — стрелочная через fn(), вторая — через многоточие.
Этот код позволяет проиллюстрировать разницу.
В случае создания анонимной функции через fn(), конструктор будет вызван каждый раз заново на любой вызов функции.
В случае синтаксиса с многоточием, конструктор будет вызван сразу при создании, а при вызове, в том числе многократном, он вызываться не будет.
То есть каждый способ имеет особенности, которые надо учитывать.
class Sample
{
public function __construct()
{
$bt = debug_backtrace();
['line' => $line, 'file' => $filename] = end($bt);
echo file($filename)[$line - 1];
}
public function method(): void
{
}
}
$a = fn() => (new Sample)->method(); // не выведет ничего
$b = (new Sample)->method(...); // выведется «$b = (new Sample)->method(...);»
$a(); $a(); // выведется «$a(); $a();» два раза
$b(); $b(); // не выведет ничегоДжетлаг
В черновиках у меня давно лежала заметка как я прекрасно справляюсь с джетлагом.
В самом деле, обычно мне хватало
Но после возвращения из Китая
Непонятно что такое во мне сломалось, может ли быть, что я потихоньку теряю свою «совиность»
Может быть и другое объяснение, конечно. Мы очень рано встали в день перелёта — в 4³⁰ утра, очень долго ждали посадки, потом ещё дольше летели. Может быть это просто сильная усталость от перелёта, наложившаяся на сдвиг часового пояса.
Кроссплатформенность и bc
Как мы все знаем, в мире существует две версии bc — более скромная по возможностям версия GNU, которая используется в Линуксе, и более развитая, которая, например, используется в командной строке МакОСи.
Они довольно серьёзно различаются — когда я писал игру «Виселица» на этом языке, мне пришлось сделать две версии для разных синтаксисов.
В принципе, можно писать кроссплатформенно, если использовать подмножество, которое поддерживают обе версии, но есть одна неприятность — функция получения случайного числа
Поскольку в языке нет способа узнать определена функция или нет, нужно
Каким же образом мы можем это сделать?
Вначале я возлагал надежду на переменную seed. В GNU её нету, то есть она содержит ноль, а в продвинутой версии она содержит инициализирующее значение. Как будто этого вполне достаточно, но,
Такую особенность я нашёл — она заключается в приоритете обработки операции отрицания, которая записывается как восклицательный знак.
Основываясь на этом, мы можем написать универсальную функцию для получения случайного числа:
define rnd() {
/* Checking the bc version */
if (!1+1) {
return rand()
} else {
return random() * random()
}
}P. S. Надо помнить, что
P. P. S. Я умножаю random() на random(), чтобы хоть немного выровнять по диапазону значений rand() и random(), правда распределение, конечно, изменится.
С днём старого программиста!
Сегодня, оказывается старый день программиста или, как его ещё называют в шутку, «день старого программиста». 22 апреля совпадало
Я, хоть и не учился на эту специальность, программировать начал ещё в советские годы, до распада Союза. Правда моя первая программа, которая принесла мне деньги, скорее всего была написана немного позже.
Тем не менее название «День старого программиста» мне кажется смешным и, кажется, я больше чувствую этот праздник своим, чем тот, который в мой день рождения.
Аллергия-2025
Каждый год весной меня мучает аллергия. В этом году
Знаю парочку людей, которые этот период «переживают» — маски не носят, таблетки не пьют, терпят. Если про таблетки я ещё
Старый Новый Завет
Чуть больше года назад у жены умерла бабушка со стороны мамы. Она была очень хорошей, доброй женщиной, мы все её очень любили. Дочка до сих пор плачет иногда, когда её вспоминает.
Мы попросили отдать нам
Этот Новый Завет достался семье жены от прадедушки по линии мамы — Александра Ивановича Андриянова. В молодости, ещё до революции Александр батрачил, а его будущая жена была дочерью богатых купцов Шуралёвых, живших в Арском районе. Её родители активно жертвовали на храм Казанской иконы Божией Матери, построенный в 1830 году в селе Старое Чурилино.
Богатые родители, конечно, противились браку с бедным батраком. Чтобы быть вместе, Александр выкрал невесту из дома, и молодые сбежали. Родители девушки признали их союз лишь после рождения второго ребёнка — тогда пара обвенчалась в той самой церкви.
В 1930 году храм закрыли: после последней службы чекисты выдворили верующих, а монахов и монахинь арестовали. Здание превратили в зернохранилище, позже — в склад ГСМ и резервный объект Казанского завода. Новый Завет, вероятно, попал к Александру Ивановичу в те годы, когда угроза закрытия церкви стала очевидной. Мама жены, его внучка вспоминает, что, по рассказам дедушки, он получил книгу ещё до брака. Значит это произошло до 1924 года, когда у него родился первый ребёнок. В советские годы книгу не афишировали, она лежала дома.
В 1992 году храм вернули верующим. Во время реставрации в подвале обнаружили замурованный склеп с 78 черепами, уложенными в шахматном порядке. Предполагают, что останки принадлежали захоронениям у старой церкви, а при строительстве их перенесли в подвал, следуя церковным традициям. Сегодня на этом месте устроена часовня для поминовения.
Интернет всё мертвее
Теория мёртвого интернета — моя любимая конспирологическая теория, я полюбил её за то, что она единственная из всех может со временем стать реальностью. В этом году мы стали к её осуществлению немного ближе. Компания «Имперва» опубликовала исследование, согласно которому 51% всех пользователей интернета — это боты. Судя по опубликованным графикам, их доля от года к года растёт.
Ну и вдогонку.
Я помню,
Если ещё вспомнить, что в Солнечной системы всего две населённые планеты — Земля и Марс, причём последняя населена исключительно роботами…
В общем, роботы уже общаются больше нас, программируют больше нас и отжали себе целую планету, где людям не место!
Первая дочкина программа
Время не сохранило мою первую программу. Из своих дневников жизни я прочитал, что она была на Бейсике для компьютера «
Поэтому я решил сохранить первую дочкину самостоятельную программу. Она написана на языке «Скретч». Два дня назад мы вместе попробовали написать программу по уроку на «Ютубе», а вчера дочка перед сном написала свою собственную.
Конечно, очень простая — нажимаешь на пробел, собака лает. Фон и звук взят из стандартной библиотеки.
Зима, угомонись
Когда мы были первый раз в Турции, помню, поразило, что, при всей компактности страны, можно за один день, сев в автомобиль, побывать в трёх климатических зонах.
У нас Казань вчера сменила по меньшей мере две, хотя мы никуда не ездили. Днём было тепло, в рубашке с длинными руковами еа улице было комфортно, вечером похолодало и пошёл дождь, а ночью начался снегопад. Всё покрыл довольно заметный слой снега.
P. S. Это новый для меня опыт — страдать аллергией на цветение посреди снегопада.
Митап по PHP
Признаюсь, я
Если судить по отзывам, событие чрезвычайно всем понравилось. Многие сказали, что давно не участвовали
Не знал, что организация подобный событий отнимает столько сил. Несмотря на список, который мы начали вести с самого начала, то одно, то другое постоянно выпадало из зоны внимания, настолько много всего пришлось учесть.
Мы начали примерно за два месяца, тем не менее,
Я очень переживал за эти вещи, потому что
Большое спасибо докладчиками — Александру Макарову, Максиму Пестову и Станиславу Кошевому за то, что вызвались поучаствовать и интересные доклады.
Видео я показать не могу, верьте на слово, — мы его принципиально не записывали. Если мы сделаем наши митапы регулярными, не будем записывать и впредь — наша идея в том, чтобы люди больше общались, хотя бы вынуждено, приходя вот на такие события.
Принтер, MacOS и IPv6
Я выключил IPv6 на принтере, но позже оказалось, что полностью проблема не решилась
Я вообще привык, что в МакОСи постоянно
Вчера решил зайти в его
Похоже в ней и было дело. После этого, как я выключил этот протокол, принтер стал работать без нареканий.
Cначала запустил из командной строки сканирование сети:
$ dns-sd -B _printer._tcp
Browsing for _printer._tcp
DATE: ---Mon 28 Apr 2025---
21:09:21.373 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
21:09:21.374 Add 2 14 local. _printer._tcp. HP LaserJet Professional P1102wПотом запросил информацию о найденном принтере:
$ dns-sd -L "HP LaserJet Professional P1102w" _printer._tcp local.
Lookup HP LaserJet Professional P1102w._printer._tcp.local.
DATE: ---Mon 28 Apr 2025---
21:09:59.306 ...STARTING...
21:09:59.306 HP\032LaserJet\032Professional\032P1102w._printer._tcp.local. can be reached at NPI78BD4A.local.:515 (interface 14)
txtvers=1 qtotal=1 rp=auto pdl=application/vnd.zeno-zjs,application/vnd.cups-raster ty=HP\ LaserJet\ Professional\ P1102w product=\(Hewlett-Packard\ HP\ LaserJet\ Professional\ P1102w\) priority=50 adminurl=http://192.168.0.127 usb_MFG=Hewlett-Packard usb_MDL=HP\ LaserJet\ Professional\ P1102w Transparent=T Binary=TАдрес, на который надо зайти браузером, находится после подстроки adminurl=.
Принтер, MacOS и IPv6 часть вторая
К сожалению, ни отключение IPv6, ни фиксирование адреса IPv4 (ещё одна мера, которую я попробовал) не излечили полностью проблемы с принтером. Но в процессе копания в настройках, я обратил внимание, что у него очень старая прошивка — 2012 года. Подумал, может обновление решит проблему?
На сайте последняя прошивка датируется началом
Вообще это очень странно — выпускать для принтера каждой линейки свою программу для обновления прошивки, да ещё и для каждой операционной системы отдельно. Загадка для меня, почему нельзя писать более универсально — программу, которая обнаруживает подключенную модель принтера, проверяет устарела ли прошивка, качает её (или указывает где её взять), после чего обновляет.
В общем, поскольку под «МакОС» программа не работает, пришлось обновлять прошивку через «Виндоуз», благо у меня уже развёрнута виртуалка с Windows XP, которую я использую, чтобы переписывать фотографии, сделанные винтажными часами «Касио».
Поставил туда драйвер от принтера и программу для обновления прошивки.
Теперь остаётся наблюдать — решилась ли проблема.