M9K blog

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

Suno: личный опыт

Неожиданно для себя открыл коммерческую генеративную модель для музыки — Suno.

Если к доступным генераторам картинок и видео у меня по-прежнему есть вопросы — получить нестилизованное изображение, которое не вызывает у восприятия ощущения «здесь что-то не так», всё ещё довольно нетривиальная задача; главная страница Civitai тому регулярно служит наглядным подтверждением, — то с музыкой всё оказалось несколько интереснее.

Музыка в этом смысле куда более схематична и формализуема: Shazam с алгоритмическим анализом музыки в привычном нам виде существует уже добрых полтора десятка лет, а инструменты вроде автотюна, способные вытащить даже весьма безнадёжный вокал, появились тоже далеко не вчера. Поэтому сама идея машины, которая не только разбирает музыку на составляющие, но и собирает их обратно, уже не кажется чем-то совершенно инопланетным.

Но реальность, как обычно, прозаичнее рекламных роликов.

Кнопки «сделать шедевр» там нет.

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

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

И потом генерировать снова.

И ещё раз.

И брать удачную версию, менять две строчки и обнаруживать, что теперь модель зачем-то переписала половину аранжировки.

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

Но чем конкретнее ты понимаешь, что именно хочешь услышать, тем заметнее разница между «я написал запрос нейросети» и «я действительно сделал трек».

В общем, магии не случилось.

Случился ещё один довольно мощный инструмент, который позволяет потратить три часа на то, что, по рекламе, должно было занять три минуты.

Spine Trailer

Симпатичный трейлер экшена второго эшелона, который невольно напомнил о Syndicate 2012-ого года и Sin Episodes года 2006 (где-то на этой цифре мой мозг чутка завис — как давно, оказывается, это было-то ). Фигуристая героиня, бодрая боёвка, приятная графика (спасибо UE5)  — повод последить за релизом.

Witcher 3 — Songs of the Past trailer

Не то чтобы я не припоминал случаев, когда новый контент выходил для совсем уж старых игр — успешно разрабатываемые и продающиеся DLC для Age of Empires II тому живое свидетельство. Но сделать сюжетное дополнение для игры, чьё дополнение — «Кровь и вино» — стало эталоном того, как нужно расширять игровой мир, — это как минимум смело.

Ждём, морально готовимся выделить пару месяцев на повторное прохождение.

Neuromancer Trailer

Занятно, но Гибсон, породивший киберпанк в современном «hi tech low life» понимании, так и не удостоился экранизации «Нейроманта». По картинке — выглядит волшебно, главное чтоб не случилась история аки второй сезон Altered Carbon. Ждём января?

 14   1 мес   Neuromancer   youtube   Гибсон   трейлер

Диалектическое прожимание супротности

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

Дальше началась генеративная возня. Хотелось не просто «сделать красиво», а вытащить из исходника то, что там уже сидело: бетон, Балканы, ночной вокзал, мокрые рельсы, панельки на склоне, редкие окна, поздний транспорт и ощущение, что реальность дала трещину, но пока держится на арматуре.Добавим совершенно неприличное для Белграда полярное сияние. Не потому что так бывает, а потому что так должно было выглядеть это место в своей внутренней мифологии.

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

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

В общем, Прокоп как станция между городом и воображением. Поезд на Прибой отправляется. Реальность остаётся на платформе.

Как временно расширить ZFS-пул с помощью zvol из другого пула

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

Было два независимых пула:

zpool list

NAME    SIZE  ALLOC   FREE  FRAG  CAP  HEALTH
db     11.7T  8.99T  2.71T   18%  76%  ONLINE
limon  79.5G  77.0G  2.46G   90%  96%  ONLINE

Пул limon закончился, а в пуле db оставалось несколько терабайт свободного пространства.

Требовалось временно дать пулу limon около 10 ГБ, очистить логи и затем вернуть конфигурацию в исходное состояние.

Почему нельзя просто передать свободное место?

Свободное пространство принадлежит конкретному ZFS-пулу. Датасет одного пула не может непосредственно использовать место из другого пула.

Топология исходного пула

Пул limon состоял из одного раздела:

zpool status limon

