Дореволюционный «Однер»

Арифмометр Однера (73.83КиБ)
Арифмометр Однера 1906 года, выпущенный фабрикой в Санкт-Петербурге

Из-под Астрахани в наш музей приехал дореволюционный арифмометр Однера 1906 года. К сожалению, на нём год уже не написан — он был на шильдике, который пропал вместе со сгнившим деревянным основанием, но дореволюционная орфограция видна невооружённым взглядом.

О Вильгодте Теофиле Однере я уже рассказывал — это шведско-русский механик, который в 1868 году приехал в Питер, где остался до конца своей жизни. В он 1877 выпустил первый арифмометр собственной конструкции, который стал невероятно коммерчески успешным.

В 1905 году Вильгодт умер и управление компанией перешло к его сыну и партнёру отца — Френку Хиллу. После революции компанию национализировали, бывшие владельцы переехали в Швецию, в СССР же знаменитые арифмометры выпускались ещё очень долго. Знаменитые «Феликсы» — это, по сути, клон «Однера» с модификациями.

Благодаря моей бабушке, которая забрала с предприятия списанный «Феликс», я с детства умею обращаться с такими машинками, но этот экземпляр уже не рабочий — сильно заржавел, зато обошёлся дешевле рабочих моделей.
Комментировать
23 апреля 2017 17:31

Огород над печью для обжига

Глазурь на кирпиче (63.08КиБ)
Глазурь на кирпиче, вынутого из стены старинной промышленной печи

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

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

Она живёт в частном доме, в посёлке Красная Горка. Её муж и сын, копая яму под какие-то хозяйственные нужды, докопали до слоя кирпичей, выкорчевали несколько и поняли, что наткнулись на печь для обжига. Связались с историками из Казани, те приезжали к ним и в частности рассказали, что это третья такая находка, то есть такие печи находят, но это редкость.

Кстати, печь очень большая — проходит не только под их огородом, но и под несколькими огородами соседей. Насколько я понял, дальше раскапывать её не стали, заливать чем-либо — тоже, просто по-прежнему живут над ней надеются, что не обвалится.
Комментировать
22 апреля 2017 22:46

Снова о Стрелковых и Шапкиных

Выписка (77.93КиБ)
Выписка о бракосочетании из метрической книги деревни Новое Исаково

Я как-то упоминал три года назад, что у меня есть предок, который, как мне кажется, не разобрался в концепции фамилий в своё время. Он сам и часть его детей какое-то время записывались под фамилией жены — Шапкины, а позже он получил собственную фамилию — Стрелков.

На скриншоте выше выписка за 1907 год, где косвенно упомянута смена парадигмы — мой двоюродный прадедушка Василий Павлович записан сразу под двумя фамилиями.
2 комментария
20 апреля 2017 13:14

PostgreSQL и PHP — слон слону не товарищ

Продолжаю серию удивительных открытий в мире перехода на «Постгрес». В документации к функции pg_execute есть малозаметное примечание к последнему параметру — в нём передаются значения для запроса:

Warning Elements are converted to strings by calling this function.

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

Перевод такой: все значения, которые передаются, приводятся к строкам. Код, который это выполняется выглядит так (взял из ПХП 7.2):
if (num_params > 0) {
        int i = 0;
        params = (char **)safe_emalloc(sizeof(char *), num_params, 0);

        ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
                ZVAL_DEREF(tmp);
                if (Z_TYPE_P(tmp) == IS_NULL) {
                        params[i] = NULL;
                } else {
                        zval tmp_val;

                        ZVAL_COPY(&tmp_val, tmp);
                        convert_to_cstring(&tmp_val);
                        params[i] = estrndup(Z_STRVAL(tmp_val), Z_STRLEN(tmp_val));
                        zval_ptr_dtor(&tmp_val);
                }
                i++;
        } ZEND_HASH_FOREACH_END();
}

pgsql_result = PQexecParams(pgsql, query, num_params,
                                NULL, (const char * const *)params, NULL, NULL, 0);
Вышеупомянутое примечание есть только у этой функции, но на деле в любом месте, где привязываются значения, всё выглядит примерно так же (это касается и модуля ПДО).

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

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

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

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

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

Мой братишка придумал оригинальное решение — определять позиции на которых мы привязываем числа и автоматически внутри нашего фреймворка в этом месте запроса указывать тип bigint явным образом. То есть добавлять после плейсхолдера параметра конструкцию «::bigint».

Пришлось изменить несколько наших хранимых процедур, но в целом всё плошло довольно гладко.
Комментировать
13 апреля 2017 20:19

Ускорение пользовательских функций в PostgreSQL

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

В попытке как-то их ускорить, наткнулся на странность. Возможно это где-то описано, я пока не нашёл это место в руководстве.

Ниже две функции на разных языках, поддерживаемых «Постгресом», по смыслу идентичные — обе представляют собой замену функции NVL2 «Оракла» над целыми числами:
CREATE FUNCTION nvl2_plpgsql(a numeric, b numeric, c numeric) RETURNS numeric AS '
BEGIN
  IF a IS NULL
    THEN RETURN c;
    ELSE RETURN b;
  END IF;
END;
' LANGUAGE plpgsql IMMUTABLE;

CREATE FUNCTION nvl2_sql(a numeric, b numeric, c numeric) RETURNS numeric AS '
SELECT CASE WHEN a IS NULL THEN c ELSE b END;
' LANGUAGE SQL IMMUTABLE;
Будет ли какая-то разница в производительности? Посмотрим на тесты:

p95=# EXPLAIN ANALYZE SELECT nvl2_plpgsql(g, 0, 0) FROM generate_series(1, 10000000) _(g);

Planning time: 0.066 ms Execution time: 38881.927 ms

p95=# EXPLAIN ANALYZE SELECT nvl2_sql(g, 0, 0) FROM generate_series(1, 10000000) _(g);

Planning time: 0.253 ms Execution time: 15435.231 ms


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

Это неплохое подспорье, так как у нас такие функции встречаются не только в самих запросах, но и в функциональных индексах, значит ускорятся не только чтения, но и вставки.
Комментировать
11 апреля 2017 20:24

Mosh

Клиент mosh (40.65КиБ)
Окно клиента, когда пропало соединение

Погонял несколько дней в качестве клиента «мош» — «мобильный шелл». Хорошая штука, логинится через эсэсаш, далее поднимает на удалённой стороне свой сервер и открывает свой шифрованный канал через ЮДиПи. Ключи авторизации тоже естественно поддерживаются.

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

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

Ставится просто — поддерживаются все основные системы, ставите на обе стороны, запускаете из командной строки (mosh имя_сервера вместо ssh имя_сервера) и всё работает.
5 комментариев
9 апреля 2017 20:08

Запрос на 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