M9K blog

Заметки ITшника обо всём

Синематики Star Wars

Справедливое в комментариях:
Remember, as long as the only evidence of a game’s existence is a CGI trailer, it doesn’t exist.
Но все равно красиво.

Нейрогенеративная Нара

Будучи в Японии, сделал великолепный снимок одного из храмов в Наре.

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

STALKER2 PS5 Trailer

Время летит быстро — без малого года прошёл с момента релиза. Зашёл на второе прохождение, игра по состоянию на патч 1.6 прекрасна.

 20   2 мес   stalker 2   trailer   youtube

Конак и Қонақ үй

Листал карту Белграда и наткнулся на достопримечательность «Конак кнеза Милоша» (усадьба князя Милоша). Слово и смысл показалось подозрительно знакомыми с казахским «Қонақ үй» (гостиница). Короткий GPT-гуглинг подтвердил мои подозрения:

Серб. konak ‘усадьба, резиденция, постоялый двор’ — это заимствование из османо-тур. konak ‘большой дом, резиденция; постоялый двор’. Турецкое konak связано с глаголом kon-(mak) ‘останавливаться на ночлег, садиться (о птице), размещаться’.

Казахск. қонақ үй — буквально ‘дом для гостей’: қонақ ‘гость’ + үй ‘дом’. Слово қонақ — исконно тюркское, от того же корня қон- ‘садиться, останавливаться на ночлег’.

Итог: сербское konak — турцизм эпохи Османской империи; казахское қонақ — родное тюркское. Оба восходят к одному пра-тюркскому корню *kon- ‘останавливаться/переночевать’.

Windows перемещение файлов в директории по совпадению части имени

В указанной директории ищем файлы с «_45» или «_16», перемещаем во внутреннюю создаваемую директорию.

$dir = "C:\work\pics"
$target = Join-Path $dir 'substrateInstagram'
New-Item -ItemType Directory -Path $target -Force | Out-Null
Get-ChildItem -Path $dir -Filter *.jpg -File |
  Where-Object { $_.BaseName -match '(_45|_16)' } |
  Move-Item -Destination $target

Linux Passwordless oneliner

TARGET=user@host; PORT=22; [[ -r ~/.ssh/id_ed25519.pub ]] || ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519; ssh -p "$PORT" "$TARGET" 'umask 077; mkdir -p ~/.ssh && cat > ~/.ssh/authorized_keys' < ~/.ssh/id_ed25519.pub && ssh -p "$PORT" "$TARGET" 'echo ">>> Root доступ подтверждён"'

CouchDB, Debian, AstraLinux, Docker и все-все-все

Возникла необходимость запустить Couchdb в контейнере, где базовая ось (и базовые же пакеты) должны быть очень-очень свежими, в противной случай контейнер не проходит встроенную проверку на безопасность.
Стандартный официальный образ собран на базе Debian 12.

FROM debian:bookworm-slim

Простая замена базового образа на

FROM debian:trixie-slim

приводит к тому, что контейнер не собирается по зависимостям.
Смотрим официальную репу в части зависимостей и видим прекрасное — libmozjs-78-0 (>= 78.15.0). Пробуем ставить свежую версию, которая есть в репах — не помогает, пакет couchdb принципиально требует libmozjs-78-0.

Ок, скрещиваем ежа и ужа.

У debian есть механизм apt-pinning. Это механизм, позволяющий задать приоритеты для версий пакетов из разных источников (репозиториев, release-веток, PPA), чтобы фиксировать версию, запрещать обновление или предпочитать конкретный источник.

Коротко приоритеты делятся на:

  • < 0 — никогда не устанавливать.
  • 1..99 — ставить только при явном указании версии.
  • 100 — приоритет уже установленной версии.
  • 500 — дефолт для неприоритетных источников.
  • 990 — приоритет для целевого релиза (-t), либо если явно указан release.
  • >1000 — разрешает понижение версии (downgrade) к закреплённой.

Добавляет в наш Dockerfile:

RUN echo "deb http://deb.debian.org/debian bookworm main" > /etc/apt/sources.list.d/bookworm.list && \
    echo "Package: *\nPin: release n=bookworm\nPin-Priority: 500" > /etc/apt/preferences.d/bookworm && \
    echo "Package: *\nPin: release n=trixie\nPin-Priority: 600" > /etc/apt/preferences.d/trixie && \
    echo "deb [signed-by=/usr/share/keyrings/couchdb-archive-keyring.gpg] https://apache.jfrog.io/artifactory/couchdb-deb/ bookworm main" \
            > /etc/apt/sources.list.d/couchdb.list && \
    apt-get update

Основная часть пакетов ставится из свежей репы, часть, которых в ней нет — из старых.

Curl over ssh-tls-tunnel

Есть ресурс resource.name, на который нужно ходить curl-ом с засылкой данных через JSON. Специфика ресурса такова, что он принимает соединения через TLS 1.3.
Есть сервер A server.name, на котором нет выхода на нужный ресурс, но есть Nginx, и есть ssh-доступ до сервера B
Есть сервер B, на котором есть выход на нужный ресурс, но сам сервер очень старый, и TLS на нём не проходит по требования resource.name.