pool: limon
state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    limon       ONLINE       0     0     0
      sdd1      ONLINE       0     0     0

Для последующего удаления временного vdev необходимо проверить поддержку функции device_removal:

zpool get feature@device_removal limon

В моём случае функция была включена:

NAME   PROPERTY                VALUE    SOURCE
limon  feature@device_removal  enabled  local

Также необходимо определить фактическое значение ashift существующего vdev.

Команда:

zpool get ashift limon

может показать:

limon  ashift  0  default

Значение 0 означает автоматический выбор для новых устройств и не показывает фактический ashift уже существующего vdev.

Реальное значение можно получить через zdb:

zdb -C limon | grep -E 'path|ashift'

Результат:

path: '/dev/sdd1'
phys_path: 'acpi-VMBUS:01-vmbus-3d4511ba2bac43a19298b9d3bddf7b27-lun-2'
ashift: 12

Таким образом, временный vdev тоже нужно добавлять с ashift=12.

Важное предупреждение

Описанный способ создаёт зависимость одного ZFS-пула от другого.

Пока временный zvol входит в пул limon:

  • пул db нельзя экспортировать;
  • zvol нельзя удалить;
  • сервер нельзя загружать без доступного пула db;
  • потеря пула db может привести к потере всего пула limon
    Это аварийная временная мера, а не постоянная архитектура хранения.

Создание временного zvol

Чтобы не повторять изменяемые значения в командах, зададим переменные:

POOL_SOURCE="db"
POOL_TARGET="limon"
ZVOL_NAME="limon-temp-vdev"
ZVOL_SIZE="10G"
ZVOL_DATASET="${POOL_SOURCE}/${ZVOL_NAME}"
ZVOL_DEVICE="/dev/zvol/${ZVOL_DATASET}"
ASHIFT="12"
VOLBLOCKSIZE="16K"

Создаём обычный, неразреженный zvol:

zfs create -V "${ZVOL_SIZE}" -b "${VOLBLOCKSIZE}" -o compression=off "${ZVOL_DATASET}"

Проверяем созданный zvol:

zfs get volsize,volblocksize,refreservation,compression "${ZVOL_DATASET}"

Проверяем наличие блочного устройства:

udevadm settle
ls -l "${ZVOL_DEVICE}"
blockdev --getsize64 "${ZVOL_DEVICE}"

У обычного zvol параметр refreservation должен быть примерно равен его размеру. Это гарантирует, что необходимые 10 ГБ действительно зарезервированы в пуле db.

Проверка добавления без изменения пула

Сначала выполняем пробный запуск:

zpool add -n -o ashift="${ASHIFT}" "${POOL_TARGET}" "${ZVOL_DEVICE}"

В предполагаемой конфигурации исходный диск и временный zvol должны находиться на одном уровне:

limon
sdd1
/dev/zvol/db/limon-temp-vdev

Добавление временного пространства

Если пробная проверка не показывает ошибок, добавляем zvol:

zpool add -o ashift="${ASHIFT}" "${POOL_TARGET}" "${ZVOL_DEVICE}"

После этого проверяем состояние:

zpool status -P "${POOL_TARGET}"zpool list "${POOL_TARGET}"
zfs list "${POOL_TARGET}"

Дополнительно проверяем ashift обоих vdev:

zdb -C "${POOL_TARGET}" | grep -E 'path|ashift'

Оба top-level vdev должны иметь ashift=12. Разный ashift может помешать последующему удалению временного устройства.

После добавления zvol пул limon получит немного меньше 10 ГБ полезного пространства из-за внутренних накладных расходов ZFS.

Удаление временного vdev

Сначала проверяем возможность удаления:

zpool remove -n "${POOL_TARGET}" "${ZVOL_DEVICE}"

Параметр -n не выполняет полноценную симуляцию переноса данных. Он используется для оценки параметров операции, включая необходимый объём памяти для таблиц перенаправления.

Если ошибок нет, запускаем удаление с ожиданием завершения:

zpool remove -w "${POOL_TARGET}" "${ZVOL_DEVICE}"

Во время удаления ZFS переносит блоки с временного zvol обратно на исходный диск sdd1.

