Default Nano as crontab editor
Чтобы `crontab -e` открывался в `nano`, добавить в профиль пользователя:
printf '\nexport EDITOR=nano\nexport VISUAL=nano\n' >> ~/.profile && . ~/.profile
Заметки ITшника обо всём
Чтобы `crontab -e` открывался в `nano`, добавить в профиль пользователя:
printf '\nexport EDITOR=nano\nexport VISUAL=nano\n' >> ~/.profile && . ~/.profileПорефлексировал на свой опыт странного, чудного, местами отвратительного и неприятного 2026 года. Кто-то скажет, что галимый нейрослоп — пусть так.
Я здесь никто. То есть формально — турист.
Практически — уже хожу без карты и лишних вопросов.Выхожу из подъезда — и город как будто
Подсовывает мне декорации прошлого,
Только прошлого этого не было будто,
Но мозг говорит: «Да ладно, всё знакомо же».Вот панельный квартал, вот балконы, антенны,
Вот собака без повода лает на двор.
Я уверен почти, что бывал здесь когда-то,
Хоть биография против — и паспорт не врёт.Я не рос здесь.
Не ездил отсюда до школы.
Не курил за гаражом.
Не сбивал здесь коленки.Но почему этот двор вызывает приколы
Моей памяти, которой здесь нет по определению?И язык — как сосед через тонкую стену:
Вроде смысл различаешь, но путаешь слова.
Я киваю кассиру уверенно, степенно,
А потом понимаю, что понял едва.И самое странное — это не быть чужим.
Самое странное — слишком быстро перестать им быть.
Я опять называю «домой»
Комнату, снятую ровно на десять ночей.
Город, ты что-то не то
Делаешь с памятью взрослых людей.Я тебя не любил,
Я тебя не терял,
Мне по правилам нечего здесь вспоминать.Но если завтра уеду —
Почему мне уже
Будет чего не хватать?Нови-Београд — это бетонный архив,
Где эпоха хранится без даты создания.
Каждый дом говорит: «Я функционально красив»,
И прекрасно обходится без оправдания.А потом — стекляшки, реклама, фасады,
Будто город решил отыграть новый патч.
Там внизу у реки дорогие квадраты,
А здесь сохнет бельё и по телеку матч.Пекарня.
Кофе.
Ещё пекарня.Рай, если есть, пахнет свежим тестом.
Я запомнил дорогу быстрее, чем имя хозяина,
То есть начал уже обрастать контекстом.Вот автобус.
Вот рынок.
Вот нужная дверь.
Вот кафе, где не спрашиваю меню.Человек — удивительно странный зверь:
Дай неделю — он скажет пространству «люблю».Хотя нет.
Это слово пока слишком громкое.Лучше так:
«Мне удобно».
«Привык».
«Нормально».Так обычно и начинается самое стрёмное:
То, что было временным, вдруг становится своим.Я опять называю «домой»
Комнату, снятую ровно на десять ночей.
Город, ты что-то не то
Делаешь с памятью взрослых людей.Я тебя не любил,
Я тебя не терял,
Мне по правилам нечего здесь вспоминать.Но если завтра уеду —
Почему мне уже
Будет чего не хватать?Вечером Сава становится чёрным экраном,
По которому город пускает огни.
Самолёт над рекой проплывает упрямо,
Напоминая: отъезд впереди.И смешно:
я приехал смотреть на чужое,
Фотографировать стены, мосты и еду,
А теперь нахожу здесь знакомые черты,
Будто город чужой, а привычки — мои.Может, родина — то, что назначили сверху.
Может, дом — это то, что находишь сам.
Это точка, где ты перестал быть экскурсией,
Где чужое пространство становится «нам».Где ты больше не ищешь маршрут в телефоне.
Где привычно ворчишь: «Ну опять этот дождь».
Где случайно услышишь знакомое слово
И внезапно поймёшь, что уже не уйдёшь —Не физически.
Нет.
Самолёт по расписанию.
Чемодан.
Регистрация.
Выход.
Контроль.Просто город останется где-то в сознании
Незаконной пропиской с пометкой «чужой».Мы называем своим то, что выдали при рождении.
Улицу.
Страну.
Язык.Как будто сам выбирал точку входа и стартовый набор.
Хотя ты просто появился — а вокруг уже всё было подписано:
«Вот это твоё».А потом приезжаешь туда,
где никогда раньше не был,и через несколько дней ловишь себя на фразе:
«Сегодня поздно. Пойдём домой».
И вот тут становится непонятно:
если первое назначили,
а второе ты выбрал сам —что из этого на самом деле твоё?
Я опять называю «домой»
Комнату, ключ от которой оставлю с утра.
Город, мы оба поймём:
Эта игра оказалась немного не игра.Я тебя не любил,
Я тебя не терял,
Но теперь почему-то приходится лгать:«Я всего лишь турист.
Мне пора уезжать.
Мне здесь нечего вспоминать».Мне здесь нечего вспоминать.
Так почему я уже вспоминаю?
Laku noć, Beograde.
Неожиданно для себя открыл коммерческую генеративную модель для музыки — Suno.
Если к доступным генераторам картинок и видео у меня по-прежнему есть вопросы — получить нестилизованное изображение, которое не вызывает у восприятия ощущения «здесь что-то не так», всё ещё довольно нетривиальная задача; главная страница Civitai тому регулярно служит наглядным подтверждением, — то с музыкой всё оказалось несколько интереснее.
Музыка в этом смысле куда более схематична и формализуема: Shazam с алгоритмическим анализом музыки в привычном нам виде существует уже добрых полтора десятка лет, а инструменты вроде автотюна, способные вытащить даже весьма безнадёжный вокал, появились тоже далеко не вчера. Поэтому сама идея машины, которая не только разбирает музыку на составляющие, но и собирает их обратно, уже не кажется чем-то совершенно инопланетным.
Но реальность, как обычно, прозаичнее рекламных роликов.
Кнопки «сделать шедевр» там нет.
Есть набор базовых голосов. Есть генератор лирики, который никакой особой магии не делает. Есть возможность описать стиль, инструменты, характер вокала, темп, динамику и структуру композиции. А дальше внезапно выясняется, что всем этим ещё нужно уметь пользоваться.
Нужно возиться с текстовкой: переписывать строки, считать слоги, следить за ритмом и за тем, как слова вообще ложатся на музыку. Нужно расставлять ударения там, где модель упорно слышит их по-своему. Нужно понимать, какие музыкальные теги дадут нужный результат, а какие превратят описание в кашу из жанров. Нужно отдельно думать про интро, куплеты, припевы, бриджи, смену динамики и то, где вокалу стоит разойтись, а где — наоборот, исчезнуть почти до шёпота.
И потом генерировать снова.
И ещё раз.
И брать удачную версию, менять две строчки и обнаруживать, что теперь модель зачем-то переписала половину аранжировки.
То есть никакой пресловутой кнопки «творчество» всё ещё не появилось. Просто возник ещё один инструмент, который очень быстро делает черновую работу и иногда неожиданно хорошо интерпретирует поставленную задачу.
Но чем конкретнее ты понимаешь, что именно хочешь услышать, тем заметнее разница между «я написал запрос нейросети» и «я действительно сделал трек».
В общем, магии не случилось.
Случился ещё один довольно мощный инструмент, который позволяет потратить три часа на то, что, по рекламе, должно было занять три минуты.
Симпатичный трейлер экшена второго эшелона, который невольно напомнил о Syndicate 2012-ого года и Sin Episodes года 2006 (где-то на этой цифре мой мозг чутка завис — как давно, оказывается, это было-то ). Фигуристая героиня, бодрая боёвка, приятная графика (спасибо UE5) — повод последить за релизом.
Не то чтобы я не припоминал случаев, когда новый контент выходил для совсем уж старых игр — успешно разрабатываемые и продающиеся DLC для Age of Empires II тому живое свидетельство. Но сделать сюжетное дополнение для игры, чьё дополнение — «Кровь и вино» — стало эталоном того, как нужно расширять игровой мир, — это как минимум смело.
Ждём, морально готовимся выделить пару месяцев на повторное прохождение.
Занятно, но Гибсон, породивший киберпанк в современном «hi tech low life» понимании, так и не удостоился экранизации «Нейроманта». По картинке — выглядит волшебно, главное чтоб не случилась история аки второй сезон Altered Carbon. Ждём января?
Всё началось с обычного белградского граффити на бетонной стене у вокзала. Дневной кадр, жёсткий свет, грязный бетон, красно-чёрная типографика, птица, странная фраза про диалектическое прожимание супротности — уже почти готовый постер, только город ещё не успел окончательно сойти с ума.
Дальше началась генеративная возня. Хотелось не просто «сделать красиво», а вытащить из исходника то, что там уже сидело: бетон, Балканы, ночной вокзал, мокрые рельсы, панельки на склоне, редкие окна, поздний транспорт и ощущение, что реальность дала трещину, но пока держится на арматуре.Добавим совершенно неприличное для Белграда полярное сияние. Не потому что так бывает, а потому что так должно было выглядеть это место в своей внутренней мифологии.
Получилась не реконструкция и не открытка. Скорее киношный арт-кадр из несуществующего фильма: где ночной поезд уходит из города, бетон помнит больше людей, чем люди друг друга, а северное сияние случайно включили над Балканами вместо правильной географии.
Мне нравится в таких генерациях момент, когда нейросеть перестаёт быть «улучшателем картинки» и становится инструментом для вытаскивания настроения. Исходная фотография была документом места. Итоговая версия стала сном об этом месте.
В общем, Прокоп как станция между городом и воображением. Поезд на Прибой отправляется. Реальность остаётся на платформе.
Иногда 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:
Чтобы не повторять изменяемые значения в командах, зададим переменные:
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.
Сначала проверяем возможность удаления:
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}"До полного завершения операции нельзя:
После успешного удаления проверяем, что в пуле остался только исходный vdev:
zpool status -P "${POOL_TARGET}"В конфигурации должен снова отображаться только sdd1.
Только после успешного завершения zpool remove можно уничтожить zvol:
zfs destroy "${ZVOL_DATASET}"Финальная проверка:
zpool status "${POOL_TARGET}"
zpool list "${POOL_TARGET}"
zfs list "${POOL_SOURCE}" "${POOL_TARGET}"Иногда терминал продолжает принимать команды, но перестаёт показывать вводимый текст. Печатаешь вслепую, нажимаешь Enter — команда выполняется. Выглядит как поломка терминала, но чаще всего просто отключён режим отображения ввода.
Вернуть его можно одной командой:
stty echoПосле этого символы снова будут отображаться при вводе.
Обычно echo отключается после некорректно завершившейся программы, которая временно скрывала ввод — например, при запросе пароля. Если терминал выглядит совсем странно, можно выполнить более радикальный сброс:
stty saneСкучная банальность, но именно такие мелочи особенно приятно случайно узнать после нескольких минут печати в пустоту.
Помню свои воспоминания 19-летней давности, когда первый раз выходил на Кордон. Тогда всё воспринималось чутка проще, и тот факт, что сюжетно далёкая уже SoC была абсолютно линейной комедией про «зачисть все вышки лаборатории, ни разу не смущало.
Теперь же — и сюжет, и постановка, и какие-никакие — но характеры. Ждём-с.
В общем-то, ничего нового — хороший инструмент в хороших, прямых руках даёт хороший результат. На первом прослушивании даже по музыкальной части и не заподозрил, что проект чисто AIшный. До чего дошёл прогресс.
Получив намедни на локальной станции отвал сразу нескольких утилит, которые умеют пробрасывать трафик через 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 и прочими домашними зверушками.
Кто бы что не говорил — графика за 22 года шагнула вперёд. Вспоминается 2004-ый год и синематик-вставки Driv3r.
Где в одном announce trailer-e графики больше, чем во всех похождениях Таннера.
Намедни прошёлся по району, преисполненному тленного советского духа и столь же тленного советского благоустройства. Игра в ассоциации: фотографируешь обычную срань и задаёшь 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 метров, идём прямо”.
Реальная модель:
“Пространство искривлено дефектами покрытия, влажностью, деревьями, уклоном и вероятностью подвернуть >ногу”.
Оптимизация пешеходного потока в условиях провала институционального обслуживания и нестационарной грязевой метрики
Корейцы продолжают быть хранителями жанра игр с красивыми женскими персонажами. Ждём-с.