Запрос на pg_field_type

Страшно удивился, когда увидел в логах «Постгреса» запрос, которого не было в коде нашего продукта:
select oid,typname from pg_type
Как-то сразу догадался, что он порождается вызовом pg_field_type, который у нас используется, чтобы прозрачно для верхнего уровня обрабатывать тип bytea. Заменил вызов на pg_field_type_oid и запрос пропал.

Проблемы, конечно, особой в этом нет — запрос плёвый, тем более он выполняется только при первом вызове pg_field_type, но как-то неприятно, когда на каждый запуск прилетает полторы тысячи с гаком строк, которые я не заказывал, люблю контролировать такие вещи.
Комментировать
7 апреля 2017 08:16

Оригинальный арифмометр Однера (X-9 S-5)

Если помните, то в прошлом году мы с группой товарищей основали «Музей вычислительной техники им. Р. К. Самитова», после открытия я взял паузу, кое-что переосмыслил и с новыми силами взялся за розыск экспонатов. Один из них доставили из Штатов сегодня.

Вильгодт Теофил Однер — шведско-русский механик, изобретатель, разработчик «Арифмометра Однера» — который в 1940-е стал самым популярным механическим калькулятором в мире. В 1886 году он открыл небольшую мастерскую в Петербурге, которая в 1890-х произвела первый арифмометр. После смерти Вильгодта в 1905 году его компания перешла к его сыну Александру, который управлял ею вместе с партнёром отца — Френком Хиллом. Original Odhner (77.27КиБ)
Арифмометр 1950-х годов, произведённый компанией «Оригинал Однер»

После революции компания ожидаемо была национализирована, что привело к её разделению — новоявленное государство производило свои арифмометры «Оригинал-Однер», Александр же с прочими управляющими открыл в Швеции собственное производство.

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

На фотографии выше — «Original Odhner X-9 S-5», произведённый в Швеции в 1950-х годах. «Икс» означает, что модель оснащена мотором, «Эс» — с прямым вычитанием (что бы это ни значило), «5» — номер серии, «9» — номер модели в серии.

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

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

Продавец утверждает, что модель рабочая, но проверить это не могу — дома нет нужного напряжения, да и не рискнул бы всё равно — нужно разбирать в нормальных условиях и хотя бы визульно убедиться, что всё в порядке перед включением. Поэтому как именно устройство работает рассказать не могу. Знатоков немецкого отсылаю к инструкции.
2 комментария
24 марта 2017 15:29

Коммит миграций кусками с помощью psql

Я ещё не так давно работаю с «Постгресом» и раз в месяц натыкаюсь на что-то неожиданное.

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

В «Оракле» такую миграцию наши ребята, насколько я знаю, разбивали хранимой процедурой на части и коммитили внутри кусками по миллиону, в «Постгресе» так нельзя — блок на языке PL/pgSQL выполняется в собственной транзакции и она прервётся при попытке сделать COMMIT. Автономных транзакций нет.

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

Гугление рецептов принесло способ, который заключается в том, что мы создаём соединение из базы в в себя же и шлём запросы в это соединение. Говорят работает, но способ мне показался муторным, пришлось придумать свой.
DO $$
  DECLARE
    max_id table.id % TYPE;
    query TEXT;
BEGIN
  -- делим таблицу на куски по миллиону, теперь в max_id у нас номер последнего куска
  SELECT CEIL(MAX(id)::float/1000000) INTO max_id FROM mytable;

  -- очищаем файл /tmp/sqlquery
  COPY (SELECT '') TO '/tmp/sqlquery';

  -- айдишники в моём конкретном случае идут с единицы, но более правильно идти с минимума до максимума с шагом
  FOR i IN 0..max_id LOOP
        query = FORMAT(
            'UPDATE mytable '
            'SET something=value '
            'WHERE id BETWEEN ' || i*1000000+1 || ' AND ' || (i+1)*1000000 || ';'
        );

        -- запуск /bin/cat нужен, чтобы дописывать в файл
        EXECUTE  'COPY (SELECT ' || quote_literal(query) || ') TO PROGRAM ''/bin/cat >> /tmp/sqlquery''';
  END LOOP;
END$$;

-- запуск запроса
\i /tmp/sqlquery
Я воспользовался тем, что в накатке миграции у нас участвует утилита psql — официальный консольный клиент к «Постгресу», помимо команд СУБД она умеет выполнять свои собственные команды, чем я и пользуюсь — собираю нужные запросы в файл и запускаю его на выполнение в последней строке.

Обратите внимание на вызов /bin/cat — это важно, так как команда COPY сама не умеет добавлять что-то в файл, она его перезаписывает.
2 комментария
24 марта 2017 08:48