printf '' | openssl s_client -connect 127.0.0.1:8443 -servername resource.name -tls1_3 -brief

Костылим:
На сервере A поднимаем туннель на внутренний порт:

ssh -fN -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -L 8443:resource.name:443 user@serverB

На Nginx рисуем конфиг:

server {
        listen 9090;
        server_name         server.name;

        access_log  /site/logs/nginx/port_9090.log  main;
        error_log   /site/logs/nginx/port_9090.error.log;

location / {
        proxy_pass https://127.0.0.1:8443;

        proxy_set_header Host resource.name;
        proxy_ssl_server_name on;
        proxy_ssl_name resource.name;
        proxy_ssl_protocols TLSv1.3;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_connect_timeout 10s;
        proxy_read_timeout 60s;
        proxy_ssl_verify off;
}
}

Кидаемся тестовым запросом:

curl -v -X POST 'http://server.name:9090/resource' -H 'Content-Type: application/json' --data '{"login":"$LOGIN","password":"$PASSWORD"}'

Unzip без unzip

Есть сервер без выхода в сеть с древней ОС и мёртвыми репами. Нужно распаковать zip-архив — но утилиты нет.
Решаем вопрос python-ом:

python - <<'EOF'
import zipfile, os
archive = 'archive.zip'
target_dir = 'archive.zip'

if not os.path.exists(target_dir):
    os.makedirs(target_dir)

with zipfile.ZipFile(archive, 'r') as z:
    for name in z.namelist():
        z.extract(name, target_dir)
EOF

Multistage Docker — как пересобирать без кэша не весь Dockefile

Возникла необходимость пересобрать отдельный stage-контейнер из Dockerfile. Первый собранный контейнер — это контейнер сборки OpenSSL, который выполняется очень, очень долго. Для того, чтоб сэкономить время, во вторую часть добавляем:

# Stage 1: OpenSSL-сборка (пусть останется закешированной)
FROM debian:bookworm AS openssl-build
# ... 
# Stage 2: основная
FROM debian:bookworm-slim
# Аргумент, чтобы инвалидировать кэш
ARG CACHE_BREAKER=default
# Используем его в ENV, чтобы Docker счёл слой новым
ENV CACHE_BREAKER=${CACHE_BREAKER}

Project Hail Mary

Огненное сочетание текста Энди Вейра и Райана Гослинга. Это мы ждём.

Ведьмак 3: Дикая Охота — Трейлер к 10-летию игры

Тот самый неловкий момент, когда понимаешь, что уже прошло десять лет с того дня, когда ты просыпался посреди ночи посмотреть, насколько грустно будет идти игра на i3 толь второго, толь третьего поколения (спойлер — шла очень хорошо).

 5   6 мес   Witcher 3   youtube   трейлер
 9   6 мес   trailer   youtube   кино

Silent Hill f

Японщина в хорошем смысле. Ждём-с.

 6   6 мес   silent hill f   youtube   игры   трейлер

Путешествие в Корею. Заметки.

Сеул

Аэропорт встречает масштабом. Инчхон — один из тех редких случаев, когда ты просто вынужден уважать логистику. Для меня — уверенно в топ-5. Предварительно разведал, как добраться из аэропорта в город. Сеул в этом отношении на светлой стороне силы — здесь есть метро, и не надо платить баснословные деньги за такси (да, да, Дубай — я тебя поминаю нехорошими словами). Что ж, пойдём искать станцию. Указатели, стрелки, эскалаторы... всё движется, как и я — кажется, в правильном направлении.

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

Подхожу к автомату по продаже карт. Передо мной небольшая очередь; рядом городская карта с реальной топологией станций. Ну да, я и ранее видел городской план метро — 800+ станций *комплексно-запугают* любого (в качестве рандомного факта — Инчхонский и Сеульский метрополитены — разные транспортные системы). Сумятицу вносит тот факт, топографически линии ваще ни разу не бьются с тем, что есть на схеме. Подхожу к автомату, тот просит ввести название станции назначения. Залезаем в Organic Maps. Hongik University — услужливо подсказывает приложение. Чтож, покупаем.

Спускаюсь на платформу. Многолюдно. Подъезжает поезд, заходим. Ба! Что-то знакомое. Такие составы от Хёндая ходят в Алмате. Станция не конечная, поэтому посидеть не получится. Впрочем, после сегодняшних многочасовых посиделок в самолёте не слишком-то и хочется. Проезжаю пару станций, ёжусь. Прогноз погоды на улице рисовал за 20+, здесь же в вагоне на полную работу кондиционер, и температура не комфортная. Ну, простывать нам явно не нужно, достаём толстовку.

Часть линии уличная, но особых красот с высоты роста не видно — да и едем мы не по самым живописным уголкам. Подмечаю повсеместную зелень — боже, наконец-то лето после промёрзлой Сибири то! Вглядываюсь в лица людей вокруг. Несмотря на то, что едем с аэропорта публика большей частью местная. Непривычные черты лиц. Интересно. Через пару станций в вагон заходит компашка школьников, видимо, с занятий. О чём-то шумно переговариваются. Один парнишка пытается сделать интернациональное — несильно пробить другого в бицепс. Вот что стабильно в этом мире, независимо от национальности.

