<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
  <title>Шамиль Аминов</title>
  <link>https://aminov.sh</link>
  <description>Блог, проекты и любимое</description>
  <language>ru</language>
  <item>
    <title>PhoneMic</title>
    <link>https://aminov.sh/blog/phonemic</link>
    <guid isPermaLink="true">https://aminov.sh/blog/phonemic</guid>
    <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
    <description>&lt;p&gt;PhoneMic превращает Android-телефон в микрофон для Windows. Телефон слушает,
компьютер принимает звук по Wi-Fi или по USB-кабелю, а Discord, Zoom, OBS и
любая другая программа видят его как обычный микрофон. Сопряжение делается один
раз, по QR-коду, дальше это одно касание на телефоне.&lt;/p&gt;
&lt;p&gt;Похожие приложения уже есть, и подводят они обычно в двух местах: связь через
какое-то время отваливается, а чтобы её завести, надо повозиться. PhoneMic
сделан вокруг того, чтобы не делать ни того, ни другого.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/phonemic-apps-ru.webp&quot; alt=&quot;Телефон и компьютер во время передачи: одна и та же волна с двух сторон&quot; width=&quot;809&quot; height=&quot;811&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Волна — это кнопка&lt;/h2&gt;
&lt;p&gt;На экране телефона почти ничего нет. Посередине волна, и она же выключатель:
коснулся — микрофон включился, коснулся ещё раз — выключился. На телефоне волна
дышит голосом, а в окне на компьютере рисуется по тому звуку, который до
компьютера действительно дошёл, — так видно, что связь жива, а не только что
телефон что-то слышит.&lt;/p&gt;
&lt;p&gt;Точка над волной говорит, что происходит: красная — микрофон выключен, жёлтая —
телефон ищет компьютер, голубая — тебя слышно. Внизу островок с сопряжённым
компьютером, типом связи и задержкой; на нём же шестерёнка с шумоподавлением и
кнопка QR, чтобы сопрячь другой компьютер.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/phonemic-states-ru.webp&quot; alt=&quot;Выключен, подключение, в эфире: волна из тусклой нити становится лентой&quot; width=&quot;1334&quot; height=&quot;892&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Волна — не анимация из файла, а одна закрученная лента из тридцати четырёх
тонких линий. Каждая линия смешивает две формы волны, &lt;code&gt;cos θ · f(x) + sin θ · g(x)&lt;/code&gt;, и θ шагает поперёк пучка. Где обе формы проходят через ноль, линии
стягиваются в узел, в остальных местах расходятся веером — отсюда объём. Всё это
рисуется дважды, сложением цвета: широко и бледно для свечения, потом тонко и
ярко. Выключенная, лента схлопывается в тусклую нить, пока идёт подключение —
дышит.&lt;/p&gt;
&lt;p&gt;Оба приложения чисто чёрные: на OLED-экране чёрный пиксель не светится вовсе.&lt;/p&gt;
&lt;h2&gt;Две дороги&lt;/h2&gt;
&lt;p&gt;По Wi-Fi звук идёт по UDP, пакетами по 10 мс, по одному пакету на датаграмму.
По USB — по TCP через &lt;code&gt;adb reverse&lt;/code&gt;, и телефон стучится на &lt;code&gt;127.0.0.1&lt;/code&gt;. Для
кабеля хватает включённой отладки по USB: программа на компьютере сама
пробрасывает порт для каждого подключённого телефона и чинит проброс, если
какая-нибудь другая программа перезапустила adb-сервер.&lt;/p&gt;
&lt;p&gt;Телефон всегда сначала пробует кабель. Выдернул кабель — поток сразу уходит на
Wi-Fi. Вставил обратно — через несколько секунд, когда понятно, что кабель
остаётся на месте, возвращается на USB. Микрофон между этим не выключается.&lt;/p&gt;
&lt;p&gt;Компьютер в сети телефон ищет по всем адресам, которые были в QR-коде, а если
ни один не ответил — широковещательным приветствием. Роутер выдал компьютеру
новый IP — сопряжение от этого не ломается.&lt;/p&gt;
&lt;p&gt;Чтобы связь не умирала вместе с экраном, запись идёт в фоновом сервисе с
блокировками сна и Wi-Fi: Android не может ни заглушить приложение, ни усыпить
радио. Если связь всё-таки оборвалась, обе стороны поднимают её сами. Три
секунды тишины от другой стороны считаются обрывом, и телефон снова начинает
здороваться, пока не достучится.&lt;/p&gt;
&lt;p&gt;По кабелю задержка около 30 мс, по Wi-Fi — 50–100.&lt;/p&gt;
&lt;h2&gt;Буфер&lt;/h2&gt;
&lt;p&gt;Wi-Fi доставляет пакеты неровно, и вся сложность PhoneMic живёт в буфере на
компьютере, который это неровное прячет.&lt;/p&gt;
&lt;p&gt;У каждого пакета есть порядковый номер, а значит, известно, когда он пришёл бы в
идеальной сети. Самый ранний недавний приход — точка отсчёта, опоздание — на
сколько пакет от неё отстал. Точка отсчёта медленно ползёт вверх, на
полмиллисекунды в секунду: так телефон, чьи часы идут чуть медленнее
компьютерных, не принимается за растущий джиттер.&lt;/p&gt;
&lt;p&gt;Худшее опоздание буфер помнит долго, потому что сбои Wi-Fi ходят волнами, но с
потолком. Полсекундную паузу вроде сканирования сетей буфером не спрячешь, не
сделав запаздывающим каждый звонок, поэтому ей разрешено один раз щёлкнуть.&lt;/p&gt;
&lt;p&gt;Разницу между тем, сколько звука в буфере есть и сколько нужно, он добирает так,
чтобы не было слышно. Основную работу делают паузы в речи: звука лишнего — тихие
куски по 5 мс выбрасываются, не хватает — пауза растягивается на 5 мс. Сигналу
без пауз остаётся скорость воспроизведения, которую буфер подгоняет не больше
чем на 1%. Если звук всё-таки кончился, он затухает, а не обрывается щелчком.&lt;/p&gt;
&lt;p&gt;Режимов три: «Мин. задержка» на 20–40 мс для кабеля или отличного Wi-Fi,
«Баланс» по умолчанию, обычно 50–100, и «Надёжный» на 100–150 для забитой или
слабой сети.&lt;/p&gt;
&lt;h2&gt;Проверка без голоса&lt;/h2&gt;
&lt;p&gt;Протокол записан в документе вместе с точными байтами эталонных пакетов, и обе
стороны, Kotlin и C#, проверяют в тестах именно эти байты. Поменяешь формат на
одной — тесты упадут на другой.&lt;/p&gt;
&lt;p&gt;Буфер гоняется на виртуальных часах против симуляции сети: десять минут плохого
Wi-Fi с расходящимися часами проходят за несколько секунд. Для проверки всей
цепочки никому не надо говорить в микрофон: в отладочном режиме телефон играет
тон 1 кГц, а &lt;code&gt;probe&lt;/code&gt; записывает то, что выходит из виртуального кабеля, и
сообщает частоту, уровень и пропуски.&lt;/p&gt;
&lt;h2&gt;Взять себе&lt;/h2&gt;
&lt;p&gt;Windows не умеет превращать звук программы в микрофон без драйвера, поэтому
PhoneMic выводит звук в VB-Audio Virtual Cable — бесплатное виртуальное
аудиоустройство. Его второй конец, CABLE Output, и есть микрофон, который
выбирается в Discord, Zoom или OBS.&lt;/p&gt;
&lt;p&gt;Приложение &lt;a href=&quot;https://github.com/shamil-aminov/PhoneMic&quot;&gt;лежит на GitHub&lt;/a&gt; под MIT,
сборки — в &lt;a href=&quot;https://github.com/shamil-aminov/PhoneMic/releases/latest&quot;&gt;последнем релизе&lt;/a&gt;:
&lt;code&gt;.apk&lt;/code&gt; для телефона и &lt;code&gt;.exe&lt;/code&gt; для компьютера. Нужны Windows 10 или 11 с
&lt;a href=&quot;https://vb-audio.com/Cable/&quot;&gt;VB-Audio Virtual Cable&lt;/a&gt; и Android 8.0 с сервисами
Google Play — для встроенного сканера QR. Для Wi-Fi телефон и компьютер должны
быть в одной сети, для кабеля — отладка по USB на телефоне и &lt;code&gt;adb&lt;/code&gt; на
компьютере.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/phonemic-pairing-ru.webp&quot; alt=&quot;Первый запуск: телефон предлагает отсканировать QR-код, программа на компьютере его показывает&quot; width=&quot;846&quot; height=&quot;692&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ни аккаунта, ни облака, ни аналитики: звук идёт с телефона прямо на компьютер.
Шифрования нет — код в QR не даёт чужим устройствам случайно влезть в микрофон,
но от того, кто слушает сеть нарочно, не защищает. В чужой сети — кабель.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Alternate</title>
    <link>https://aminov.sh/blog/alternate</link>
    <guid isPermaLink="true">https://aminov.sh/blog/alternate</guid>
    <pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate>
    <description>&lt;p&gt;Alternate превращает Android-телефон в USB MIDI-падд для osu!. Весь экран —