Шалаш на острове сокровищ— 8

Выезд, результаты (100.56КиБ)
Результат выезда в выходные — не обошлось и без царской монеты

В эти выходные позволил себе короткий (всего несколько часов) выезд.

1 копейка 1875, 3 копейки 1938, 3 копейки 1941, две монеты по 20 копеек 1943, 2 копейки 1949, 3 копейки 1950, 1 копейка 1953, пуговка с серпом и молотом в советской звезде, три монеты поздних «советов» по одной копейке и обломок эмалированной ложки.

Все монеты, кроме царской, обработал уксусной кислотой — большинство были загажены настолько, что год вообще не читался. Как видите, часть монет покраснела. Насколько я понимаю процесс, алюминиевая бронза монеты окислилась и алюминий превратился в какую-то соль, которую и сняла кислота, красный металл, который обнажился — это медь из сплава.
6 комментариев
19 марта 2017 13:29

Скриптование меню в статус-баре

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

Если кому интересно, то последовательность его прикручивания к системе примерно такова (bolk — моё имя пользователя и требуется установленный brew):
mkdir -p /usr/local/Cellar/ScriptableStatusBar/0.1/bin/
mv ~/Downloads/ScriptableStatusBar-release/usr/local/bin/sbar !:2
mv ~/Downloads/ScriptableStatusBar-release/Applications/ 
    /usr/local/Cellar/ScriptableStatusBar/0.1
brew link ScriptableStatusBar
open /usr/local/Cellar/ScriptableStatusBar/0.1/Applications/

# Тут надо утянуть открывшееся приложение в «Объекты входа»
# и ещё запустить его в открывшемся окне, разрешив ему в принципе запускаться
Очень неудобно и несколько недоделано. Хотелось бы, чтобы из шелла можно было добавить/удалить пункт меню и сменить иконку. Сейчас это тоже можно, но полной переинициализацией и, кроме того, убъёшься всё экранировать.

Вооружившись несложной инструкцией, делаем несколько магических пассов:
cat>~/lockkeyboard.sh<<LOCK
#!/bin/ksh

kext=/System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/
case "$1" in
	unlock )
		/sbin/kextload "$kext"
		;;
	lock )
		/sbin/kextunload "$kext"
		;;
esac
LOCK

sudo chown root:staff ~/lockkeyboard.sh
sudo chmod 750 ~/lockkeyboard.sh

sudo cp /dev/stdin /private/etc/sudoers.d/lockkeyboard<<SUDO
bolk    ALL= NOPASSWD: /Users/bolk/lockkeyboard.sh
SUDO

sbar set locker 🔓\
	'Lock:/usr/bin/sudo /Users/bolk/lockkeyboard.sh lock'\
	'Unlock:/usr/bin/sudo /Users/bolk/lockkeyboard.sh unlock'\
	'Quit:/usr/local/bin/sbar remove locker'
И получаем малофункциональную такую менюшечку для блокировки клавиатуры (кстати и увы, если компьютер с заблокированной клавиатурой, у вас уйдёт в блокировку по какой-то причине, то пароль ввести не получится, придётся перезагрузиться): Меню блокировки клавиатуры (22.19КиБ)
Простое меню для блокировки клавиатуры

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

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

Дополнение: нашёл ещё две программы: «БитБар» и «ЭниБар».
8 комментариев
8 марта 2017 19:30

Сила .ssh/config

Извечная задача получить доступ к одной машине через другую чаще всего решается при помощи SSH-туннелей — удобно, пока не приходится получать доступ к группе машин. Недостаток традиционного решения — не всегда удаётся придумать удачное правило выбора портов, чтобы не запутаться как мы должны соединяться, чтобы попасть на нужную машину. SSH-туннель (12.37КиБ)
Пример конфигурационного файла для получения доступа к группе машин

К счастью, есть решение лучше, которое позволяет соединяться через SSH наиболее естественным способом — как будто у нас есть прямой доступ.

Тут нам пригодится файл ~/.ssh/config, служащий для конфигурирования SSH-соединений, я обычно туда вписываю символические имена вместо айпи-адресов, логины и прочую мишуру. Но его возможности несколько шире.

Например на картинке выше у меня конфигурация, которая позволяет к любому айпи-адресу, который начинается с 172.17.0 через машину 172.17.1.131. Вся магия заключается в директиве ProxyCommand — в ней указано, что надо залогиниться на 172.17.1.131 и там запустить команду nc, которая откроет соединение на нужный нам адрес (он будет подставлен вместо «%h»).