За процессом можно наблюдать в другом терминале:

watch -n 5 "zpool status ${POOL_TARGET}; zpool list ${POOL_TARGET}"

До полного завершения операции нельзя:

  • уничтожать zvol;
  • экспортировать пул db;
  • отключать устройство;
  • перезагружать систему без необходимости.

После успешного удаления проверяем, что в пуле остался только исходный vdev:

zpool status -P "${POOL_TARGET}"

В конфигурации должен снова отображаться только sdd1.

Удаление временного zvol

Только после успешного завершения zpool remove можно уничтожить zvol:

zfs destroy "${ZVOL_DATASET}"

Финальная проверка:

zpool status "${POOL_TARGET}"
zpool list "${POOL_TARGET}"
zfs list "${POOL_SOURCE}" "${POOL_TARGET}"

В терминале Linux пропал текст? Верните echo

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

Вернуть его можно одной командой:

stty echo

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

Обычно echo отключается после некорректно завершившейся программы, которая временно скрывала ввод — например, при запросе пароля. Если терминал выглядит совсем странно, можно выполнить более радикальный сброс:

stty sane

Скучная банальность, но именно такие мелочи особенно приятно случайно узнать после нескольких минут печати в пустоту.

S.T.A.L.K.E.R. 2: Cost of Hope — Between Duty And Freedom Story Trailer

Помню свои воспоминания 19-летней давности, когда первый раз выходил на Кордон. Тогда всё воспринималось чутка проще, и тот факт, что сюжетно далёкая уже SoC была абсолютно линейной комедией про «зачисть все вышки лаборатории, ни разу не смущало.

Теперь же — и сюжет, и постановка, и какие-никакие — но характеры. Ждём-с.

 30   2 мес   stalker 2   youtube   игры

Transportna — Театр твого розуму

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

 32   3 мес   AI   Transportna   youtube   музыка

Clash Verge Rev Local Tunnel

Получив намедни на локальной станции отвал сразу нескольких утилит, которые умеют пробрасывать трафик через TUN-режим, я пошёл искать альтернативы. В итоге нашлась Clash Verge:
https://github.com/clash-verge-rev/clash-verge-rev

Задача простая: завернуть трафик через TUN в локальный прокси.

Идём по пути:

Профили -> Новый -> Local -> Выбираем файл

Дальше скармливаем Clash Verge YAML-конфиг:

mixed-port: 7890
allow-lan: false
mode: global
log-level: info
ipv6: false

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  strict-route: true
  dns-hijack:
    - any:53
    - tcp://any:53

dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  listen: 127.0.0.1:1053
  default-nameserver:
    - 1.1.1.1
    - 8.8.8.8
  nameserver:
    - 1.1.1.1
    - 8.8.8.8
  fake-ip-filter:
    - "*.lan"
    - "*.local"
    - "localhost"

proxies:
  - name: lan-socks5
    type: socks5
    server: %IP прокси%
    port: %порт прокси%
    udp: true

proxy-groups:
  - name: PROXY
    type: select
    proxies:
      - lan-socks5
      - DIRECT

rules:
  - IP-CIDR,%IP прокси%/32,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - MATCH,PROXY

После этого можно на главной включать Tun.
В результате весь трафик, кроме локальных сетей и самого прокси-сервера, будет заворачиваться через указанный SOCKS5-прокси. Локальные диапазоны оставлены в DIRECT, чтобы не словить прекрасный цирк с недоступными локальными ресурсами, роутерами, NAS и прочими домашними зверушками.

CLUTCH // Official Announce Trailer

Кто бы что не говорил — графика за 22 года шагнула вперёд. Вспоминается 2004-ый год и синематик-вставки Driv3r.
Где в одном announce trailer-e графики больше, чем во всех похождениях Таннера.

 30   3 мес   Clutch   trailer   youtube   игры

Прогулка по Академу, благоустройство и (пост)советская срань

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

Итог: идея сама по себе симпатичная — прогулочная дорожка по бывшей ЖД ветке. Но реализация выглядит как >“положим плитку между рельсами, а физику попросим не вмешиваться”. Физика, как обычно, пришла без >приглашения.

