Дочкино печенье
В выходные нас с женой
Замешала тесто, нанесла всё на противень, подстелив бумагу для готовки, и поставила выпекаться в духовку.
Всё это я узнал уже по пути домой — дочка написала, — расстраивалась, что печеньки подгорели. Возвращаться было волнительно — вдруг квартира вся в дыму. Но нет, печеньки действительно лишь немного подгорели. Как сказала бабушка, шоколад надо было добавлять в конце, а не в самом начале, вот он и сгорел.
Печенье оказались вкусными, мы их съели почти сразу, еле успел сфотографировать.
Использую ли я «Флиппер»
У меня тут спросили, использую ли «Флиппер Зеро», — давно ничего про него не рассказывал. Использую, конечно, и очень интенсивно! С тех пор как потерял магнитный ключ от подъезда, каждый день туда и обратно прохожу, прикладывая вместо него «Флиппер». Всё недосуг заняться этим вопросом.
Хорошо, что ещё в самом начале я записал на «Флиппер» данные всех магнитных ключей, которые у меня были — домашний, рабочий, родственников и так далее.
Ещё немного про random() в bc
Как я уже рассказывал, bc под «Линуксом» очень старый, — на всех машинах, куда у меня есть доступ, установлена версия 1.07.1
Ранее я обнаружил недокументированную функцию random(), но генератор случайных чисел в линуксовом bc не инициализируется и функция выдаёт на старте всегда одно и тоже число. Её можно покрутить снаружи случайное число раз и это исправляет ситуацию, но способ, который я тогда придумал для этого, так себе.
Сегодня, пока ехал в такси, придумывал ещё более так себе способы это сделать.
Мысль моя крутилась вокруг запуска через утилиту env. В мире командной строки так частенько делают, так что этот способ как будто бы чуть более честный, так шелл тут не используется:
#!/usr/bin/env -S -i seed_="0${XDG_SESSION_ID};while(seed_--).=random()#" bc /proc/self/environ
print random()
quit()Здорово, правда?
Вся чёрная магия сосредоточена в первой строке. Файл /proc/self/environ формируется в «Линуксе» для каждого запущенного процесса и содержит унаследованные переменные окружения. Так как там много ненужного нам мусора, очищаем его целиком при помощи ключа -i утилиты env.
Далее мы создаём переменную окружения seed_, а внутри её формируем небольшую программу, которая запустится до нашего кода. Для bc результат будет выглядеть так:
seed_=0123456
while(seed_--).=random()
#^@
print random()
quit()Я развернул односрочную программу в многострочную для удобства.
Вместо 123456, конечно, будет подставлено число из переменной окружения $XDG_SESSION_ID, которая содержит число. Ноль там впереди, чтобы не случилось ничего страшного, если эта переменная в вашем дистрибутиве «Линукс» отсутствует.
Мне кажется, это неплохой способ, жаль только что содержимое $XDG_SESSION_ID остаётся одинаковым на всём протяжении жизни сессии. То есть, если запустить программу несколько раз в одном и том же окне терминала, случайные числа будут генерироваться всегда в одной и той же последовательности.
В конце файла /proc/self/environ всегда есть символ с кодом ноль, который мог бы нам всё испортить, но мы спрятали его за символом комментария — #.
Как видно, функция random() вызывается seed_ раз, что позволяет остановиться
Несложно додуматься до похожего способа, который позволяет читать число