Станции медленно ползут одна за другой. Карта рисует почти 30 минут дороги. Разглядывать людей наскучивает, погружаюсь в телефон. Симка в роуминге бодро рапортует об уверенном сигнале 4G, не сдавая позиции даже в туннелях. Наконец-то станция. Нам — шестой выход. Озираюсь в поисках указателей. Выхожу в вестибюль. Станция пересадочная, здесь сходится три линии. Иду по указателям — минуту, другую, третью. Да когда ж ты кончишься то? Местами оформление станции пробуждает воспоминания про восточные ужастики — гладкий кафель, жёлтые указатели, слепящий свет. Exit 8 во все поля.

Наконец-то добираюсь до выхода. Вступаю на эскалатор, который ведёт на поверхность. Яркое небо впереди слегка слепит. Что ж, приключение началось?

Выхожу, прохожу пару метров, и встаю как вкопанный. Потом медленно достаю телефон и начинаю фотографировать всё вокруг. Вот знаете, такое странное ощущение, когда видел что-то исключительно в аниме, фильмах, сериалах — и никогда в жизни? А потом выясняется, что это реальность. Типичная провинциальная улочка восточного города, залитая ярким дневным светом. Добавь сюда акварели — и будет Миядзаки. В той же 1/6 подобный вайб можно словить в каких-нибудь провинциальных городишках к востоку от москвы в пределах русских земель века так 15-ого (ну либо гуттаперчевая россия-германия где-нибудь в Светлогорске-Раушене). Зелено, красиво, уютно, тепло. Фотография-фотография-фотография.

Ориентируюсь. Чуть поодаль от меня площадь, которая выступает в качестве ориентира. Вот честно, скучная метка на карте слабо вяжется с реальностью. Обращаю внимание на застройку — ода разноплановая — поодаль стоят и почти что небоскрёбы, но здесь, в районе метро дома сходятся к этажности в три-пять этажей. В памяти всплывают посты, почему всем так нравится европейская застройка — среднеэтажная. Вот за это.

На торце дома вижу 7-Eleven. Смотрю на часы, до времени заселения ещё двадцать минут, можно заглянуть. Небольшой магазинчик: снеки, газировка, мороженое. Хм, а чего бы не начать знакомство с местной кухней с местного же мороженого? Беру местный пломбир, воду; выхожу. Буквально рядом стоят деревянные столы, как будто с кемпинга. На них наклейки с местными же надписями на хангыле. Язык не знаю, но графика понятна — у нас не курят. Хоспади, здорово же! Присаживаюсь, распаковываю вкусняху. Вокруг — движение, солнце, звуки. Полное ощущение, что всё это — не со мной. Очень хороший сон.

Но пора выдвигаться. Прикидываю маршрут по карте. На месте, с первоначальными ориентирами жить становится определённо проще. Бессвязная линия на карте обрастает реальными деталями. Иду не спеша, откровенно пялясь на всех вокруг. Мозг фиксирует непривычное. Поворот, переход, десять метров, взгляд упирается в витрину с анимешными безделушками. Слева анимешного вида постер с явным панцушотом. Хм. Другая культура. Надо зайти — позже.

Прохожу по аллее. Где-то здесь мой хостел? Вглядываюсь в ничего не значащие для меня названия в поисках номеров. О, то что нужно. Табличка приветливо манит внутрь. Небольшой дворик, благоустройство, несколько раскладных стульев с пледами. Нормально. Взгляд упирается в кухню-ресепшен. Толкаю дверь, она без особых усилий поддаётся. На ресепшене никого нет, играет что-то из лёгкой попсы. Что ж, до трёх часов ещё пара минут, подождём.

Ровно в три на кухню заходит мужчина-кореец. Замечает меня, улыбается, здоровается на английском. Начинается типовое «гуд ивьнинг, май нейм из...». Мозг вслушивается в чужую речь, но вроде ничего страшного и непонятного нет. Мужчина представляется Брайаном, машет, мол, пойдём всё покажу. Там — полноценные номера, здесь хостел, здесь прачечная. Прачечная — это хорошо, нужно бы постираться. 7000 вон — и машинка твоя.

Заходим в помещение. Занятно, машинка отдельно, сушилка — отдельно. Ладно, пойдём заселяться. Админ проводит меня по лестнице на второй этаж, вводит код от двери. Проходим по коридору, ещё одна дверь, ещё код. Заходим. Блин, хостелы — тоже штука интернациональная. В помещении три двухэтажные кровати, занято два места. Людей нет. Выбирай, машет хозяин. Ок, давай место возле окна. Пара минут обсуждений бытовых мелочей, и меня оставляют. Закидываю рюкзак, стягиваю толстовку. Голова гудит. Всё впечатлениями забито. Закрываю тяжёлые веки.

Сон?

Ранее Ctrl + ↓