одна кнопка, и каждое касание отправляет одну из двух нот, чередуя их. Один
палец выдаёт то самое попеременное нажатие двух клавиш, которое нужно для
стрима, — на скорости, недостижимой одной клавишей.&lt;/p&gt;
&lt;p&gt;Это вся идея, и больше приложение ничего не делает.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alternate-pad.webp&quot; alt=&quot;Падд в работе: серия, темп, всего касаний и шкала справа&quot; width=&quot;1600&quot; height=&quot;686&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Почему MIDI&lt;/h2&gt;
&lt;p&gt;Потому что osu!lazer понимает его нативно. Не нужен ни мост, ни драйвер, ни
утилита для переназначения клавиш: телефон появляется как MIDI-устройство, и
игра читает его как клавиатуру. Один кабель, одна галочка в настройках ввода.&lt;/p&gt;
&lt;p&gt;Обратная сторона решения — iOS. Айфон не умеет притворяться USB MIDI-устройством
вовсе; остаются Network MIDI по Wi-Fi и Bluetooth LE MIDI, а они добавляют
задержку и джиттер, которые на двухстах ударах чувствуются рукой. Логика
портировалась бы за вечер, а то единственное, ради чего приложением стоит
пользоваться, — нет.&lt;/p&gt;
&lt;h2&gt;Одно число&lt;/h2&gt;
&lt;p&gt;Всё внутри построено вокруг времени от стекла до провода.&lt;/p&gt;
&lt;p&gt;MIDI-нота уходит первой: движок определяет ноту, и байт оказывается на проводе
раньше, чем тронуто хоть одно состояние анимации. Расчёт темпа идёт потом, в
кадровом цикле. На горячем пути нет аллокаций — состояние движка это примитивные
массивы, буфер сообщения выделен один раз, пулы частиц кольцевые: нет мусора,
значит, нет паузы сборщика посреди стрима. Отправка синхронная, в потоке
касания, потому что передача записи в другой поток добавила бы к задержке
планирование и ничего не дала бы взамен.&lt;/p&gt;
&lt;p&gt;Интервалы меряются по часам самого события ввода, а не по времени обработчика:
занятый UI-поток не должен искажать темп. На Android 13+ доставка касаний
небуферизованная, и это экономит до кадра. Самый быстрый режим экрана
запрашивается на старте — больше кадров в секунду означает и более частый опрос
сенсора.&lt;/p&gt;
&lt;p&gt;Настроек ровно столько, сколько нужно, чтобы падд сошёлся с игрой и с пальцем.
Дребезг в 12 мс отсекает двойное срабатывание от переката пальца и при этом ничего
не съедает: реальный альт-тап в двадцать касаний в секунду — это период в 50 мс.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alternate-settings.webp&quot; alt=&quot;Экран настроек: дребезг, окно серии, ноты&quot; width=&quot;1600&quot; height=&quot;686&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Шкала&lt;/h2&gt;
&lt;p&gt;На падде три числа: серия, темп и всего касаний. Темп показан ещё и столбиком
ячеек, и эта шкала нарочно не линейная.&lt;/p&gt;
&lt;p&gt;Ниже ста никто не стримит, поэтому линейные 0–260 тратили бы нижнюю треть
впустую и отдавали бы несколько пикселей тому диапазону, который и решает,
пройдёшь ты карту или нет. Каждая зона получает долю шкалы по своей важности:
разогрев до 140 — первая треть, рабочий темп до 200 — вторая, всё выше делит
остаток. 220 оказывается у самого верха, и «за пределом» выглядит именно так.&lt;/p&gt;
&lt;p&gt;Шкала одноцветная. Высота и так говорит всё, а градиент поверх неё был вторым
голосом, повторяющим то же самое.&lt;/p&gt;
&lt;h2&gt;Взять себе&lt;/h2&gt;
&lt;p&gt;Приложение &lt;a href=&quot;https://github.com/shamil-aminov/alternate&quot;&gt;лежит на GitHub&lt;/a&gt; под MIT. Нужны Android 7.0 с поддержкой USB MIDI,
кабель для передачи данных — не «только зарядка» — и osu!lazer на компьютере.
Без кабеля падд тоже открывается: кнопка вместо START читается DEMO, MIDI
никуда не уходит, а пощупать ощущение можно.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alternate-connect.webp&quot; alt=&quot;Первый экран: устройство не найдено, кнопка читается DEMO&quot; width=&quot;1600&quot; height=&quot;686&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Движок, расчёт темпа и шкала лежат отдельным модулем без единого
Android-импорта. Это и есть то, что позволяет проверять интересную часть без
телефона.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Alm</title>
    <link>https://aminov.sh/blog/alm</link>
    <guid isPermaLink="true">https://aminov.sh/blog/alm</guid>
    <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
    <description>&lt;p&gt;Личное пространство в интернете я хотел давно. Смотрел на чужие личные сайты,
