release: 2026-03-29-213722

This commit is contained in:
He4eT 2026-03-29 21:37:22 +02:00
commit 3e70df61c0
75 changed files with 6393 additions and 0 deletions

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta
name="description"
content="Redirect to '/posts/#2020'.">
<meta
http-equiv="Refresh"
content="0; URL=/posts/#2020">
<title>
Redirect | oddsquat
</title>
</head>
<body>
<main>
Redirect to
<a
style="color: inherit;"
href="/posts/#2020">
/posts/#2020
</a>
</main>
</body>
</html>

View file

@ -0,0 +1,123 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<title>
initial post | oddsquat
</title>
<meta name="description" content="Первый пост в этом фэнзине, рассказывающий о его внутреннем устойстве.">
<link rel="preload" href="/fonts/open_sans_condensed-32.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans_condensed-27.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-25.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-24.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-17.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" type="text/css" href="/css/fonts.css">
<link rel="stylesheet" type="text/css" href="/css/typography.css">
<link rel="stylesheet" type="text/css" href="/css/main.css">
</head>
<body>
<div class="stripesContainer">
<div class="stripes">
</div>
</div>
<header>
<nav>
<ul>
<li><a href="/">oddsquat</a></li>
<li><a href="/posts/">
posts</a></li>
<li><a href="/posts/#2020">
2020</a></li>
<li>initial post</li>
</ul>
</nav>
</header>
<main>
<article>
<h1 id="initial-post">Initial Post</h1>
<p><strong>Oddsquat</strong>&nbsp;— мой маленький личный фэнзин про эксперименты, код и&nbsp;прочий киберпанк. Обычно такие сайты называются блогами, но&nbsp;в&nbsp;слове «фэнзин» есть приятный отголосок панк-культуры и&nbsp;её&nbsp;неотъемлемой DIY-составляющей.</p>
<p>Основные причины, побудившие меня на&nbsp;создание своего уютного куска интернета:</p>
<ul>
<li>Хочется писать буквы, а&nbsp;возвращаться в&nbsp;ЖЖ&nbsp;не&nbsp;хочется.</li>
<li>Фронтендер без портфолио&nbsp;— подозрительный фронтендер.</li>
<li>Современный веб&nbsp;— памятник оверинженирингу. Лендинг с&nbsp;двумя абзацами текста, тремя картинками и&nbsp;мегабайтным бандлом из&nbsp;модных библиотек&nbsp;— одновременно безумие и&nbsp;норма в&nbsp;текущих реалиях. Мне больно на&nbsp;это смотреть, поэтому пришлось строить себе персональный оазис.</li>
</ul>
<p>В&nbsp;первом посте хочется рассказать, какие инструменты были использованы для создания этого сайта, какие решения были приняты и&nbsp;почему.</p>
<h2 id="-">Название</h2>
<p>Я&nbsp;вырос в&nbsp;девяностые, поэтому квикимобиль, бэтпещера и&nbsp;пузиблинчики для меня не&nbsp;пустой звук, а&nbsp;образец системы нейминга. Вот, например, у&nbsp;меня есть <a href="https://github.com/He4eT/oddkb" target="_blank">oddkb</a>.</p>
<p>Свою квартиру с&nbsp;момента заселения я&nbsp;называю oddsquat (даже локация в&nbsp;Foursquare была), так пусть теперь и&nbsp;мой форпост в&nbsp;сети называется так же.</p>
<p>Назвал сайт в&nbsp;честь SSID домашнего Wi-Fi, потому что не&nbsp;смог придумать более достойного названия :)</p>
<h2 id="-">Платформа</h2>
<p>Для статического сайта не&nbsp;нужен серверный код, поэтому WordPress и&nbsp;прочие CMS в&nbsp;качестве платформы я&nbsp;даже не&nbsp;рассматривал.</p>
<p>Про генераторы статических сайтов раньше слышал, но&nbsp;подробно не&nbsp;изучал. Их&nbsp;оказалось так много (тут есть <a href="https://jamstack.org/generators/">длинный список</a>), что даже страшно.</p>
<p>Посмотрев на&nbsp;самые популярные решения, я&nbsp;понял, что как-то неправильно понимаю значение термина «генератор статических сайтов», потому что все хором предлагают мне сгенерировать Progressive Web Application из&nbsp;React-компонентов с&nbsp;импортом данных из&nbsp;GraphQL-сервера вместо россыпи HTML-документов.</p>
<p>Уверен, что уютный бложик&nbsp;— это точно не&nbsp;Web&nbsp;Application, а&nbsp;от&nbsp;Progressive&nbsp;в&nbsp;данном случае всем будет только хуже: искусственные трудности с&nbsp;роутингом, серверным рендерингом и&nbsp;сохранением позиции скрола успешно решены, когда каждая страница&nbsp;— это отдельный документ. Браузеры восхитительно умеют работать с&nbsp;HTML-документами!</p>
<p>После непродолжительных поисков был найден <a href="https://doug2k1.github.io/nanogen/">Nanogen</a>, который делает именно то, что нужно, и&nbsp;не&nbsp;похож на&nbsp;космический корабль:</p>
<ul>
<li>Умеет Markdown и&nbsp;HTML (ejs);</li>
<li>Имеет очень гибкую систему шаблонов;</li>
<li>Не&nbsp;выходит за&nbsp;рамки стека Node.js.</li>
</ul>
<p>Да, в&nbsp;репозитории проекта давно не&nbsp;было коммитов, но&nbsp;хочется думать, что это по&nbsp;причине надёжности и&nbsp;закончености :)</p>
<h2 id="-">Типографика</h2>
<p>Я&nbsp;люблю текст и&nbsp;не&nbsp;умею в&nbsp;дизайн. Oddsquat&nbsp;— проект про буквы, значит, буквы должны быть красивыми и&nbsp;удобными.</p>
<p>К&nbsp;теме типографики в&nbsp;вебе я&nbsp;подходил несколько раз, но&nbsp;безуспешно. Не&nbsp;получается структурировать и&nbsp;сохранить в&nbsp;голове все эти сакральные знания про кернинг и&nbsp;засечки, потому что не&nbsp;вижу никакой связи между теорией и&nbsp;практикой.</p>
<p>Очередное погружение системных знаний опять не&nbsp;принесло, зато принесло удобный инструмент: <a href="https://github.com/KyleAMathews/typography.js">Typography.js</a>.</p>
<p>Этот тулкит позволяет, покрутив ручки <a href="http://kyleamathews.github.io/typography.js/">интерактивного демо</a>, получить новое, но&nbsp;при этом гармоничное сочетание абзацев, заголовков и&nbsp;отступов между ними.
Идеальный инструмент для тех, кто хочет поиграть со&nbsp;шрифтами, но&nbsp;не&nbsp;до&nbsp;конца понимает, как.</p>
<p>Авторы настолько заботливые, что даже подключают <code>normalize.css</code> при генерации своих стилей, снимая с&nbsp;вас ещё одну головную боль. Благодаря им&nbsp;весь мой дополнительный css для стилизации сайта уложился в&nbsp;сто строк кода и&nbsp;хорошо работает в&nbsp;любых браузерах и&nbsp;на&nbsp;любых экранах.</p>
<p>Со&nbsp;шрифтами всё просто:</p>
<ul>
<li><strong>Open Sans</strong> для текста и&nbsp;<strong>Open Sans Condensed</strong> для заголовков, потому что мне нравится слово «Open»;</li>
<li><strong>Fira Code</strong> для кода, потому что лигатуры (<code>--&gt;</code>, <code>!==</code>)&nbsp;— это красиво.</li>
</ul>
<h2 id="-">Аналитика</h2>
<p>Я&nbsp;долго думал, можно&nbsp;ли собирать аналитику просмотров, или нужно играть в&nbsp;идеальный веб до&nbsp;конца и&nbsp;полностью отказаться от&nbsp;слежки за&nbsp;пользователями. С&nbsp;одной стороны высокая идея, с&nbsp;другой&nbsp;— любопытство.</p>
<p>После непродолжительного исследования пришёл к&nbsp;выводу, что Метрика и&nbsp;Аналитика от&nbsp;поисковых гигантов мне точно не&nbsp;подходят, а&nbsp;вот автор <a href="https://goatcounter.com/">GoatCounter</a> полностью понимает мою боль.</p>
<p><a href="https://www.goatcounter.com/why/">Why I&nbsp;made GoatCounter</a>&nbsp;— отличный пост, где создатель сервиса ответил на&nbsp;все вопросы, которые у&nbsp;меня к&nbsp;нему возникли. Вот, например, замечательный абзац про причины бесплатности начального тарифа:</p>
<blockquote>
<p>I&nbsp;think its important to&nbsp;make the barrier of&nbsp;entry for software like this low as&nbsp;feasible to&nbsp;make actual meaningful inroads to&nbsp;“de-Google-fi” the internet a&nbsp;bit, and make pervasive tracking less common. Making it&nbsp;freely available (for personal use) is&nbsp;part of&nbsp;that.</p>
</blockquote>
<h2 id="-">Содержание</h2>
<p>Самое главное. С&nbsp;формой и&nbsp;техническими вопросами всё ясно, но&nbsp;что&nbsp;же я&nbsp;буду складывать внутрь? Пока план такой:</p>
<ul>
<li>Я&nbsp;довольно часто изучаю штуки из&nbsp;разных областей и&nbsp;хочу описывать эти опыты. Вот, например, описал создание легковесного сайта.</li>
<li>Мне нравится настраивать инструменты и&nbsp;рассказывать об&nbsp;этом.</li>
<li>Есть несколько почтовых рассылок, которые я&nbsp;очень хочу начать переводить, чтобы начать читать.</li>
</ul>
<p>Признаюсь, что был очарован сайтом от&nbsp;ребят из&nbsp;команды <a href="https://100r.co/site/home.html">Hundred Rabbits</a> и&nbsp;захотел такое&nbsp;же, только своё.</p>
<p>Stay tuned!</p>
</article>
</main>
<footer>
2020-11-08
</footer>
<script async
data-goatcounter="https://he4et.goatcounter.com/count"
src="https://gc.zgo.at/count.js"></script>
</body>
</html>