А по факту это выглядит как “оставить археологию, прикрыть самые страшные дырки и ждать, пока пешеходы >сами выберут траекторию”. То есть не тротуар, а полоса препятствий с юридическим статусом благоустройства.

Эта парковка — почти учебное пособие по матанализу, только с выбоинами и чувством безысходности.
Экстремум здесь можно объяснять так:
Представим, что высота/глубина покрытия — это функция f(x, y), где x и y — координаты на парковке.
Локальный минимум — яма. Вокруг неё поверхность выше, а в самой точке ниже всего. Колесо туда радостно >проваливается.
Локальный максимум — бугор или наплыв асфальта. Рядом ниже, а в этой точке выше.
Глобальный минимум — самая глубокая яма на всей парковке.
Глобальный максимум — самая высокая кочка/наплыв на всей парковке.
То есть парковка становится графиком функции рельефа:
f(x, y) = высота асфальта в точке.

Cходимость можно объяснять ещё вкуснее.
Например, машина едет по парковке и пытается найти “самое плохое место” — самую глубокую яму. Каждый следующий манёвр приближает её к яме:
x1 -> x2 -> x3 -> ... -> x*
Если координаты машины всё ближе к одной точке x*, то траектория сходится.
Если она мечется между ямами, объезжает бугры, попадает в колею и не приходит никуда — не сходится.

Градиентный спуск:
“Идём туда, где поверхность убывает быстрее всего”. На нормальной математической картинке это поиск >минимума функции. На этой парковке — поиск места, где подвеска скажет последнее слово.

Локальный минимум против глобального:
Машина может застрять в одной небольшой яме и “решить”, что хуже уже некуда. Но через три метра может >быть настоящая бездна. Это классическая проблема: алгоритм нашёл локальный минимум, но не факт, что >глобальный.

Сходимость с плохим шагом:
Если ехать слишком резко — перескочишь через яму. Если слишком мелко — будешь вечность ползти по >трещинам. Это аналог выбора шага в итерационном методе.

Приращение — это когда было значение функции f(x), а потом мы чуть-чуть сдвинулись по дороге на Δx и >получили новое значение:
Δf = f(x + Δx) — f(x)
На нормальном графике это “насколько изменилась функция”.
На этой дороге это: насколько глубже стало колесо после следующих 30 сантиметров движения.

Евклидова модель:
“Есть дорожка шириной N метров, идём прямо”.

Реальная модель:
“Пространство искривлено дефектами покрытия, влажностью, деревьями, уклоном и вероятностью подвернуть >ногу”.

Оптимизация пешеходного потока в условиях провала институционального обслуживания и нестационарной грязевой метрики

Stellar Blade Blood Rain Reveal Trailer

Корейцы продолжают быть хранителями жанра игр с красивыми женскими персонажами. Ждём-с.

ID Docker контейнеров — максимальных потребителей SWAP в Linux

for pid in $(ls /proc | grep -E '^[0-9]+$'); do     swap=$(grep VmSwap /proc/$pid/status 2>/dev/null | awk '{print $2}');          if [[ -n "$swap" && "$swap" -gt 0 ]]; then         cmd=$(tr '\0' ' ' < /proc/$pid/cmdline);          cgroup=$(cat /proc/$pid/cgroup 2>/dev/null);
        container_id=$(echo "$cgroup" | grep -Eo '[a-f0-9]{64}' | head -n1);
        if [[ -z "$container_id" ]]; then             container_id=$(echo "$cgroup" | grep -Eo 'docker-[a-f0-9]+' | sed 's/docker-//' | head -n1);         fi;          echo -e "$swap KB\tPID: $pid\tCID: ${container_id:-host}\tCMD: $cmd";     fi; done | sort -nr | head

Mujuice — Как Пережить Расставание в Цифровую Эпоху™

Муджус 2011 года — это оптимистичная психоделика.
// Скорость, цветы, электричество, юность
Это безумный оптимизм.
// Может физика жестока,
// только химия права.
Это надежда.
// Значит, нам остаётся ждать весны.
Муджус 2026 года устал — и стал петь о жизненном.
Прямо в душу.

 26   4 мес   Mujuice   youtube   музыка
Ранее Ctrl + ↓