всегда находил это чем-то прикольным, и желание изредка всплывало — но дальше
желания не шло. Домен &lt;code&gt;aminov.sh&lt;/code&gt; я купил полгода назад и полгода держал
вхолостую.&lt;/p&gt;
&lt;p&gt;Сподвигло в итоге то, насколько это стало просто. Подписка за двадцать долларов,
Claude Code — и оно делает то, что ты просишь. Неделя вместо месяца с лишним,
который ушёл бы на «сначала разобраться». Ещё подтолкнул подкаст DHH у Лекса
Фридмана: мы живём во время, когда технология не перестаёт развиваться и
позволяет пользоваться компьютером настолько нативно, насколько это сейчас
вообще возможно.&lt;/p&gt;
&lt;p&gt;Это не первая итерация. Прошлые попытки умирали не на коде, а на вопросе «чем
это набивать».&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alm-try-1.webp&quot; alt=&quot;Первая попытка: белый лист, «Hello», градиент во весь экран&quot; width=&quot;1200&quot; height=&quot;721&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Первая была светлой, с градиентом во весь экран и двумя разделами, которым я так
и не придумал содержимого.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alm-try-2.webp&quot; alt=&quot;Вторая: чёрный экран и стена из светящихся частиц на весь экран&quot; width=&quot;1200&quot; height=&quot;708&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Вторая была ровно противоположностью тому, к чему я в итоге пришёл: чёрный экран
и стена из шестидесяти тысяч частиц на WebGL, которая шевелится сама и отзывается
на прокрутку. Красиво секунд десять, а потом замечаешь, что за ней ничего нет —
ни одного раздела, который я стал бы заполнять.&lt;/p&gt;
&lt;h2&gt;Против чего он&lt;/h2&gt;
&lt;p&gt;Меня бесит современный интернет — не крупные сайты, у них всё понятно и сделано
для людей, а мелкие. Любая утилита, которая нужна раз в месяц. Сначала на
пол-экрана вылезает «мы используем куки, подтвердите», и подтверждать я ничего не
хочу, я хочу всё отклонить. Потом реклама. Потом регистрация через гугл-аккаунт:
казалось бы, два клика, но зачем. Меня везде отслеживают и сводят мои данные
воедино, чтобы я мог удалить фон с картинки.&lt;/p&gt;
&lt;p&gt;Сайт для этого должен быть полем, куда кидаешь картинку, и картинкой без фона в
ответ. Всё.&lt;/p&gt;
&lt;p&gt;Та же история с блогерами. «Перейдите в мой телеграм-канал, купите подписку на
Boosty, подпишитесь тут и там». Канал мне нужен ровно тогда, когда он нужен, а не
постоянно в списке; чтобы посмотреть и выйти, надо подписаться, и мессенджер, где
я хотел держать личные чаты, превращается в помойку. Слишком много внимания
требуется от меня, и слишком навязчиво.&lt;/p&gt;
&lt;p&gt;Мой сайт ненавязчив. Ты можешь на него зайти, можешь не зайти. Он нигде у тебя не
сохраняется — чтобы вернуться, надо самому положить закладку, и это твоё решение,
а не моё. Он ничего не просит, ничего не считает и никогда тебя не побеспокоит.
Если это звучит как манифест — ну, в какой-то мере да.&lt;/p&gt;
&lt;p&gt;Отсюда и всё остальное: ни аналитики, ни комментариев, ни входа, ни единого
всплывающего окна. Писать на сайт некуда, потому что записывать негде: содержимое
это файлы в репозитории, сборка — папка со статикой.&lt;/p&gt;
&lt;h2&gt;Четыре раздела&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Главная&lt;/strong&gt; — приветствие. Человек попал куда-то, и за десять секунд должен
понять, кто я и зачем всё это.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Блог&lt;/strong&gt; — то, ради чего вообще заводят телеграм-канал, только на своей земле.
Markdown, файл на язык, публикация это &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Проекты&lt;/strong&gt; — витрина. Карточка ведёт не на отдельную страницу проекта, а в блог:
если я что-то сделал, о нём почти наверняка есть запись, а вторая страница про то
же самое разъедется с первой на второй правке.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Любимое&lt;/strong&gt; — фильмы, музыка, игры. Оно в первую очередь для меня: не хочется
забыть, что я это слушал и смотрел и что оно было важным. А кому интересны чужие
вкусы — открыл и посмотрел. Вкладки «всего» там нет: у постера 2:3 и конверта
1:1 разная форма, и вместе они складываются в кашу.&lt;/p&gt;
&lt;h2&gt;Как он выглядит&lt;/h2&gt;
&lt;p&gt;Дизайном я занимался непрофессионально, но занимался: шапки, обложки, макеты.
Мне нравится лаконичное, без лишних элементов. Здесь сошлись две вещи —
швейцарская типографика с постера, который мне однажды попался, и Metro UI, то
есть Windows 8 и Windows Phone. У меня даже была идея купить себе Windows Phone
как артефакт эпохи: неактуальный, но красивый. Я не копировал, а взял оттуда
визуальный язык и сделал свою версию.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/posts/alm-poster.webp&quot; alt=&quot;Плакат Yeah!Air Girona: красный прямоугольник с листом сверху, имя набрано во всю ширину внизу&quot; width=&quot;1000&quot; height=&quot;1414&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Тот самый плакат — &lt;a href=&quot;https://www.typographicposters.com/quim-marin&quot;&gt;Quim Marin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Получилось четыре кегля, два цвета и полутон. Крупный, средний, мелкий и ещё одна
ступень для подписей под кадрами — она садится раньше остальных, потому что на
телефоне подпись в семнадцать пикселей занимала три строки и ряды витрины
разъезжались по высоте. Чёрный фон, белый текст, полутон только там, где одно
подчинено другому: автор под названием карточки. Шрифт Inter — база, которая
везде, и в этом её достоинство.&lt;/p&gt;
&lt;p&gt;Иконок на сайте нет ни одной. Только слова и кегль.&lt;/p&gt;
&lt;p&gt;Из этого же следует, что активное показывается кеглем, а не цветом. Красок две,
полутон занят подчинённостью, подсветить нечем — поэтому текущий пункт просто на
ступень крупнее. Один приём и в шапке, и во вкладках.&lt;/p&gt;
&lt;p&gt;Светлая тема была, и я её убрал: не понравилась.&lt;/p&gt;
&lt;h2&gt;Шапка, на которую ушло больше всего&lt;/h2&gt;
&lt;p&gt;Казалось бы, маленький компонент. Времени на него ушло больше, чем на все
страницы вместе.&lt;/p&gt;
&lt;p&gt;На компьютере пункты набраны мелким, и тот, что под курсором, плавно вырастает.
Звучит просто, но размер двигает раскладку: пункт вырос, сдвинул соседа, сосед
уехал из-под курсора, состояние снялось, всё поехало обратно. Шапка дрожала,
пока курсор стоял на волосок от буквы. Пришлось перестать спрашивать браузер,
над чем курсор, и считать это самому.&lt;/p&gt;
&lt;p&gt;На телефоне разделы просто не помещаются. Переносить их на вторую строку я не
хотел — тогда навигация занимает четверть экрана и перестаёт читаться как ряд, —
поэтому ряд едет вбок, как панорама в Windows Phone. Ради этого на узком экране
он крупнее, а не мельче: мелким шрифтом четыре слова почти влезали, и крутить
было нечего.&lt;/p&gt;
&lt;p&gt;Ряд ещё и доворачивает себя сам: текущий раздел встаёт не у края, а шагом
внутрь, так что хвост предыдущего виден и уходит в темноту. Порядок разделов —
это карта, и по ней должно быть видно, где ты стоишь относительно соседей.&lt;/p&gt;
&lt;p&gt;А у края стоит пружина: резкий свайп упирается как в стену, и короткий отскок
делает остановку живой. На ней же нашлась самая тупая ошибка во всём проекте.
Браузер округлял два числа в разные стороны, и ряд, доехав до конца, считал, что
до края остался пиксель, — справа не работало вообще ничего. На соседнем разделе
числа сходились, и я полдня был уверен, что дело в разделе.&lt;/p&gt;
&lt;p&gt;И свайп между страницами. С телефона сайтом пользоваться приятнее, чем с
компьютера, и это тоже вышло не само.&lt;/p&gt;
&lt;h2&gt;Почему это шаблон&lt;/h2&gt;
&lt;p&gt;Я не хотел делать сайт, который годится только мне. Поэтому вышло два
репозитория: &lt;a href=&quot;https://github.com/shamil-aminov/alm&quot;&gt;шаблон лежит открыто&lt;/a&gt;, а мой
сайт — отдельная репа с моим содержимым. Всё, что делает установку твоей, собрано
в одном файле: имя, адрес, языки, разделы, виды «любимого».&lt;/p&gt;
&lt;p&gt;Второе, и для меня оно важнее: клонируешь — и получаешь работающий сайт. Девять
постов, восемь проектов, по восемь карточек на каждый вид. Не пустой каркас, а
заполненный.&lt;/p&gt;
&lt;p&gt;Это из больного. В работе постоянно вылезает одно и то же: есть продовая база и
есть локальная, которая делается сидами, и на сиды все кладут — они не
проверяются и со временем превращаются в кашу. Половина ошибок при разработке из
того, что каких-то данных просто нет. Я хотел, чтобы демо-содержимое показывало
весь сайт целиком, и чтобы на восьми карточках было видно то, чего на двух не
увидишь: прокрутку, ряды, переносы. Названия там нарочно никакие — «Проект 3»,
«Фильм 7»: имя настоящего места или человека начинает притворяться содержанием, и
его правят вместо того, чтобы заменить своим.&lt;/p&gt;
&lt;h2&gt;В итоге&lt;/h2&gt;
&lt;p&gt;Сайт я сделал для себя и результатом доволен. Гештальт закрыт: домен перестал
лежать вхолостую, есть место, которое выглядит так, как я хочу, и осталось только
его наполнять — не спрашивая ни у кого разрешения и ни от кого не завися.&lt;/p&gt;
&lt;p&gt;Может, через год у меня поменяется видение и я сделаю что-нибудь более
навороченное. Пока что мне нравится ровно так.&lt;/p&gt;
</description>
  </item>
</channel></rss>