View file

@ -0,0 +1,109 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<title>
typographic linter | oddsquat
</title>
<meta name="description" content="Prettier для текста. Автоматизация рутинной типографики.">
<link rel="preload" href="/fonts/open_sans_condensed-32.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans_condensed-27.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-25.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-24.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/open_sans-17.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" type="text/css" href="/css/fonts.css">
<link rel="stylesheet" type="text/css" href="/css/typography.css">
<link rel="stylesheet" type="text/css" href="/css/main.css">
</head>
<body>
<div class="stripesContainer">
<div class="stripes">
</div>
</div>
<header>
<nav>
<ul>
<li><a href="/">oddsquat</a></li>
<li><a href="/posts/">
posts</a></li>
<li><a href="/posts/#2020">
2020</a></li>
<li>typographic linter</li>
</ul>
</nav>
</header>
<main>
<article>
<h1 id="-code-style">Типографика как code style</h1>
<h2 id="-">Основы</h2>
<p>Для того, чтобы тексты было удобно читать и&nbsp;неудобно писать, человечество придумало разные правила. С&nbsp;орфографией и&nbsp;пунктуацией всё понятно, но&nbsp;про типографические правила говорят редко.</p>
<p>Типографика&nbsp;— набор правил вёрстки текста, призванных повысить эстетику и&nbsp;читаемость. Именно в&nbsp;таком порядке, потому что люди сначала замечают текст и&nbsp;только потом начинают читать.</p>
<p>Про шрифты, отступы и&nbsp;прочие кернинги в&nbsp;этот раз говорить не&nbsp;будем, потому что мне понравилось крутить ползунки в&nbsp;<a href="https://github.com/KyleAMathews/typography.js">Typography.js</a> и&nbsp;не&nbsp;переживать об&nbsp;эстетике.</p>
<p>Разговор пойдёт про висячие предлоги и&nbsp;прочие тире с&nbsp;кавычками.</p>
<h2 id="-">Проблематика</h2>
<p>Сайты в&nbsp;интернете делятся на&nbsp;два типа: те, кто запаривается за&nbsp;подготовку текстов, и&nbsp;те, кто забивает. <a href="https://meduza.io/">Meduza.io</a> расставляет неразрывные пробелы в&nbsp;текстах новостей, а&nbsp;<a href="https://www.rbc.ru/">rbc.ru</a>&nbsp;— нет. Это не&nbsp;единственное отличие этих новостных порталов, но&nbsp;очень знаковое, как мне кажется.</p>
<h3 id="-">Нужно забить!</h3>
<p>Я&nbsp;прекрасно понимаю тех, кто не&nbsp;запаривается. Часть не&nbsp;знает, часть забивает (<a href="https://vas3k.ru/">Вастрик</a>, например), а&nbsp;у&nbsp;остальных user-generated content, который довольно рискованно автоматически форматировать. Аргументы для каждой группы:</p>
<ul>
<li>И&nbsp;так всё понятно.</li>
<li>Условный Markdown со&nbsp;спецсимволами теряет половину обаяния.</li>
<li>Правильные автоматические кавычки-ёлочки не&nbsp;сделают из&nbsp;комментария в&nbsp;Facebook литературный памятник, зато случайный японский эмотикон может разрушить цивилизацию: <br>
<code>Прости ^_^&quot; Забыл купить &quot;Доширак&quot;</code> превращается в&nbsp;<br>
<code>Прости ^_^« Мы испортили »Твой текст«</code>.</li>
<li>У&nbsp;студентов должен быть отдельный курс по&nbsp;расшифровке смайликов и&nbsp;компилированию C++ из&nbsp;чатов. Бонусный аргумент.</li>
</ul>
<h3 id="-">Нужно запариться!</h3>
<p>Википедия утверждает, что <a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0">типографика</a>&nbsp;— это «свод строгих правил», но&nbsp;список не&nbsp;показывает и&nbsp;ссылок не&nbsp;даёт. Стандартом де-факто в&nbsp;рунете являются правила из&nbsp;<a href="https://www.artlebedev.ru/kovodstvo/sections/62/">§&nbsp;62&nbsp;«Ководства»</a>. С&nbsp;ними или соглашаются, или <a href="https://medium.com/@kapanaga/62-6c664105dd30">громко спорят с&nbsp;некоторыми</a>.</p>
<p>Пусть мне и&nbsp;не&nbsp;нравится полное отсутствие у&nbsp;Лебедева обоснований или ссылок на&nbsp;источники, но&nbsp;самому погружаться в&nbsp;историю вопроса и&nbsp;читать какой-нибудь авторитетный <a href="https://www.artlebedev.ru/izdal/spravochnik-izdatelya-i-avtora-2017/">«Справочник издателя и&nbsp;автора»</a> страшно: в&nbsp;нём 1010&nbsp;страниц.</p>
<p>Авторы, которые хотят радовать читателей с&nbsp;помощью тире, обычно не&nbsp;пишут в&nbsp;блокноте (мне так кажется) или носят свои тексты из&nbsp;блокнота в&nbsp;<a href="https://www.artlebedev.ru/typograf/">Типограф</a> от&nbsp;Артемия Лебедева, а&nbsp;потом назад. Про первых я&nbsp;ничего не&nbsp;знаю, а&nbsp;ко&nbsp;вторым сам отношусь, когда нужно причесать один или два текста.</p>
<p>У&nbsp;Типографа и&nbsp;аналогичных веб-сервисов есть фундаментальные проблемы:</p>
<ul>
<li>Копировать текст из&nbsp;редактора в&nbsp;браузер, а&nbsp;потом назад&nbsp;— неудобно.</li>
<li>Сервис может быть офлайн в&nbsp;неподходящий момент, я&nbsp;тоже.</li>
<li>Сервис может читать мои тексты до&nbsp;публикации.</li>
<li>Некоторые тексты никому нельзя показывать (по&nbsp;разным причинам).</li>
</ul>
<p>Признаюсь, что раньше я&nbsp;ни&nbsp;разу не&nbsp;думал об&nbsp;использовании типографа вне браузера, но&nbsp;как только образовалась перспектива заниматься этим на&nbsp;постоянной основе, стало понятно, что копировать текст из&nbsp;редактора в&nbsp;браузер и&nbsp;назад&nbsp;— не&nbsp;самое оптимальное решение и&nbsp;нужно что-то с&nbsp;этим делать.</p>
<h2 id="-">Решение</h2>
<p>Очевидный вариант&nbsp;— научить текстовый редактор автоматически расставлять неразрывные пробелы, исправлять мелкие опечатки, приводить кавычки к&nbsp;правильному виду, заменять дефисы на&nbsp;тире в&nbsp;нужных местах и&nbsp;многое другое. <br>
Вот <a href="https://marketplace.visualstudio.com/items?itemName=rusnasonov.vscode-typograf">плагин для VS&nbsp;Code</a>.</p>
<p>Мне больше нравится другой подход. Мы&nbsp;уже давно используем линтеры для языков программирования, давайте использовать их&nbsp;и&nbsp;для контента.</p>
<p>Конечно, я&nbsp;не&nbsp;первый, кто так подумал. Плагин выше построен на&nbsp;основе замечательной библиотеки <a href="https://github.com/typograf/typograf">typograf</a> и&nbsp;прямо в&nbsp;README.md файле этого проекта можно найти ссылки на&nbsp;плагины для Babel, Gulp и&nbsp;Grunt.</p>
<p>Библиотека очень гибко настраивается, содержит <a href="https://github.com/typograf/typograf/blob/dev/docs/RULES.ru.md">сотню готовых правил</a> и&nbsp;позволяет легко добавлять кастомные.</p>
<p>В&nbsp;комплекте есть cli-утилита, которая умеет читать файлы, форматировать их&nbsp;и&nbsp;выводить результат в&nbsp;терминал, но&nbsp;почему-то не&nbsp;умеет файл перезаписывать. Поэтому для своих целей я&nbsp;написал небольшой скрипт, который, получив локаль и&nbsp;имя файла, изменяет его содержимое. С&nbsp;правилами тоже пришлось немного поиграть, потому что дефолтные принимают списки за&nbsp;диалоги и&nbsp;ломают markdown-разметку.</p>
<p>Теперь для расстановки всех хитрых значков не&nbsp;нужно ходить в&nbsp;браузер, достаточно просто запустить скрипт, посмотреть с&nbsp;помощью <code>git diff</code> на&nbsp;результат и&nbsp;закоммитить нужные изменения.</p>
<p>Красивые тексты лучше некрасивых.</p>
</article>
</main>
<footer>
2020-11-18
</footer>
<script async
data-goatcounter="https://he4et.goatcounter.com/count"
src="https://gc.zgo.at/count.js"></script>
</body>
</html>