Таким образом получается соединение, весь трафик которого без изменений попадает на нужный нам адрес, а уже в этом соединении мы выполняем обычный логин на нужную нам машину. Все аутентификации у меня, естественно, сделаны через сертификаты.
4 комментария
8 марта 2017 16:15

Принадлежность клейма «ИГ»

Клеймо «ИГ» (170.62КиБ)
Отлично сохранившееся тычковое клеймо «ИГ» по адресу ул. Пушкина, 26е

Благодаря стараниям Романа Царевского, известного мне по сообществу «Казанская ностальгия», по всей видимости выяснилась принадлежность кирпичного клейма «ИГ».

Вероятнее всего оно принадлежит заводу купца Ивана Семёновича Гребенщикова, вот что о нём сообщает книга «Республика Татарстан: православные памятники (середина XVI - начало XX вв.)»:
Поморско-брачная община в Казани не была столь же богатой и влиятельной, как старопоморская. Большую часть верующих составляли выходцы из Вятской губернии и из Чистополя. В сельской местности Казанской губернии это согласие не было распространено. Лидером и покровителем общины многие десятилетия был купец Иван Семёнович Гребенщиков (1810—1883), оптовый торговец железом и владелец кирпичного завода. Его предки, лаишевские мещане, принадлежали к старопоморскому согласию, а брат Василий был одним из лидеров казанской старопоморской общины. Но сам Иван Семёнович еще в юности перешел в поморско-брачное согласие. В 1850-1880 годы в его доме находилась молельня. До 1917 года община существовала на средства, завещанные Гребеншиковым, т. к. других крупных предпринимателей в общине не было. Наставником и руководителем хора в 1870 годы стал казанский мещанин Андриан Иванович Кочкешев, служивший в общине еще с 1861 года. После смерти Гребенщикова и вплоть до 1918 года Кочкешев был фактическим руководителем общины. Председателем совета общины после ее регистрации в 1906 году стал небогатый купец Василий Львович Виноградов.

В 1906—1910 гг. на средства, завещанные Гребенщиковым, под руководством Кочкешева, Виноградова и Василия Филипповича Максимова был построен храм на ул. Вознесенской (Островского, 81). Небольшой одноглавый храм без колокольни. Выстроен в эклектическом стиле с сочетанием псевдорусских форм и узорчатой разностилевой кирпичной кладки. Закрытый в начале 1920-х годах храм в 1982 году передан общине Русской православной старообрядческой церкви (бывшей Белокриницкой иерархии) и освящен в честь Казанской иконы Божией матери. Согласно «Списку памятников истории и культуры Республики Татарстан, находящихся на государственной охране» на 1.01.2001 года, церковь Казанской Богородицы является памятником градостроительства и архитектуры федерального значения.
Любопытно, что при немаленьком количестве источников, которые я обработал, чтобы составить свой справочник кирпичных производителей, Иван Семёнович в него не попал, что говорит о том, что какой-то важный пласт источников я пока пропустил.
2 комментария
7 марта 2017 17:51

Спонсорские площадки

Книги вскладчину (81.55КиБ)
Книги, в создании которых я поучаствовал деньгами

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

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

Начинаю понимать людей, которые вкладываются в благотворительность. Недавно прочитал мнение, что всё дело в замаливании грехов. Не знаю, у многих ли мотивы сходны с моими, но в моём случае замаливанием грехов и не пахнет и я сомневаюсь, что я такой уникальный. В моём случае возможно дело в какой-то опосредованной самореализации.
7 комментариев
4 марта 2017 13:26

Шалаш на острове сокровищ—7

Результат выезда (93.43КиБ)
Весьма неплохой результат труда в эти выходные

В один из дней четырёхдневных выходных грех было не выехать на монетные труды. Результат двенадцатичасового выезда на фотографии.

На фотографии: полушка 1754, копейка 1793, почти стёртая 1 копейка серебром (1839—1847), 5 копеек 1881, 3 копейки 1932, 1 копейка 1940, 10 копеек 1946, 5 копеек 1951, 15 копеек 1951, 3 копейки 1953, 3 копейки 1954, 3 копейки 1957, 20 копеек 1961, горка из восьми монет по 1 копейке (поздние «советы»), пуговичка с царским гербом (реверс заржавел), медаль «9 сентября 1945. За победу над Японией» (≈1946—1948), медное кольцо, пуля, значок «Отличник ВВС» (1967—1991), значок «Юношеская секция друг природы. РСФСР» (не ранее 1966), игрушка-пистолет (ц. 1 руб.), перочинный ножик.
8 комментариев
26 февраля 2017 11:47

Школа и спорт

