Евгений Степанищев

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

«История» — это когда?

Я вот тут задумался — «история», это для меня когда? 10-е годы — это конец царизма, Революция, вот это всё, 20-е — НЭП, 30-е — расстрелы и взорванные церкви, 40-е — война. Всё это «история».

А вот пятидесятые я историей уже не ощущаю, не знаю почему, возможно потому что в эти годы родились родители и они меня прочно связали с тем временем?

По дороге в кафе, где я часто обедаю, лежит вот такой люк под ногами (см. фотографию), почти каждый день на него наступаю, давно обращаю внимание на него — очень необычный логотип и незнакомая аббревиатура — «НКС».

Оказалось я каждый день наступаю на историю, «НКС» — это «Народный Комиссариат Связи», такое сокращение применялось с 1932 по 1946 года. А логотип позаимствовали у Шведско-Датско-Русского телефонного акционерного общества.

Таких люка, кстати, два в округе, в Казани они ещё пока встречаются и в других местах, но уже очень редко, не знаю куда деваются, «коллекционеры» что ли их тырят?

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

20 февраля   история

Как читать меня через «Телеграм»

Телеграм сейчас пытается стать для какой-то части пользователей новым интернетом, как «Вконтакте» когда-то, набирают популярность каналы, я и сам чаще читаю их, чем что-то ещё (правда ещё чаще пропускаю посты в них мимо).

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

Просто добавляете бота к себе, кидаете ему адрес моего сайта и он начинает присылать посты, по мере у меня их появления на сайте (правда с чудовищным отставанием, но куда спешить-то?).

19 февраля  

cjpeg-dssim

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

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

На «Маке» всё необходимое для работы утилиты для подбора элементарно ставится из «брю», вот результат обработки картинки из предыдущего моего поста:

$ ./cjpeg-dssim jpegoptim test/2018.02.17.1@2x.jpg
$ ll -h test
total 584
drwxr-xr-x+ 4 bolk  staff   128B 18 фев 12:09 .
drwxr-xr-x+ 7 bolk  staff   224B 18 фев 12:09 ..
-rw-------@ 1 bolk  staff   187K 18 фев 12:00 2018.02.17.1@2x.jpg
-rw-r--r--+ 1 bolk  staff   102K 18 фев 12:09 2018.02.17.1@2x_cjpeg_dssim.jpg

Экономия 85 килобайт, это очень существенно, при этом разницу на картинке я и правда не вижу. Буду теперь обрабатывать иллюстрации этой утилитой.

Обработка дополнительно утилитой jpegtran из пакета mozjpeg даёт ещё два килобайта экономии.

18 февраля   jpeg

Видеокамера PXL-2000

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

Необычна она тем, что записывала видео на обычные аудиокассеты.

Помещалось примерно 11 минут видео со звуком, качество видео, разумеется было так себе (разрешение — 120×90, 15 кадров с секунду). Видеомагнитофонов, которые бы проигрывали столь необычный формат не существовало — чтобы посмотреть записанное, камеру следовало подключить к телевизору.

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

17 февраля  

Голод — не тётка

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

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

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

Есть ещё сложное понятие «взятое в руку неожиданно принесло мне дискомфорт».

17 февраля   дочка

Правда выигрывает

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

Мне пока не удалось победить уровнь №6 (30 символов против 22) и 10 (29 против 27), не хватило свободного времени на работе, чтобы додумать, попробую в выходные.

Решил все. №10 — утром, №6 — уже к полуночи. С номером шесть возился очень долго — пришлось через рефлексию отобрать все функции, которые не имеют обязательных параметров, просмотреть большинство и отбросить кучу интересных, но тупиковых идей.

16 февраля   php   программирование

Выделение памяти (ассемблер под Линукс)

До переезда блога на новый движок я писал аналог команды tee на ассемблере. Тогда передо мной стояла проблема выделения памяти — в команду может быть передано несколько имён файлов, я не знаю сколько, их нужно будет открыть, а под открытые файлы нужно место.

Программу я закончил, но из-за переезда последний этап её написания я не зафиксировал. Исправляюсь.

Как я уже упоминал, есть два способа выделить память под Линуксом — sys_brk и sys_mmap. Второй способ используется, когда памяти надо выделить много, очевидно это не мой случай, поэтому я использовал вызов sys_brk. Этот вызов двигает границу так называемой «кучи» (Runtime heap на картинке) вверх (к старшим адресам) и в получившемся пространстве можно что-то хранить.

Код выглядит так:

mov rax, 12 ; sys_brk
xor rdi, rdi ; в rdi записываем ноль (получить текущий адрес)
syscall

cmp rax, 0
jl memory_error ; обработка выделения памяти

; в rax у нас указатель на текущую границу кучи
; новый адрес нужно записать в регистр rdi
mov rcx, size ; количество хидеров файлов, которые надо хранить
lea rdi, [rcx * 8 + rax] ; каждый хидер занимает восемь байт
mov rax, 12 ; sys_brk
syscall

То есть получаем старый адрес, прибавляем сколько надо, устанавливаем новый адрес. Все менеджеры памяти Линукса (включая известнейший вызов malloc с Си), используют один из этих двух вызовов или их комбинацию.

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

Особенность PHP 7.2 (и 7.1)

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

$arr = [[1]];
array_walk($arr, function(){});
array_map('array_shift', $arr);
var_dump($arr);

В ПХП 7.0 массив выведется в неизменном виде, а в версии 7.2 (и 7.1, как оказалось) единица исчезнет. Очевидно, что array_walk создаёт какие-то ссылки внутри массива, из-за чего array_shift начинает получать внутренний массив по ссылке и сдвигать. Но никаким другим способом (например, прямым созданием массива со ссылками) мне такое поведение получить не удаётся.

14 февраля   php   php7   программирование

Греция

В прошлом году мы были в Греции, на острове Крит. Греция — страна моего детства, в том смысле, что Зевс, Минотавр, Тесей, Геракл — все эти имена из книг, мультиков и фильмов моего детства. Не знаю мне ли так везло или в СССР действительно столько внимания уделяли греческим мифам, но я как-то постоянно с ними сталкивался.

Я долго колебался писать ли этот пост, но в конечном счёте подумал — почему бы и нет? Пусть будет.

Греция — 28 страна, где мы были. Возможно мой интерес к ней был сильно «перегрет» детскими переживаниями, но это единственная из 28 стран, которая мне не понравилась, сразу и, кажется, бесповоротно.

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

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

И дело даже не в бедности и заброшенности как таковой.

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

Возможно это пугает потому, что невольно примеряешь это на себя, на свою страну, задумываешься не случиться ли это и с нами… и что тогда будет?

12 февраля   путешествия

ProxyJump

Как-то писал заметку про .ssh/config и опцию ProxyCommand, а потом почти сразу после этого, перечитывая руководство по теме, наткнулся на схожую опцию 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

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

10 февраля   ssh   ssh_config   программирование
Ранее Ctrl + ↓