Вот только для того, чтобы что-то сдать, нужно этому как-то научить. А нас в большинстве случаев не учили, только требовали демонстрировать уже готовые умения. Ну максимум раз-два покажут. И вперёд! Кто от природы был сильным-ловким, тот и так мог подтянуться или правильно сделать «берёзку» и «ласточку». А полненьким и слабеньким, не объясняя и не помогая, обычно просто ставили «пары».
— «Энциклопедия нашего детства. Здравствуй, школа» С. Валишин, Ю. Шекет.

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

Никто не поправлял, не объяснял как правильно, как-то выполняли упражнения и ладно. Единственно наша учительница биологии, Тамара Потаповна громко роптала, что сердечно-сосудистая система подростка не успевает за телом по развитию и занятия физкультурой в общепринятом качестве калечат детей. Впрочем её никто не слушал, включая нас, учеников.

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

Я совсем ничего не знаю о том как преподают физкультуру в школах сейчас, но хочется верить, что её качество улучшилось. Если у вас ребёнок в школе и/или вы в курсе преподавания этого предмета, не поленитесь, расскажите в комментариях современное состояние, мне будет интересно.
11 комментариев
25 февраля 2017 11:12

Клеймо «ГП» в селе Майдан

Клеймо «ГП» (126.01КиБ)
Клеймо «ГП» на доме И. Г. Сироткина в селе Майдан Верхнеуслонского района

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

В этот раз клеймо обнаружилось в селе Майдан Верхнеуслоного района, там сохранился двухэтажный полукаменный дом Ивана Григорьевича Сироткина 1895 года постройки — на первом этаже была лавка, на втором жила семья Ивана Григорьевича. Лавка какое-то время работала и после революции, потом хозяин умер, а остальных Сироткиных раскулачили. Дом Сироткиных (123.38КиБ)
Современное состояние дома Сироткиных, 1895 года постройки

В советские годы на втором этаже располагалась библиотека, а внизу — магазин, позже дом отдали под склады. Сейчас он медленно разрушается — рухнула часть перекрытий второго этажа, остаток держится на подпорках и штабелях из ящиков, в крыше — многочисленные прорехи.
Комментировать
24 февраля 2017 15:10

Ониомания

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

Всё чаще натыкаюсь на авторов, которые из 50-60-х годов довольно ясно видели тенденцию к потреблению ради потребления. Самый яркий для меня пример — это конечно «451 градус по Фаренгейту» Рэя Брэдбери. Он из 1953 года увидел наше время настолько ясно, что трудно поверить, что книга написана полвека назад.

Цитировать не будут, придётся приводить не менее 10% произведения. Взять эти десять процентов, посыпать политикой, постмодернизмом, добавить воды и получится сатира в духе Пелевина, настолько там всё узнаваемо.

Меня это очень впечатляет. Интересно откуда такая прозорливость? Ещё полвека назад было всё настолько очевидно отдельным людям? Или это типичная «ошибка выжившего» — за несколькими удачными произведениями, не видеть тонны промахнувшихся?
8 комментариев
19 февраля 2017 09:43

«Космическое» питание

Космопит (155.41КиБ)
Упаковка «Космопита», купленная на заправке, внешний вид

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

Выглядело интересно, хотя за 300 рублей хотелось бы порцию побольше — в тюбике немногим больше ста грамм еды. Внутри «Космопита» (87.72КиБ)
Весь комплект — коробка (виднеется «ключ»), термопакет и тюбик

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

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

Целевая ниша такой еды, как мне видится, — НЗ, кинул в машину и забыл до непредвиденного случая — место занимает мало, хранится долго, а случись что — выручит. Для того, чтобы подкрепиться на запланированной стоянке — дорого и невкусно.
22 комментария
12 февраля 2017 13:07

Особенности смены типа в PostgreSQL: text → bytea

При обыденной смене типа колонки в «Постгресе» с текстового типа на бинарный получил ошибку «ERROR: invalid input syntax for type bytea». Запрос довольно рядовой и сюрпризов я не ожидал:
ALTER TABLE tbl ALTER COLUMN colmn TYPE bytea USING colmn::bytea;
Решения нагуглить не удалось, поэтому начал исследовать проблему сам. Бинарным поиском нашёл строку на которой запрос запнулся, потом так же вычислил символ. Им оказался обратный слэш. Заэкранировал его и ошибка пропала:
ALTER TABLE tbl ALTER COLUMN colmn TYPE bytea USING REPLACE(colmn, '\', '\\')::bytea;
Всё отработало нормально, сконвертировалось, слеши получаются из базы как и ожидается — одинарными.
Комментировать
9 февраля 2017 11:14