<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
      <title>&gt; scclie://
notes</title>
      <link>https://shiza.sccl.cc</link>
      <description>All notes (full content) on &gt; scclie://
notes</description>
      <generator>Quartz -- quartz.jzhao.xyz</generator>
      <item>
    <title>Self-hosted password manager on Cloudflare Workers</title>
    <link>https://shiza.sccl.cc/en/it/Self-hosted-password-manager</link>
    <guid>https://shiza.sccl.cc/en/it/Self-hosted-password-manager</guid>
    <description><![CDATA[ <h1 id="why-tho">Why tho?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#why-tho" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Options for storing passwords:</p>
<ol>
<li>In your head - <em>good luck</em></li>
<li>In a text file - <em>sec^Wnot secure</em></li>
<li>Google Chrome / Firefox / … - <em>passwords are stored who knows where</em></li>
<li>Bitwarden / 1Password / ProtonPass - <em>fine, but you gotta pay, and data is on someone else’s servers</em></li>
<li>Your own server - <em>let’s go</em></li>
</ol>
<hr>
<h1 id="why-not-just-run-bitwarden-on-a-vps">Why not just run Bitwarden on a VPS?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#why-not-just-run-bitwarden-on-a-vps" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>You can. Bitwarden officially supports:</p>
<pre><code>docker run bitwarden/self-host
</code></pre>
<p>But:</p>
<ul>
<li>Need a VPS - $3-5/mo</li>
<li>Need Docker, need to monitor it, update it, back it up</li>
<li>For one person - kinda overkill</li>
</ul>
<p>What you actually want: free, zero maintenance, and it just works.</p>
<hr>
<h1 id="nodewarden---bitwarden-compatible-server-on-cloudflare-workers">NodeWarden - Bitwarden-compatible server on Cloudflare Workers<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#nodewarden---bitwarden-compatible-server-on-cloudflare-workers" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><img src="../../pictures/it/nodewarden.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<p><a href="https://github.com/shuaiplus/nodewarden" class="external">NodeWarden<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> is a fork of the Bitwarden server that runs directly on <strong>Cloudflare Workers</strong>.</p>
<p>So:</p>
<ul>
<li>Free (Workers - 100k req/day)</li>
<li>Zero maintenance</li>
<li>Cloudflare handles the infra</li>
<li>Database - Cloudflare D1 (free: 5 GB, 5M rows read/mo)</li>
</ul>
<p>Works with all Bitwarden clients: browser extension, mobile app, CLI.</p>
<hr>
<h1 id="setup">Setup<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#setup" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Quick steps:</p>
<ol>
<li>Fork <a href="https://github.com/shuaiplus/nodewarden" class="external">shuaiplus/nodewarden<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</li>
<li>Clone locally: <code>git clone &#x3C;your-fork> &#x26;&#x26; cd &#x3C;your-repo> &#x26;&#x26; npm install</code></li>
<li>Edit <code>wrangler.toml</code>: <code>name</code>, <code>database_name</code>, etc.</li>
<li>D1 database is auto-created on first deploy - wrangler handles it from config.</li>
<li>Add <code>JWT_SECRET</code>: Dashboard <span>→</span> your worker <span>→</span> Settings <span>→</span> Variables. Any string >=32 chars, e.g. <code>openssl rand -base64 32</code>.</li>
<li>Deploy: Cloudflare Dashboard <span>→</span> Workers &#x26; Pages <span>→</span> Create <span>→</span> Pages <span>→</span> Connect to GitHub, pick your fork. Cloudflare pulls code, builds, and deploys on every push to <code>main</code>. No GitHub Actions needed.</li>
</ol>
<p><strong>Important:</strong> Cloudflare’s free plan requires a credit card to create R2. NodeWarden has a <code>deploy:kv</code> mode that uses KV instead of R2 (for file attachments). Database is D1 either way - no card needed.</p>
<hr>
<h1 id="is-it-secure">Is it secure?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#is-it-secure" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><em>short answer: yes</em></p>
<p>Under the hood it’s standard Bitwarden end-to-end encryption:</p>
<ul>
<li>Master password <span>→</span> KDF <span>→</span> master key (symmetric, AES-256). Lives in the browser only, never leaves.</li>
<li>Master key <span>→</span> HKDF <span>→</span> encryption key - this encrypts all passwords, TOTP keys, notes. Server only sees encrypted garbage.</li>
<li>An asymmetric key pair is also generated: public key stored on the server openly, private key encrypted with the encryption key and sent to the server (needed for syncing between devices).</li>
<li>Master password <span>→</span> KDF <span>→</span> client hash - sent to the server. Server salts it again (server hash) and stores only that.</li>
<li>The server cannot decrypt the vault. At all. It has no keys - only a hash to verify your password at login.</li>
</ul>
<p>Server stores only encrypted data. Even if someone steals the database - they get useless blobs that can’t be cracked without the master key.</p>
<hr>
<h1 id="caveats">Caveats<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#caveats" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><strong>Dependency on Cloudflare &#x26; GitHub</strong></p>
<p>Cloudflare <em>theoretically</em> could modify your worker if your GitHub or CF account gets compromised.</p>
<p>How realistic is that? Depends on your paranoia level and security hygiene.</p>
<hr>
<h1 id="features">Features<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#features" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>NodeWarden supports most Bitwarden features. Here’s what’s available:</p>
<h2 id="send">Send<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#send" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Create expiring links. Text or file. Dies by time or by view count. Optional password on top. Can be revoked manually any time.</p>
<h2 id="backup-center">Backup Center<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#backup-center" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Automatic backups on a schedule. Encrypted - useless without the master password.</p>
<h2 id="totp-verification-codes">TOTP (Verification Codes)<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#totp-verification-codes" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Built-in TOTP generator. Attach to any password entry and use instead of Google Authenticator.</p>
<h2 id="passkeys">Passkeys<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#passkeys" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Replace your master password with WebAuthn. Login with fingerprint/face/PIN.</p>
<h2 id="2fa-on-login">2FA on login<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#2fa-on-login" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Two-factor auth at login. But if someone steals the database + your password, 2FA won’t help.</p>
<h2 id="api-key">API Key<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#api-key" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>For Bitwarden CLI and automation.</p>
<hr>
<h1 id="tldr">TL;DR<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#tldr" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><strong>Pros:</strong></p>
<ul>
<li>Free</li>
<li>Zero maintenance</li>
<li>E2E encryption</li>
<li>Bitwarden-compatible (any client)</li>
<li>TOTP, Send, Passkeys, 2FA, Backup Center, API Key</li>
<li>Cloud backups (WebDAV/S3)</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Depends on Cloudflare &#x26; GitHub</li>
<li>No password sharing between users (everyone sees only their own vault)</li>
</ul>
<p>Good “set and forget” option for those who don’t want to pay for Bitwarden Premium, don’t want to give Google all their passwords, and don’t want to admin a VPS.</p> ]]></description>
    <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Self-hosted менеджер паролей на Cloudflare Workers</title>
    <link>https://shiza.sccl.cc/ru/it/Self-hosted-password-manager</link>
    <guid>https://shiza.sccl.cc/ru/it/Self-hosted-password-manager</guid>
    <description><![CDATA[ <h1 id="нахуя">Нахуя?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#нахуя" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Варианты хранить пароли:</p>
<ol>
<li>В голове…</li>
<li>В текстовом файле - <em>секурно</em></li>
<li>Google Chrome / Firefox / … - <em>пароли хранятся хрен пойми у кого</em></li>
<li>Bitwarden / 1Password / ProtonPass - <em>норм, но нада платить, и данные на чужих серверах</em></li>
<li>Свой сервер - <em>имба</em></li>
</ol>
<hr>
<h1 id="почему-не-поставить-обычный-bitwarden-на-vps">Почему не поставить обычный Bitwarden на VPS?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#почему-не-поставить-обычный-bitwarden-на-vps" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Можно. Bitwarden официально можно поднять через</p>
<pre><code>docker run bitwarden/self-host
</code></pre>
<p>Но:</p>
<ul>
<li>Нада VPS - от 300-500 руб/мес</li>
<li>Нада Docker, нада следить чтоб не упало, нада обновлять, нада бэкапить</li>
<li>Для одного человека - жирнo, но круто</li>
</ul>
<p>А хочется: бесплатно, ничего не админить, и чтоб работало.</p>
<hr>
<h1 id="nodewarden---bitwarden-совместимый-сервер-на-cloudflare-workers">NodeWarden - Bitwarden-совместимый сервер на Cloudflare Workers<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#nodewarden---bitwarden-совместимый-сервер-на-cloudflare-workers" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><img src="../../pictures/it/nodewarden.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<p><a href="https://github.com/shuaiplus/nodewarden" class="external">NodeWarden<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - форк Bitwarden-сервера, который работает прямо на <strong>Cloudflare Workers</strong>.</p>
<p>То есть:</p>
<ul>
<li>Бесплатно ( Workers - 100к запросов/день )</li>
<li>Ничего не надо админить</li>
<li>Cloudflare сам апдейтит инфраструктуру</li>
<li>База данных - Cloudflare D1 (бесплатно: 5 ГБ, 5 млн строк чтения/мес)</li>
</ul>
<p>Совместим со всеми Bitwarden-клиентами: браузерное расширение, мобильное приложение, CLI.</p>
<hr>
<h1 id="разворачивание">Разворачивание<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#разворачивание" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Кратенько:</p>
<ol>
<li>Форкаешь <a href="https://github.com/shuaiplus/nodewarden" class="external">shuaiplus/nodewarden<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</li>
<li>Клонируешь локально: <code>git clone &#x3C;свой-форк> &#x26;&#x26; cd &#x3C;твоя-репа> &#x26;&#x26; npm install</code></li>
<li>Правишь <code>wrangler.toml</code>: <code>name</code>, <code>database_name</code> и т.д.</li>
<li>D1-база создаётся автоматом при первом деплое - wrangler сам поднимет <code>database_name</code> из конфига.</li>
<li>Добавляешь <code>JWT_SECRET</code>: Dashboard <span>→</span> свой воркер <span>→</span> Settings <span>→</span> Variables. Любая строка >=32 символов, например <code>openssl rand -base64 32</code>.</li>
<li>Деплой: Cloudflare Dashboard <span>→</span> Workers &#x26; Pages <span>→</span> Create <span>→</span> Pages <span>→</span> Connect to GitHub, выбираешь форк. Cloudflare сам забирает код, билдит и деплоит при каждом пуше в <code>main</code>. Билд-команда - <code>npm run build</code>, воркер деплоится вместе с Pages. Никаких GitHub Actions не нужно.</li>
</ol>
<p><strong>Важный момент:</strong> у Cloudflare бесплатный план, но чтобы создать R2 - нужна привязка карты.</p>
<p>В NodeWarden есть режим <code>deploy:kv</code>, который вместо R2 (файловые вложения) юзает KV. База данных в обоих случаях D1 - ниче привязывать ненад, фулл бесплатно. (если есть возможностость, можно и привязать пустую карту, но лимитов и так с головой)</p>
<hr>
<h1 id="это-безопасно">Это безопасно?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#это-безопасно" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><em>в целом: да</em></p>
<p>Подробнее:</p>
<p>Под капотом стандартная Bitwarden-схема end-to-end шифрования:</p>
<ul>
<li>Master password <span>→</span> KDF <span>→</span> master key (symmetric, AES-256). Живёт только в браузере, наружу не выходит никогда.</li>
<li>Master key <span>→</span> HKDF <span>→</span> encryption key - им шифруются все пароли, TOTP-ключи, заметки. Сервер видит только зашифрованный мусор.</li>
<li>Дополнительно генерится пара асимметричных ключей: public key хранится на сервере открыто, private key шифруется encryption key-ем и тоже улетает на сервер (нужен для синхра между устройствами).</li>
<li>Master password <span>→</span> KDF <span>→</span> client hash - улетает на сервер. Сервер солит его ещё раз (server hash) и хранит только его.</li>
<li>Сервер не может расшифровать vault. Вообще. У него нет ключей - только хэш для проверки пароля при логине.</li>
</ul>
<p>Сервер хранит только зашифрованные данные. Даже если базу стащат - у злоумышленника будут только бесполезные данные, которые без мастер ключа он не вскроет.</p>
<hr>
<h1 id="подводные-камни">Подводные камни<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#подводные-камни" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Есть нюансы:</p>
<p><strong>Зависмость от Cf и GitHub</strong></p>
<p>Со стороны Cloudflare <em>теоретически</em> может модифицировать твой worker, если ломанут git или сам cf.</p>
<p>Насколько это реально - вопрос к паранойе и твоей гигиене.</p>
<hr>
<h1 id="фишки">Фишки<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#фишки" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>NodeWarden поддерживает большинство фич Bitwarden. Вот чо есть:</p>
<h2 id="send">Send<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#send" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Можно создать временную ссылку.</p>
<p>Можно приложить текст или файл.</p>
<p>Сгорает по времени или по количеству открытий.</p>
<p>Поверх ссылки можно навесить пароль (опционально). В любой момент Send можно отозвать вручную.</p>
<h2 id="backup-center">Backup Center<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#backup-center" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Можно настроить автоматические бекапы по расписанию.
Бекапы шифрованные, без мастер-пароля с ними ниче не сделают.</p>
<h2 id="totp-verification-codes">TOTP (Verification Codes)<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#totp-verification-codes" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Встроенный TOTP-генератор. Можно приписать к паролю и юзать вместо условного Google Authenticator</p>
<h2 id="passkeys">Passkeys<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#passkeys" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Можно заменить мастер-пароль на ключ доступа (WebAuthn).</p>
<h2 id="2fa-на-вход">2FA на вход<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#2fa-на-вход" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Двухфакторка при логине.</p>
<p>Но если кто-то утащит базу+пароль, то 2fa уже не поможет.</p>
<h2 id="api-key">API Key<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#api-key" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Для Bitwarden CLI и автоматизации</p>
<hr>
<h1 id="заебись">Заебись?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#заебись" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><strong>Плюсы:</strong></p>
<ul>
<li>Бесплатно</li>
<li>Ничего не надо админить</li>
<li>E2E шифрование</li>
<li>Bitwarden-совместимость (любой клиент)</li>
<li>TOTP, Send, Passkeys, 2FA, Backup Center, API Key</li>
<li>Бекапы в облако (WebDAV/S3)</li>
</ul>
<p><strong>Минусы:</strong></p>
<ul>
<li>Зависимость от Cloudflare и GitHub</li>
<li>Нет шеринга паролей между юзерами (каждый видит только свой vault)</li>
</ul>
<p>Хороший вариант “по<em>вставил и забыл</em>” для тех, кто не хочет платить за Bitwarden Premium, не хочет отдавать пароли гуглу, и не хочет админить VPS.</p> ]]></description>
    <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Building Zine on Cloudflare Pages with GitHub Actions</title>
    <link>https://shiza.sccl.cc/en/it/How-to-ZINE-on-CF</link>
    <guid>https://shiza.sccl.cc/en/it/How-to-ZINE-on-CF</guid>
    <description><![CDATA[ <p><em>this article is more about my carelessness, and to some extent, stupidity</em></p>
<p>Recently I felt like moving <a href="https://sccl.cc" class="external">sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> from bloated <a href="https://astro.build" class="external">Astro<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> to <a href="https://zine-ssg.io" class="external">Zine<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Zine itself is a neat thing. Fast, written in Zig, templates in SuperHTML.
Everything builds quickly, locally it’s all smooth.</p>
<p><strong>More details in the article <a href="../../en/it/Migration-from-Astro-to-Zine" class="internal" data-slug="en/it/Migration-from-Astro-to-Zine">Migration-from-Astro-to-Zine.md</a></strong></p>
<p>But deploy - that’s a separate story.</p>
<hr>
<p>Zine is compiled into a standalone statically-linked binary. No dependencies, no runtimes - download and run. It’s not in <code>npm</code>, you can’t install it from any package manager. So you gotta deliver it to the runner somehow.</p>
<p>Options:</p>
<ul>
<li>download with curl on every build</li>
<li>commit to the repository</li>
</ul>
<p>First option is janky. Second sounds more reliable…</p>
<h1 id="stuff-it-in-the-repo">Stuff it in the repo<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#stuff-it-in-the-repo" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>First thought - just commit zine to the repo so it builds out of the box:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="bash" data-theme="github-light github-dark"><code data-language="bash" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/zine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin/zine</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin/zine</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> commit</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> remote: error: File bin/zine is 152.19 MB; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">this</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exceeds</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> GitHub's file size limit</span></span></code></pre></figure>
<p>And then you remember GitHub doesn’t allow files over 100 MB.</p>
<p><em>time to self-host git</em>
<small><em>maybe… later…</em></small><br></p>
<p>OK, rollback, pretend nothing happened. Check Zine docs - they recommend <code>kristoff-it/setup-zine@v1</code> in GitHub Actions.</p>
<h1 id="github-actions">GitHub Actions<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#github-actions" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Throw <code>kristoff-it/setup-zine@v1</code> into gh actions:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="github-light github-dark"><code data-language="yaml" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">kristoff-it/setup-zine@v1</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">v0.11.3</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">zine release</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">cloudflare/wrangler-action@v3</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    apiToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.CLOUDFLARE_API_TOKEN }}</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    accountId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.CLOUDFLARE_ACCOUNT_ID }}</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pages deploy public/ --project-name sccl-cc</span></span></code></pre></figure>
<p>Makes sense: action installs zine, zine builds, wrangler pushes to CF Pages.</p>
<p>The only secrets needed are <code>CLOUDFLARE_API_TOKEN</code> and <code>CLOUDFLARE_ACCOUNT_ID</code></p>
<p>(Permissions: <code>Account → Cloudflare Pages → Edit</code>).</p>
<hr>
<p><em>Should’ve checked the docs first, but somehow that info got lost in my quick glance.</em></p> ]]></description>
    <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>sccl.cc: Bye Astro, Hello Zig Zag Zine</title>
    <link>https://shiza.sccl.cc/en/it/Migration-from-Astro-to-Zine</link>
    <guid>https://shiza.sccl.cc/en/it/Migration-from-Astro-to-Zine</guid>
    <description><![CDATA[ <p>My site <a href="https://sccl.cc" class="external">sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> was originally built with <a href="https://astro.build" class="external">Astro<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Astro is cool and all. For quickly whipping up something pretty it’s fine, but over time it started to annoy me:</p>
<p><strong>Heavy runtime.</strong> To build a site you need Node.js, npm, <code>node_modules</code> clocking in at hundreds of megabytes. For a static site.</p>
<p><strong>Overengineered.</strong> Astro does everything: islands, SSR, endpoints, middleware. And I have a three-page business card site: contacts, projects, peripherals. Don’t need much.</p>
<h1 id="alternatives">Alternatives?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#alternatives" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>I stumbled upon <a href="https://zine-ssg.io" class="external">Zine<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Zine is an SSG written in Zig. One binary, no dependencies.</p>
<p>Templates use SuperHTML - valid HTML with templating bolted on. No <code>{{ }}</code>, no Pug/Jade. Just HTML with attributes like <code>:text</code>, <code>:if</code>, <code>:loop</code>.</p>
<p>Content uses SuperMD - extended markdown without needing to drop into HTML.</p>
<h1 id="migration-process">Migration process<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#migration-process" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Overall the migration was straightforward - rewrite layouts from Astro to SuperHTML, move existing scripts over.</p>
<p>The most annoying part is that Astro uses its fucking <code>.astro</code> files with a weird mix of JS and HTML, while SuperHTML is just HTML with extras.</p>
<h1 id="what-did-i-get">What did I get?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-did-i-get" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><strong>Speed.</strong> Build in milliseconds instead of seconds.</p>
<p><strong>Simplicity.</strong> No <code>node_modules</code>. No <code>package-lock.json</code>. No hundreds of dependencies. One binary, a content folder, a layouts folder.</p>
<p><strong>Control.</strong> I know what’s in every line of generated HTML. No hidden JS that Astro adds by default.</p>
<h1 id="downsides">Downsides?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#downsides" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Zine is in beta.</p>
<p>Documentation is sparse in places. Community is tiny. If something breaks - you’ll be the first to notice.</p>
<p>But for a personal site it’s great.</p>
<p>One binary, a couple of .smd files, one layout - and you’re done.</p>
<p>How I ended up deploying this thing is described in <a href="../../en/it/How-to-ZINE-on-CF" class="internal" data-slug="en/it/How-to-ZINE-on-CF">How-to-ZINE-on-CF.md</a>.</p> ]]></description>
    <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Билдим Zine на Cloudflare Pages с Github</title>
    <link>https://shiza.sccl.cc/ru/it/How-to-ZINE-on-CF</link>
    <guid>https://shiza.sccl.cc/ru/it/How-to-ZINE-on-CF</guid>
    <description><![CDATA[ <p><em>статья скорее о моей невнимательности, и, в какой то степени, тупости</em></p>
<p>Недавно мне приспичило перенести <a href="https://sccl.cc" class="external">sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> с жирного <a href="https://astro.build" class="external">Astro<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> на <a href="https://zine-ssg.io" class="external">Zine<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Сам Zine - прикольная штука. Быстрый, написан на Zig, шаблоны на SuperHTML.
Всё собирается быстро, локально вроде всё летает.</p>
<p><strong>Подробнее в статье <a href="../../ru/it/Migration-from-Astro-to-Zine" class="internal" data-slug="ru/it/Migration-from-Astro-to-Zine">Migration-from-Astro-to-Zine.md</a></strong></p>
<p>Но вот deploy эт отдельная история.</p>
<hr>
<p>Zine скомпилен в standalone-бинарник со статической линковкой. Никаких зависимостей и рантаймов - скачал, запустил. В <code>npm</code> его нет, из пакетных менеджеров не установишь. Значит над как-то доставлять его на раннер.</p>
<p>Мысли:</p>
<ul>
<li>качать curl-ом при каждом билде</li>
<li>закоммитить в репозиторий</li>
</ul>
<p>Первый вариант - костыль. Второй звучит надёжнее…</p>
<h1 id="пихаем-в-репу">Пихаем в репу<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#пихаем-в-репу" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Первая мысль была - закоммитить zine в репозиторий, чтоб билдилось из коробки:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="bash" data-theme="github-light github-dark"><code data-language="bash" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /tmp/zine</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin/zine</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin/zine</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> commit</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> remote: error: File bin/zine is 152.19 MB; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">this</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> exceeds</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> GitHub's file size limit</span></span></code></pre></figure>
<p>И тут вспоминается, что GitHub не пускает больше 100 МБ.</p>
<p><em>пора хостить свой git</em>
<small><em>может быть… потом…</em></small><br></p>
<p>Ок, откатываем, делаем вид, что ничего не было. Лезем в доку Zine - там рекомендуют <code>kristoff-it/setup-zine@v1</code> в GitHub Actions.</p>
<h1 id="github-actions">GitHub Actions<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#github-actions" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Пихаем <code>kristoff-it/setup-zine@v1</code> в gh actions:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="yaml" data-theme="github-light github-dark"><code data-language="yaml" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">kristoff-it/setup-zine@v1</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">v0.11.3</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">zine release</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">- </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">cloudflare/wrangler-action@v3</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    apiToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.CLOUDFLARE_API_TOKEN }}</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    accountId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.CLOUDFLARE_ACCOUNT_ID }}</span></span>
<span data-line=""><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pages deploy public/ --project-name sccl-cc</span></span></code></pre></figure>
<p>Всё логично: экшен ставит zine, zine билдит сайт, wrangler пушит на cf pages.</p>
<p>Из секретов нужны только <code>CLOUDFLARE_API_TOKEN</code> и <code>CLOUDFLARE_ACCOUNT_ID</code></p>
<p>(права <code>Account → Cloudflare Pages → Edit</code>).</p>
<hr>
<p><em>Над было смотреть доку сразу, но чет беглым взлглядом на неё эт инфа затерялась.</em></p> ]]></description>
    <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>sccl.cc: пока Astro, привет Zig Zag Zine</title>
    <link>https://shiza.sccl.cc/ru/it/Migration-from-Astro-to-Zine</link>
    <guid>https://shiza.sccl.cc/ru/it/Migration-from-Astro-to-Zine</guid>
    <description><![CDATA[ <p>Мой сайт <a href="https://sccl.cc" class="external">sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> изначально был на <a href="https://astro.build" class="external">Astro<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Astro - штука прикольная.
Для быстрого клепания чего-нить красивого неплох, но со временем он меня начал бесить:</p>
<p><strong>Тяжёлый рантайм.</strong> Чтобы собрать сайт, надо тянуть Node.js, npm, <code>node_modules</code> на сотню мегабайт. Для одной статики.</p>
<p><strong>Сложность.</strong> Astro умеет всё: острова, ssr, эндпоинты, middleware. А у меня сайтец на три страницы: контакты, проекты, периферия, многого ненадо.</p>
<h1 id="альтернативы">Альтернативы?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#альтернативы" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Мне попался <a href="https://zine-ssg.io" class="external">Zine<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p>Zine - это SSG на Zig. Один бинарник, без зависимостей.</p>
<p>Шаблоны на SuperHTML - это валидный html, в который добавили темплейтинг. Никаких <code>{{ }}</code>, никаких Pug/Jade. Просто html с атрибутами типа <code>:text</code>, <code>:if</code>, <code>:loop</code>.</p>
<p>Контент на SuperMD - расширенный .md без необходимости лезть в html.</p>
<h1 id="процесс-переезда">Процесс переезда<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#процесс-переезда" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>В целом переехать достачно просто - над переписать лэйауты с Astro на SuperHTML, перекинуть уже имеющеся скрипты.</p>
<p>Самое муторное эт, что astro юзает свои блядские <code>.astro</code> файлы со своей странной смесью js и html, а SuperHTML это просто html с плюхами.</p>
<h1 id="плюшки">Плюшки?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#плюшки" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p><strong>Скорость.</strong> Билд за миллисекунды вместо секунд.</p>
<p><strong>Простота.</strong> Нет <code>node_modules</code>. Нет <code>package-lock.json</code>. Нет сотен зависимостей. Один бинарник, папка с контентом, папка с шаблонами.</p>
<p><strong>Контроль.</strong> Я знаю, что в каждой строчке сгенерированного HTML. Никакого скрытого JS, который Astro добавляет по умолчанию.</p>
<h1 id="минусы">Минусы?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#минусы" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Zine в бете.</p>
<p>Документация местами бедная. Сообщество маленькое. Если что-то сломалось - ты первый, кто это заметил.</p>
<p>Но для личного сайта это топ.</p>
<p>Один бинарник, пара .smd-файлов, один лэйаут и готово.</p>
<p>Как мне пришлось деплоить это чудо описано в <a href="../../ru/it/How-to-ZINE-on-CF" class="internal" data-slug="ru/it/How-to-ZINE-on-CF">How-to-ZINE-on-CF.md</a>.</p> ]]></description>
    <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Quartz: Time to lose weight</title>
    <link>https://shiza.sccl.cc/en/it/Quartz-obesity-problem</link>
    <guid>https://shiza.sccl.cc/en/it/Quartz-obesity-problem</guid>
    <description><![CDATA[ <p>You’re sitting there, tinkering with your <a href="https://github.com/jackyzha0/quartz" class="external">Quartz<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> wiki.</p>
<p>Check <code>public/</code> - each HTML page is already 50-60 KB. Not to mention <code>index.css</code> bloated to 40 KB.</p>
<p>Quartz itself isn’t that fat out of the box.</p>
<p>But in the process of “improving” it piles up:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>Fonts:                ~2.5 MB</span></span>
<span data-line=""><span>JS + CSS:             ~150 KB</span></span>
<span data-line=""><span>HTML:                 ~1.6 MB</span></span></code></pre></figure>
<p>Hello, <a href="https://motherfuckingwebsite.com/" class="external">motherfuckingwebsite.com<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>!</p>
<p>With this setup I won’t make it into <a href="https://14kbclub.com/" class="external">14kbclub.com<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>.</p>
<p><em>not that I wanted to, but at least I can try to get closer</em></p>
<hr>
<h1 id="what-to-do">What to do?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-to-do" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="fonts---fat-youre-better-off-without">Fonts - fat you’re better off without<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#fonts---fat-youre-better-off-without" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Custom fonts are always extra weight. Every <code>@font-face</code> is a request, rendering blocks until the font loads, and the user gets <code>FOUT</code> or <code>FOIT</code>.</p>
<p>Best solution - <strong>don’t use custom fonts at all</strong>. System fonts (<code>system-ui, sans-serif</code>) are already on the device, nothing to download.</p>
<p>If you really want them - fonts should live only in <code>@font-face</code> via <code>fontOrigin: "local"</code>, no Google Fonts duplication.</p>
<hr>
<h2 id="inline-scripts">Inline scripts<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#inline-scripts" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Quartz shoves inline scripts straight into every page’s HTML:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="html" data-theme="github-light github-dark"><code data-language="html" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* callout collapse - 8 KB */</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* contentIndex fetch */</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre></figure>
<p>On one hand, inline isn’t bad: if the script is tiny, it rides in the first TCP packet (1460 bytes) and doesn’t block rendering.</p>
<p>But when these scripts pile up to tens of KB on every page - it’s all duplicated, <strong>not cached</strong>, and the browser re-parses the same thing on every navigation.</p>
<p>Quartz bundles all <code>afterDOMLoaded</code> hooks from components into <code>postscript.js</code>, which <strong>does get cached</strong>. Callout didn’t make it there - it was added via <code>externalResources()</code> from the <code>ObsidianFlavoredMarkdown</code> plugin as inline.</p>
<p>Fix - stitch the scripts into <code>afterDOMLoaded</code> of any component so they end up in <code>postscript.js</code>.</p>
<hr>
<h2 id="mermaid">Mermaid<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#mermaid" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><a href="https://mermaid.js.org/" class="external">Mermaid<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - a diagram library. The CDN version weighs <strong>2.3 MB</strong>, the loader script is 4.7 KB, CSS is another 9 KB.</p>
<p>Problem: Quartz adds them to EVERY page by default. Even if you don’t have a single diagram.</p>
<p>It just. Sits there. Dead weight.</p>
<p><small>just there, but why?</small><br></p>
<p>Solution - check for mermaid blocks at build time and add only where needed:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (opts.mermaid) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  plugins.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">tree</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">file</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      visit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(tree, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"element"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">node</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) file.data.hasMermaid </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>And in <code>contentPage.tsx</code>:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (fileData.hasMermaid) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  externalResources.js.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ script: mermaidScript, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  externalResources.css.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ content: mermaidStyle, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>Now mermaid doesn’t hang on pages that don’t need it. Which is probably most of them.</p>
<h2 id="katex">KaTeX<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#katex" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><a href="https://katex.org/" class="external">KaTeX<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - a formula rendering library. 600 KB CSS and 300 KB JS.</p>
<p>Quartz bundles it on every page out of the box. Even if you don’t have a single formula.</p>
<p>The right approach - load KaTeX optionally, only on pages with formulas:
Scan HTML for <code>$...$</code> or <code>$$...$$</code>, and if found - add the scripts.
If not - don’t load.</p>
<p>It’s trickier than mermaid because formulas can be inline (<code>$x^2$</code>) - you can’t catch them at the remark stage, you need regex or a rehype plugin. But it’s worth it: 900 KB per page that doesn’t cache well because KaTeX is CSS + fonts + JS.</p>
<hr>
<h2 id="images">Images<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#images" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Giving them up can be really hard.</p>
<p>If you really need them:</p>
<p>The simplest way - <code>loading="lazy"</code>.</p>
<p>Adds with one rehype plugin:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">plugins.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">tree</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    visit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(tree, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"element"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">node</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (node.tagName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "img"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;&#x26;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> !</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">node.properties?.loading) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        node.properties.loading </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "lazy"</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre></figure>
<p>Now the browser doesn’t block waiting for all images to load before showing text. It renders the page and loads images later.</p>
<hr>
<h2 id="explorer">Explorer<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#explorer" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Rendered server-side, and as the number of pages grows, its HTML becomes noticeable.</p>
<p>Every folder, every level of nesting - divs, wrappers, attributes. On a site with deep structure the tree can take up tens of KB just in markup.</p>
<p>If the site is big - either disable the Explorer and use graphs instead, or refine it: strip unnecessary wrappers, limit depth, lazy-load subfolders.</p>
<hr>
<h2 id="search">Search<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#search" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Quartz indexes all pages for fast site search and better SEO crawling.</p>
<p>Whether you need it or not - up to you.</p>
<hr>
<h1 id="does-this-even-help">Does this even help?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#does-this-even-help" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>








































<table><thead><tr><th>Component</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>Google Fonts</td><td>~2.5 MB</td><td>0</td></tr><tr><td>KaTeX</td><td>~900 KB/page</td><td>0</td></tr><tr><td>Inline scripts</td><td>~600 KB</td><td><code>postscript.js</code> 102 KB</td></tr><tr><td>Mermaid</td><td>on every page</td><td>only where needed</td></tr><tr><td>Images</td><td>A lot.</td><td><code>loading="lazy"</code></td></tr><tr><td>Explorer</td><td>many divs</td><td>somewhat lighter</td></tr></tbody></table>
<p>A page without mermaid and without images now weighs ~10 KB HTML + 41 KB index.css + 102 KB postscript.js.</p>
<p>All cached. When jumping between pages, only the lightweight HTML needs to be fetched.</p> ]]></description>
    <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Quartz: Пора худеть</title>
    <link>https://shiza.sccl.cc/ru/it/Quartz-obesity-problem</link>
    <guid>https://shiza.sccl.cc/ru/it/Quartz-obesity-problem</guid>
    <description><![CDATA[ <p>Сидиш, пилиш <a href="https://github.com/jackyzha0/quartz" class="external">Quartz<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a></p>
<p>Проверяешь <code>public/</code> - а там только каждый html весит по 50-60кб. Не говоря уж о <code>index.css</code>, что раздувается до 40kb.</p>
<p>Сам Quartz из коробки не сказать чтоб сильно жирный.</p>
<p>Но в процессе “улучшайзинга” набирается:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>Шрифты:              ~2.5 МБ</span></span>
<span data-line=""><span>JS + CSS:            ~150 КБ</span></span>
<span data-line=""><span>HTML:                ~1.6 МБ</span></span></code></pre></figure>
<p>Привет, <a href="https://motherfuckingwebsite.com/" class="external">motherfuckingwebsite.com<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>!</p>
<p>С таким набором не попасть мне в <a href="https://14kbclub.com/" class="external">14kbclub.com<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a></p>
<p><em>хотя не сильно то и хотелось, но можно хотяб приблизиться</em></p>
<hr>
<h1 id="ичоделать">Ичоделать?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#ичоделать" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="шрифты">Шрифты<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#шрифты" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Кастомные шрифты - это всегда лишний вес. Каждый <code>@font-face</code> - это запрос, рендеринг блокируется, пока шрифт не загрузится, и у пользователя <code>FOUT</code> или <code>FOIT</code>.</p>
<p>Лучшее решение - <strong>не использовать кастомные шрифты вообще</strong>. Системные (<code>system-ui, sans-serif</code>) уже есть на устройстве, не надо ничего качать.</p>
<p>Если очень хочется - шрифты должны находиться только в <code>@font-face</code> через <code>fontOrigin: "local"</code>, без дублирования через Google Fonts.</p>
<hr>
<h2 id="инлайн-скрипты">Инлайн скрипты<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#инлайн-скрипты" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Quartz пихает инлайн-скрипты прямо в HTML каждой страницы:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="html" data-theme="github-light github-dark"><code data-language="html" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* callout collapse - 8кб */</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* contentIndex fetch */</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">script</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre></figure>
<p>С одной стороны, инлайн - это неплохо: если скрипт маленький, он едет в первом TCP-пакете (1460 байт) и не блокирует рендеринг.</p>
<p>Но когда таких скриптов набирается на десятки КБ на каждой странице - всё это дублируется, <strong>не кешируется</strong>, и браузер парсит одно и то же заново при каждом переходе.</p>
<p>Quartz собирает все <code>afterDOMLoaded</code> хуки компонентов в <code>postscript.js</code>, который <strong>кешируется</strong>. А callout туда не попадал - он добавлялся через <code>externalResources()</code> плагина <code>ObsidianFlavoredMarkdown</code> как инлайн.</p>
<p>Лечение - зашить скрипты в <code>afterDOMLoaded</code> любого компонента, чтоб попали в <code>postscript.js</code>.</p>
<hr>
<h2 id="mermaid">Mermaid<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#mermaid" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><a href="https://mermaid.js.org/" class="external">Mermaid<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - библиотека для диаграмм. CDN-версия весит <strong>2.3 МБ</strong>, скрипт-загрузчик - 4.7 КБ, CSS - ещё 9 КБ.</p>
<p>Проблема: Quartz по дефолту добавляет их на КАЖДУЮ страницу. Даже если у тебя нет ни одной диаграммы.</p>
<p><small>просто есть, но зачем?</small><br></p>
<p>Решение - проверять наличие mermaid-блоков при сборке и добавлять только туда:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (opts.mermaid) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  plugins.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">tree</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">file</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      visit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(tree, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"element"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">node</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) file.data.hasMermaid </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>И в <code>contentPage.tsx</code>:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (fileData.hasMermaid) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  externalResources.js.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ script: mermaidScript, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  externalResources.css.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ content: mermaidStyle, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>Теперь mermaid не висит на страницах, где его нет. А таких скорее всего большинство.</p>
<h2 id="katex">KaTeX<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#katex" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><a href="https://katex.org/" class="external">KaTeX<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - библиотека рендеринга формул. 600кб CSS и 300кб JS.</p>
<p>Quartz из коробки тащит её на каждую страницу. Даже если у тебя нет ни одной формулы.</p>
<p>Правильный подход - подключать KaTeX опционально - только на страницах с формулами:
Спарсить HTML на наличие <code>$...$</code> или <code>$$...$$</code>, и если нашёл - добавить скрипты.
Если нет - не грузить.</p>
<p>Сделать это чуть сложнее, чем с mermaid, потому что формулы бывают инлайновые (<code>$x^2$</code>) - их не выцепить на этапе remark, надо либо регулярками, либо rehype-плагином. Но оно того стоит: 900 КБ на страницу, которые не кешируются нормально, потому что KaTeX - это CSS + шрифты + JS.</p>
<hr>
<h2 id="картинки">Картинки<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#картинки" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>От них отказаться может быть очень сложно.</p>
<p>Если очень нужны:</p>
<p>Самый простой способ - <code>loading="lazy"</code>.</p>
<p>Добавляется одним rehype-плагином:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="ts" data-theme="github-light github-dark"><code data-language="ts" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">plugins.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">tree</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    visit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(tree, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"element"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">node</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span data-line=""><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (node.tagName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "img"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;&#x26;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> !</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">node.properties?.loading) {</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        node.properties.loading </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "lazy"</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span data-line=""><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre></figure>
<p>Теперь браузер не блокается, пока загрузятся все картинки, чтобы показать текст. Он рисует страницу, а картинки подгружает потом.</p>
<hr>
<h2 id="explorer">Explorer<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#explorer" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Рендерится на сервере, и с ростом числа страниц его HTML становится заметным.</p>
<p>Каждая папка, каждая вложенность - это дивы, обёртки, атрибуты. На сайте с глубокой структурой дерево может занимать десятки КБ просто в разметке.</p>
<p>Если сайт большой - либо отключай Explorer - юзай например графы, либо дорабатывай: убирай лишние обёртки, ограничивай глубину, делай ленивую загрузку подпапок.</p>
<hr>
<h2 id="поиск">Поиск<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#поиск" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Quartz идексирует все страницы, чтоб был быстрый поиск по сайту и сайт лучше обрабатывался поисковыми системами.
Нада оно вам или ненада - решайте сами.</p>
<h1 id="эт-чота-даст-хотяб">Эт чота даст хотяб?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#эт-чота-даст-хотяб" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>








































<table><thead><tr><th>Компонент</th><th>До</th><th>После</th></tr></thead><tbody><tr><td>Google Fonts</td><td>~2.5 МБ</td><td>0</td></tr><tr><td>KaTeX</td><td>~900 КБ/страница</td><td>0</td></tr><tr><td>Инлайн скрипты</td><td>~600 КБ</td><td><code>postscript.js</code> 102 КБ</td></tr><tr><td>Mermaid</td><td>на всех страницах</td><td>только где надо</td></tr><tr><td>Картинки</td><td>Много.</td><td><code>loading="lazy"</code></td></tr><tr><td>Explorer</td><td>много divов</td><td>чуть легче</td></tr></tbody></table>
<p>Страница без mermaid и без картинок теперь весит ~10кб HTML + 41кб index.css + 102кб postscript.js.</p>
<p>Всё это кешируется. Если прыгать по страницам - нам придётся подтягивать только лёгкие html страницы.</p> ]]></description>
    <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Sakuli60lp</title>
    <link>https://shiza.sccl.cc/en/Peripheral/Keyboards/Sakuli60lp</link>
    <guid>https://shiza.sccl.cc/en/Peripheral/Keyboards/Sakuli60lp</guid>
    <description><![CDATA[ <blockquote class="callout info" data-callout="info">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Under development... </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p>Stage: Design.</p>
</div>
</div>
</blockquote>
<h3 id="guts-and-their-cost">Guts and their cost<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#guts-and-their-cost" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
<ul>
<li>1x Dongle Nordic Nrf52840 with Oled screen :bongocat: - 1500 RUR</li>
<li>2x Controllers, Chinese product in the form of nice!nano v2, also on nrf52840 - 1300 rubles</li>
<li>58x Kailh 1350 hotswap sockets - ~500 RUR</li>
<li>58x Kailh Deep sea silent low profile switches - 2000 RUR</li>
<li>58x diodes 1N4148 - 100 rub.</li>
<li>2 batteries 503450 1000mah - 200 rubles (wholesale)</li>
<li>2x toggle switches - 10 rubles (wholesale)</li>
<li>screws-threads-wires - some pennies, because… are bought only in hundreds-thousands</li>
<li>connectors for batteries - 2 rubles (wholesale)</li>
<li>a couple of hundred grams of PETG plastic - 200 rubles?
== ~&#x3C;6000 rub.</li>
</ul>
<ul>
<li>many man-hours of work on the development and assembly of various tools and equipment</li>
</ul>
<p>Crap without a pcb - hardcore handwired
In general, I don’t see any point in making a board at all for mechanics; this is done only in large-scale production, because it’s faster and cheaper, but it doesn’t mean it’s better and of higher quality. Without a board, you can also screw up any keyboard shape, change the height and tilt of the buttons, etc.</p>
<p>Here is ZMK software
Presumably the charge should last up to several months of daily work-gaming for 15 hours a day. (the calculator is generally hesit for 10 months, but let’s be realistic)</p> ]]></description>
    <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Scan Code &amp; Virtual Key: An Anglocentric Conspiracy of Operating Systems</title>
    <link>https://shiza.sccl.cc/en/it/os/Keyboard-layout-input-problem</link>
    <guid>https://shiza.sccl.cc/en/it/os/Keyboard-layout-input-problem</guid>
    <description><![CDATA[ <p>How the fuck did they manage to screw up something as basic as keyboard input?</p>
<h1 id="windows">Windows<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#windows" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Keyboard input in Windows has several layers of abstraction:
<code>scan_code</code> <code>virtual_key</code> <code>Symbol</code> <em>well, then there might be other modifiers like shift, altgr, etc.</em></p>
<p>where <code>scan_code</code> is immutable, assigned by the driver (well, in modern drivers you can remap the matrix, but whatever)
<code>virtual_key</code> - useless shit that was born from the stupidity of OS devs, but won’t die because of the stupidity of app devs who got hooked on it. Originally created to support hotkeys across all languages, i.e., it maps the standard qwerty layout so hotkeys work on, say, a ЙЦУКЕН layout (the right way: bind input to <code>sc</code>, not <code>vk</code>)
<code>Symbol</code> - well, just any actual letters according to the current layout.</p>
<h1 id="games">Games?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#games" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>The fucking outdated DirectInput maps by <code>VK</code> - anything relying on it is pure shit.</p>
<p>Shitty Unity came up with its own Input Manager, where <code>Input.getKey</code> is anally bound to <code>Symbol</code>
Seems they updated the input system - now you can grab keys via scan codes like <code>Keyboard.current.wKey</code>, but still, in some situations, shit goes down with custom layouts.</p>
<p>In UE, if the dev doesn’t tick the little “use scan code” checkbox - input will go through <code>vk</code>.</p>
<p>But then again, Uncle Gabe in Source uses <code>scan_code</code> for movement input.</p>
<h1 id="there-are-other-decent-examples">There are other decent examples<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#there-are-other-decent-examples" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Somewhere before 1.9-1.12 (don’t remember exactly)
Minecraft had a different input code - everything was bound to <code>vk</code>.
So, like, if yours was changed (and in some layouts it is changed, like in FR and DE if I’m not mistaken, not to mention the <em>normal</em> ones) - you had to rebind everything.</p>
<p>Then in newer versions they rewrote it to use <code>sc</code> - and it started working fucking great.</p>
<p><em>in Minecraft Bedrock they went fuck themselves, we’re on directinput yo</em></p>
<h1 id="what-about-apps">What about apps?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-about-apps" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>And the fucking Aseprite, damn it, smashes through <code>Symbol</code> and genuinely doesn’t understand what the fuck is going on when you switch the layout to ЙЦУКЕН or anything else. Your hotkeys just fly off to god knows where.
So many are on <code>vk</code>, the decent folks are on <code>sc</code></p>
<p>Otherwise, everyone goes through WinAPI - which means <code>vk</code> accordingly.</p>
<h1 id="what-about-linux">What about Linux<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-about-linux" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>They fucked that up too, and probably even harder.
At the hardware level, the kernel has <code>scan_code</code>
The kernel provides an abstraction of the same type, basically digesting <code>scan_code</code> into so-called <code>key_q</code>, <code>key_w</code>, <code>key_e</code> (<code>linux_keycode</code>)
Then some xkb takes whatever the kernel shat out and shits out its own positions like <code>&#x3C;AE01></code>, <code>&#x3C;AE02></code> … <code>&#x3C;AB01></code>, <code>&#x3C;AB02></code> … <code>&#x3C;AC01></code>, <code>&#x3C;AC02></code>
And then XKB maps this coordinate directly to symbols (Keysyms) - like <code>&#x3C;AD01></code> == <code>q</code>, or in Russian == <code>Cyrillic_shorti</code> (й).</p>
<p><small><em>Maybe someday, operating systems will start supporting languages other than English.</em></small><br>
<small><em>But apparently it’s too early for that yet.</em></small><br></p> ]]></description>
    <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Sakuli60lp</title>
    <link>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Sakuli60lp</link>
    <guid>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Sakuli60lp</guid>
    <description><![CDATA[ <blockquote class="callout info" data-callout="info">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>В процессе разработки... </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p>Этап: Проектирование.</p>
</div>
</div>
</blockquote>
<h3 id="кишки-и-их-себестоимость">Кишки и их себестоимость<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#кишки-и-их-себестоимость" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
<ul>
<li>1х Донгл Nordic Nrf52840 с Oled экраном :bongocat: - 1500 руб</li>
<li>2x Контроллеры, китай поделие в форме nice!nano v2, тоже на nrf52840 - 1300 руб</li>
<li>58х Kailh 1350 hotswap сокеты - ~500 руб</li>
<li>58х Свитчи Kailh Deep sea silent low profile - 2000 руб</li>
<li>58х диоды 1N4148 - 100 руб</li>
<li>2х аккумуляторы 503450 1000mah - 200 руб (оптом)</li>
<li>2x тумблера - 10 рублей (оптом)</li>
<li>винтики-резьбы-провода - какие-то копейки, т.к. покупаются только сотнями-тысячами</li>
<li>коннекторы для акб - 2 руб (оптом)</li>
<li>пару сотен грамм PETG пластика - 200 руб?
== ~&#x3C;6000 руб</li>
</ul>
<ul>
<li>много человеко-часов работы на разработку и сброку, разных инструментов и оборудования</li>
</ul>
<p>Поделие без платы - хардкорный handwired
В целом в механиках не вижу смысла вооще изготавливать плату, это делают только при масштабном производстве, ибо так тупа быстрее и дешевле, но не значит лучше и качественнее. Без платы так же можно нахуячить любую форму клавы, менять высоту и наклон кнопок и т.д</p>
<p>Софт туты ZMK
Предположительно заряда должно хватать до нескольких месяцев ежедневного работы-гейминга по 15ч в сутки. (калькулятор вообще под 10 месяцев гессит, но будем реалистами)</p> ]]></description>
    <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Scan Code &amp; Virtual Key: Англоцентричный заговор операционных систем</title>
    <link>https://shiza.sccl.cc/ru/it/os/Keyboard-layout-input-problem</link>
    <guid>https://shiza.sccl.cc/ru/it/os/Keyboard-layout-input-problem</guid>
    <description><![CDATA[ <p>Как умудрились насрать в такую базовую вещь, как ввод с клавиатуры?</p>
<h1 id="шинда">Шинда<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#шинда" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Ввод с клавиаутуры в Windows имеет несколько уровней абстракции:
<code>scan_code</code>  <code>virtual_key</code>  <code>Symbol</code> <em>ну дальше там может другие символы, аля shift, altgr и т.д.</em></p>
<p>, где <code>scan_code</code> неизменяем, присваивается драйвером (ну в современных дровах можно ремапить матрицу, но не суть)
<code>virtual_key</code> - бесполезное говно, которое родилось от тупости разрабов ОС, но не пропадает из-за тупости разрабов прог, которые к нему привязались. Изначально создан для поддержки хоткеев на всех языках, т.е. в него мапится обычная раскладка qwerty, чтоб на условном йцукен работли хоткеи (the right way: привязывать инпут к <code>sc</code>, а не <code>vk</code>)
<code>Symbol</code> - ну уже букавки совершенно любые в соответсвии раскладки.</p>
<h1 id="игры">Игры?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#игры" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Ебучий устаревший DirectInput мапит по <code>VK</code> - всё что на нём - всё говно.</p>
<p>Сраный Unity придумал свой Input Manager, где <code>Input.getKey</code> анально привязан к <code>Symbol</code>
Вродь они обновили систему инпута - теперь можно хапать клавиши через скан коды типа <code>Keyboard.current.wKey</code>, но серавно в каких то ситуациях происходит хуйня в случае с кастомными раскладками.</p>
<p>в UE если разраб не въебёт по калочке аля “use scan code” - инпут будет через <code>vk</code>.</p>
<p>Вот только, дядушка Габен в сурсе юзает <code>scan_code</code> для ввода мувмента.</p>
<h1 id="есть-и-другие-норм-примеры">Есть и другие норм примеры<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#есть-и-другие-норм-примеры" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Где-то до 1.9-1.12 (точно не помню)
В майне был другой код инпута - всё привязывалось к <code>vk</code>.
Т.е. условно, если у тебя он изменён (а в некоторых раскладках он изменён, вроде в fr и de если не ошибаюсь, я уж не говорю про нормальные) - тебе приходилось ребиндить.</p>
<p>Потом в более новых версиях переписали на <code>sc</code> - всё стало пиздато работать.</p>
<p><em>в миникрафт бедроке пошли нахуй, у нас directinput йоу</em></p>
<h1 id="а-программы">А программы?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-программы" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>А ебучий aseprite блять по <code>Symbol</code> хуярит и искренне непонимает что нахуй происходит, когда ты меняешь раскладку на йцукен или любую другую. Хоткеи у тебя улетают куда-то хуй пойми куда.
Так многие на <code>vk</code>, нормальные ребята на <code>sc</code></p>
<p>В оснтальном все ходят через WinAPI - соответсвенно <code>vk</code></p>
<h1 id="а-линупс">А линупс<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-линупс" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>А там тоже насрали, и кабуда даже сильнее.
На аппаратном уровне ядра <code>scan_code</code>
Ядро даёт абстракцию такого же типа, акы переваривает <code>scan_code</code> в условные <code>key_q</code>, <code>key_w</code>, <code>key_e</code> (<code>linux_keycode</code>)
Какой-нить xkb берёт чо ядро высрало и высерает свои позиции акы <code>&#x3C;AE01></code>, <code>&#x3C;AE02></code> … <code>&#x3C;AB01></code>, <code>&#x3C;AB02></code> … <code>&#x3C;AC01></code>, <code>&#x3C;AC02></code>
И уже эту координату XKB мапит напрямую в символы (Keysyms) - типа <code>&#x3C;AD01></code> == <code>q</code>, иль в русиш == <code>Cyrillic_shorti</code> (й).</p>
<p><small><em>Может, когда-нибудь, операционные системы начнут поддерживать другие языки, помимо англиского.</em></small><br>
<small><em>Но видимо пока рано.</em></small><br></p> ]]></description>
    <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Discord: Security Problem</title>
    <link>https://shiza.sccl.cc/en/it/Discord-Security-Problem</link>
    <guid>https://shiza.sccl.cc/en/it/Discord-Security-Problem</guid>
    <description><![CDATA[ <h1 id="discord-and-the-secret-technology-of-an-open-file-containing-your-password">Discord and the secret technology of “an open file containing your password”<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#discord-and-the-secret-technology-of-an-open-file-containing-your-password" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>It’s almost surprising how many Discord spammers there are, to the point that they literally created the <code>1.jpg, 2.jpg, 3.jpg, 4.jpg @everyone @here</code> meme.</p>
<p><img src="../../pictures/it/discord_spam.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Then you start digging into the topic and realize that basically any unauthorized file read is enough to steal your session with a single token grep.</p>
<hr>
<h1 id="what-is-a-token">What is a token?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-is-a-token" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Very roughly, in Discord:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>login + password + 2fa</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>Discord gives you a token (a hash based on some data)</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>the token becomes your session</span></span></code></pre></figure>
<p>From then on, the client just throws this token at the server:</p>
<blockquote>
<p>“it’s still me”</p>
</blockquote>
<p>Server:</p>
<blockquote>
<p>“aight, come in”</p>
</blockquote>
<hr>
<h1 id="what-if-someone-steals-the-token">What if someone steals the token?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-if-someone-steals-the-token" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Then literally nothing interesting happens:</p>
<p>Take the token.</p>
<p>&#x26;&#x26;</p>
<p>Feed it to another client.</p>
<p>&#x26;&#x26;</p>
<p>T H A T ’ S  I T…</p>
<p>: You’re already inside the account.</p>
<p><img src="../../pictures/it/discord_token_login.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<ul>
<li>No login.</li>
<li>No password.</li>
<li>No 2FA.</li>
<li>No SMS.</li>
<li>No passkey.</li>
<li>No push notification.</li>
<li>No confirmations.</li>
<li>No alerts about a new login.</li>
</ul>
<p><img src="../../pictures/it/discord_2fa.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<hr>
<h1 id="so-is-it-easy-to-steal">So… is it easy to steal?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#so-is-it-easy-to-steal" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Yeah.</p>
<p><img src="../../pictures/it/discord_grep_token.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<p><em>just read a file</em></p>
<h1 id="and-how-do-i-notice-that-it-was-stolen">And how do I notice that it was stolen?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#and-how-do-i-notice-that-it-was-stolen" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>You don’t.</p>
<p>The new login isn’t even registered as a new one - the old session simply “moves” to another machine.</p>
<p>The only thing you might notice is that you got logged out from the device where the token was stolen.</p>
<p>And that’s only if somebody actually used the token immediately instead of saving it for a rainy day.</p>
<hr>
<h1 id="so-how-do-you-protect-against-this">So how do you protect against this?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#so-how-do-you-protect-against-this" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Obviously, absolute security doesn’t exist.</p>
<p>If a full-blown stealer is running on your machine, it’ll probably find <em>some</em> way to steal something, depending on the hacker’s skill.</p>
<p>But between:</p>
<blockquote>
<p>“read a file”</p>
</blockquote>
<p>and</p>
<blockquote>
<p>“inject into a process, go through system dialogs, spoof the environment”</p>
</blockquote>
<p>there’s a massive gap.</p>
<h1 id="how-discord-developers-could-have-done-it">HOW DISCORD DEVELOPERS COULD HAVE DONE IT<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#how-discord-developers-could-have-done-it" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<ul>
<li>storing secrets via the OS keychain;</li>
<li>confirmation prompts when accessing secrets;</li>
<li>device fingerprinting;</li>
<li>binding tokens to hardware;</li>
<li>a separate device-generated key;</li>
<li>security alerts on sudden environment changes;</li>
<li>etc, etc, etc…</li>
</ul>
<p>Yeah, all of this can also be bypassed.</p>
<p>But at what cost?</p>
<hr>
<h1 id="and-right-now">And right now?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#and-right-now" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Right now the attack chain looks like this:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>downloaded some suspicious thing</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>it read a file</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>your session got hijacked: `1.jpg, 2.jpg, 3.jpg, 4.jpg @everyone @here`</span></span></code></pre></figure>
<hr>
<h1 id="if-discord-cant">If Discord can’t<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#if-discord-cant" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>One workaround is to log into Discord from a dedicated user account that’s used <strong>only</strong> for Discord.</p>
<p>That way, only that user has permission to read the session database.</p>
<p>Assuming there are no internal exploits in the Discord application itself, the chance of having your session stolen becomes minimal.</p>
<p>This is easy to do on Linux because its permission hierarchy was designed for this from the beginning.</p>
<p>On Windows you can do something similar too, but the security guarantees aren’t as strong since its permission model mostly appeared as a patchwork solution around the Vista era.</p>
<p>Still better than leaving an account access file readable by everyone because Discord, for some mysterious reason, couldn’t protect it itself.</p>
<p><img src="../../pictures/it/discord_rights.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<blockquote class="callout note" data-callout="note">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>This security layer is implemented in my <a href="../../en/it/os/sccl_nix" class="internal alias" data-slug="en/it/os/sccl_nix">NixOs config</a></p></div>
                  
                </div>
</blockquote> ]]></description>
    <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Discord: дыра в безопасности</title>
    <link>https://shiza.sccl.cc/ru/it/Discord-Security-Problem</link>
    <guid>https://shiza.sccl.cc/ru/it/Discord-Security-Problem</guid>
    <description><![CDATA[ <h1 id="дискорд-и-секретная-технология-открытый-файл-с-паролем">Дискорд и секретная технология “открытый файл с паролем”<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#дискорд-и-секретная-технология-открытый-файл-с-паролем" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Казалось бы удивительно, че так много спамеров в дискорде, которые своим количеством уже породили мем <code>1.jpg, 2.jpg, 3.jpg, 4.jpg @everyone @here</code></p>
<p><img src="../../pictures/it/discord_spam.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>А потом копаешь тему и оказывается что абсолютно любой несакционированный доступ к чтению файлов позволяет без проблем украть твою сессию одним grep-ом токена.</p>
<hr>
<h1 id="что-такое-токен">Что такое токен?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#что-такое-токен" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Очень грубо, в дискорде:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>login + password + 2fa</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>Discord выдаёт токен (хэш на основе каких-то данных)</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>токен становится твоей сессией</span></span></code></pre></figure>
<p>Дальше клиент кидает этот токен на сервер:</p>
<blockquote>
<p>“это всё ещё я”</p>
</blockquote>
<p>Сервер:</p>
<blockquote>
<p>“ок, входи”</p>
</blockquote>
<hr>
<h1 id="а-если-токен-украсть">А если токен украсть?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-если-токен-украсть" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>То буквально ничего интересного не происходит:</p>
<p>Берёшь токен.</p>
<p>&#x26;&#x26;
Подсовываешь его другому клиенту.</p>
<p>&#x26;&#x26;
В С Ё…</p>
<p>: Ты уже внутри аккаунта.</p>
<p><img src="../../pictures/it/discord_token_login.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<ul>
<li>Без логина.</li>
<li>Без пароля.</li>
<li>Без 2FA.</li>
<li>Без SMS.</li>
<li>Без passkey.</li>
<li>Без push.</li>
<li>Без подтверждений.</li>
<li>Без алетров о новом входе.</li>
</ul>
<p><img src="../../pictures/it/discord_2fa.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<hr>
<h1 id="а-чо-легко-украть">А чо, легко украть?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-чо-легко-украть" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Да.
<img src="../../pictures/it/discord_grep_token.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<p><em>просто прочитать файл</em></p>
<h1 id="а-как-заметить-похищение">А как заметить похищение?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-как-заметить-похищение" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>А никак.</p>
<p>Новый логин вообще не регистрируется как новый - старая сессия просто “переезжает” на другую машину.</p>
<p>Всё что ты можешь заметить - так это что тебя разлогинило с твоего устройства, с которого украли токен.
И то при том условиеи если с этого токена кто-то уже зашел, не оставив на черный день.</p>
<hr>
<h1 id="а-как-защитить">А как защитить?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-как-защитить" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Понятно, что абсолютной защиты не существует.</p>
<p>Если на машине сидит полноценный стилер - способ что-то украсть скорее всего найдётся, в зависимости от скиллов хакера.</p>
<p>Но между:</p>
<blockquote>
<p>“прочитать файл”</p>
</blockquote>
<p>и</p>
<blockquote>
<p>“внедриться в процесс, пройти системные диалоги, подделать окружение”</p>
</blockquote>
<p>лежит огромная пропасть.</p>
<h1 id="как-бы-можно-было-сделать-разрабам-дискорда">КАК БЫ МОЖНО БЫЛО СДЕЛАТЬ РАЗРАБАМ ДИСКОРДА<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#как-бы-можно-было-сделать-разрабам-дискорда" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<ul>
<li>хранение секретов через OS keychain;</li>
<li>подтверждение доступа к секрету;</li>
<li>fingerprint устройства;</li>
<li>привязка токена к железу;</li>
<li>отдельный ключ, генерируемый на устройстве;</li>
<li>security alerts при резкой смене окружения.</li>
<li>etc, etc, etc…</li>
</ul>
<p>Да, всё это тоже можно обходить.</p>
<p>Но какой ценой?</p>
<hr>
<h1 id="а-сейчас">А сейчас?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-сейчас" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Сейчас цена атаки выглядит примерно так:</p>
<figure data-rehype-pretty-code-figure=""><pre tabindex="0" data-language="text" data-theme="github-light github-dark"><code data-language="text" data-theme="github-light github-dark" style="display: grid;"><span data-line=""><span>скачал подозрительную фигню</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>она прочитала файл</span></span>
<span data-line=""><span>↓</span></span>
<span data-line=""><span>твою сессию угнали: `1.jpg, 2.jpg, 3.jpg, 4.jpg @everyone @here`</span></span></code></pre></figure>
<hr>
<h1 id="если-discord-не-может">Если Discord не может<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#если-discord-не-может" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Как варик - логиниться в дискорд со специально-выделенного только под дискорд пользователя,
Чтоб права на чтение DB с сессией было <strong>только</strong> у него.
При отсутвии внутренних эксплойтов в приложении Discord - шанс что у тебя что-то угонят - минимальный.</p>
<p>Это легко сделать на linux, т.к. иерархия прав там из коробки.</p>
<p>на винде, в целом, тоже можно, но безопасность не так велика, ибо права там появились как костыль лишь с релизом Vista.</p>
<p>Но всё лучше, чем оставлять файл открытым для всех, который дискорд сам защитить по какой-то неведомой причине не смог.</p>
<p><img src="../../pictures/it/discord_rights.webp" width="auto" height="auto" alt="" loading="lazy"></p>
<blockquote class="callout note" data-callout="note">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Такая защитная прослойка имплементирована в моём <a href="../../ru/it/os/sccl_nix" class="internal alias" data-slug="ru/it/os/sccl_nix">NixOs config</a></p></div>
                  
                </div>
</blockquote> ]]></description>
    <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Outemu Switches</title>
    <link>https://shiza.sccl.cc/en/Peripheral/Keyboards/Switches/Outemu</link>
    <guid>https://shiza.sccl.cc/en/Peripheral/Keyboards/Switches/Outemu</guid>
    <description><![CDATA[ <p>I had a chance to test 38 switches, so let’s go through each one:</p>
<p>Sound comparison can be seen in the video</p>
<iframe width="100%" height="400" src="https://www.youtube.com/embed/roa0XXvA1UU" title="38 Outemu Keyboard Switches Sound Test Comparison" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>
</iframe>
<h1 id="tierlist">Tierlist<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#tierlist" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>🔴 - Linear</p>
<p>🟡 - Tactile</p>
<p>🔵 - Clicky</p>





































<table><thead><tr><th align="left">Rank</th><th align="left">Switches</th></tr></thead><tbody><tr><td align="left"><strong>S</strong></td><td align="left">🟡 Silent Jade Yellow • 🔴 Cold Plum • 🔴 Jade Pink</td></tr><tr><td align="left"><strong>A</strong></td><td align="left">🟡 Cream Yellow • 🔴 Cream Pink • 🔴 Silent Peach V2 • 🔴 Pink Lotus • 🔴 Hanny • 🔴 Lanny</td></tr><tr><td align="left"><strong>B</strong></td><td align="left">🟡 Silent Lemon V2 • 🟡 Maple Leaf • 🔴 Milk Peach • 🔴 Bai Lan</td></tr><tr><td align="left"><strong>C</strong></td><td align="left">🟡 Red Panda • 🟡 Milk Tea • 🔴 Silent Peach V1 • 🔴 Silent White • 🔴 Silent Ocean</td></tr><tr><td align="left"><strong>D</strong></td><td align="left">🟡 Silent Lemon V1 • 🔴 Dustproof Silver • 🔴 Crystal Linear • 🟡 Outemu Silent Tom</td></tr><tr><td align="left"><strong>F</strong></td><td align="left">🔴 Silver • 🔴 Black • 🔴 Red • 🟡 Brown • 🟡 Orange • 🟡 Purple</td></tr><tr><td align="left"><strong>F-</strong></td><td align="left">🔵 Blue, Green, Gold, Ocean Clicky, Spring Breeze, Milk Blue, Jerry Clicky, Cream Blue, Jade Blue</td></tr></tbody></table>
<hr>
<h1 id="description-of-each">Description of each<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#description-of-each" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="linears">[LINEARS]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#linears" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Silent White</strong> - The simplest quiet switch, a little sandy, but for the first generation it will do if you have an ultra low-budget build.</li>
<li><strong>Outemu Silver</strong> - Standard slag, fast, with short stroke.</li>
<li><strong>Outemu Black</strong> - Standard slag, weighted spring.</li>
<li><strong>Outemu Red</strong> - Standard slag, basic.</li>
<li><strong>Outemu Silent Peach V1</strong> - It was ok, but now there is something better. Quiet, soft.</li>
<li><strong>Outemu Silent Peach V2</strong> - Good ultra-budget quiet switch.</li>
<li><strong>Outemu Cold Plum</strong> - Winter collection. Full nylon body, short stroke, heavy spring. Thick thocky sound.</li>
<li><strong>Outemu Pink Lotus</strong> - Summer collection. Lightweight, short stroke, smooth.</li>
<li><strong>Outemu Milk Peach</strong> - Budget regular switch, nice sound, but Cream and Jade are better.</li>
<li><strong>Outemu Bai Lan</strong> - Average.</li>
<li><strong>Outemu Hanny</strong> - Long-pole stem. Loud clacky switch (lego movie sound).</li>
<li><strong>Outemu Lanny</strong> - Similar to Hanny, but a little more balanced and ordinary.</li>
<li><strong>Outemu Silent Ocean</strong> - Not a bad quiet switch.</li>
<li><strong>Outemu Crystal Linear</strong> - Completely made of polycarbonate. Dry and rattling.</li>
<li><strong>Outemu Dustproof Silver</strong> - Slightly better than regular silver, but still so-so.</li>
<li><strong>Outemu Cream Pink</strong> - Well lubricated, buttery action, deep sound (but Jade is better).</li>
<li><strong>Outemu Jade Pink</strong> - A cooler version of Cream Pink, with a faster spring.</li>
</ul>
<hr>
<h2 id="tactiles">[TACTILES]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#tactiles" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Brown</strong> - Absolute crap. There is no tactility, it feels like a dirty sand ruler with a ringing spring.</li>
<li><strong>Outemu Orange</strong> - A little heavier than Brown, but the same dry trash with a ringing sound.</li>
<li><strong>Outemu Purple</strong> - Old heavy tactile. The bump is sharp and unpleasant, the spring rings harshly on return.</li>
<li><strong>Outemu Red Panda</strong> - Passable clone of Holy Panda. A rounded bump at the start, but without manual lubrication it’s a so-so idea.</li>
<li><strong>Outemu Maple Leaf</strong> - Not a bad ringing tactile. The bump is clear, feels fast, and has a clacky sound.</li>
<li><strong>Outemu Milk Tea</strong> - Budget average. Due to the milky casing, the sound is a little softer, but the tactility is weak.</li>
<li><strong>Outemu Silent Jade Yellow</strong> - Top silent tactile device. A clear bump at the start, not wadded at all, lubricated normally. Close to Gazzew Boba u4, but softer.</li>
<li><strong>Outemu Cream Yellow</strong> - Tactile analogue of Cream Pink. Good lubrication, soft dull sound, pleasant running. Also close to u4.</li>
<li><strong>Outemu Silent Tom</strong> - Old silent tactile. The hillock is indistinct and blurred, no longer relevant.</li>
<li><strong>Outemu Silent Grey</strong> - Ancient cotton shit. There is almost no bump, when pressed there is a complete feeling of rubber.</li>
<li><strong>Outemu Silent Lemon V1</strong> - Was a popular quiet switch, but is very sandy.</li>
<li><strong>Outemu Silent Lemon V2</strong> - Work on bugs V1. It has become much smoother, normal quiet tactile.</li>
</ul>
<hr>
<h2 id="clickies">[CLICKIES]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#clickies" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Blue</strong>, <strong>Outemu Green</strong>, <strong>Outemu Gold</strong>, <strong>Outemu Ocean Clicky</strong>, <strong>Outemu Spring Breeze</strong>, <strong>Outemu Milk Blue</strong>, <strong>Outemu Jerry Clicky</strong>, <strong>Outemu Cream Blue</strong>, <strong>Outemu Jade Blue</strong> - Total shit without exception. Due to the cheap design of the Click Jacket, everything inside is loose and rattling. A nasty plastic crunch instead of a normal click.</li>
</ul> ]]></description>
    <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Outemu Switches</title>
    <link>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Switches/Outemu</link>
    <guid>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Switches/Outemu</guid>
    <description><![CDATA[ <p>Мне довелось потестить 38 свитчей отуему, пройдёмся по каждому:</p>
<p>Звуковое сравнение можно посмотреть в видосике</p>
<iframe width="100%" height="400" src="https://www.youtube.com/embed/roa0XXvA1UU" title="38 Outemu Keyboard Switches Sound Test Comparison" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>
</iframe>
<h1 id="тирлист">Тирлист<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#тирлист" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>🔴 - Linear</p>
<p>🟡 - Tactile</p>
<p>🔵 - Clicky</p>





































<table><thead><tr><th align="left">Ранг</th><th align="left">Свитчи</th></tr></thead><tbody><tr><td align="left"><strong>S</strong></td><td align="left">🟡  Silent Jade Yellow • 🔴  Cold Plum • 🔴  Jade Pink</td></tr><tr><td align="left"><strong>A</strong></td><td align="left">🟡  Cream Yellow • 🔴  Cream Pink • 🔴  Silent Peach V2 • 🔴  Pink Lotus • 🔴  Hanny • 🔴  Lanny</td></tr><tr><td align="left"><strong>B</strong></td><td align="left">🟡  Silent Lemon V2 • 🟡  Maple Leaf • 🔴  Milk Peach • 🔴  Bai Lan</td></tr><tr><td align="left"><strong>C</strong></td><td align="left">🟡  Red Panda • 🟡  Milk Tea • 🔴  Silent Peach V1 • 🔴  Silent White • 🔴  Silent Ocean</td></tr><tr><td align="left"><strong>D</strong></td><td align="left">🟡  Silent Lemon V1 • 🔴  Dustproof Silver • 🔴  Crystal Linear • 🟡 Outemu Silent Tom</td></tr><tr><td align="left"><strong>F</strong></td><td align="left">🔴  Silver • 🔴  Black • 🔴  Red • 🟡  Brown • 🟡  Orange • 🟡  Purple</td></tr><tr><td align="left"><strong>F-</strong></td><td align="left">🔵 Blue, Green, Gold, Ocean Clicky, Spring Breeze, Milk Blue, Jerry Clicky, Cream Blue, Jade Blue</td></tr></tbody></table>
<hr>
<h1 id="описание-каждого">Описание каждого<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#описание-каждого" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="linears">[LINEARS]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#linears" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Silent White</strong> - Простейший тихий свитч, немного песочит, но для первого поколения сойдёт, если ультра низкобюджетная сборка.</li>
<li><strong>Outemu Silver</strong> - Стандартный шлак, быстрый, с укороченным ходом.</li>
<li><strong>Outemu Black</strong> - Стандартный шлак, утяжелённая пружина.</li>
<li><strong>Outemu Red</strong> - Стандартный шлак, базовый.</li>
<li><strong>Outemu Silent Peach V1</strong> - Был норм, но сейчас есть лучше. Тихий, мягкий.</li>
<li><strong>Outemu Silent Peach V2</strong> - Хороший ультрабюджет тихий свитч.</li>
<li><strong>Outemu Cold Plum</strong> - Winter коллекция. Фулл нейлоновый корпус, укороченный ход, тяжелая пружина. Плотный thocky звук.</li>
<li><strong>Outemu Pink Lotus</strong> - Summer коллекция. Лёгкий, укороченный ход, плавный.</li>
<li><strong>Outemu Milk Peach</strong> - Бюджетный обычный свитч, приятный звук, но Cream и Jade лучше.</li>
<li><strong>Outemu Bai Lan</strong> - Середнячок.</li>
<li><strong>Outemu Hanny</strong> - Long-pole стем. Громкий clacky свитч (lego movie sound).</li>
<li><strong>Outemu Lanny</strong> - Похож на Hanny, но чуть сбалансированнее и обычнее.</li>
<li><strong>Outemu Silent Ocean</strong> - Неплохой тихий свитч.</li>
<li><strong>Outemu Crystal Linear</strong> - Полностью из поликарбоната. Сухой и дребезжит.</li>
<li><strong>Outemu Dustproof Silver</strong> - Чуть лучше обычного сильвера, но все равно так себе.</li>
<li><strong>Outemu Cream Pink</strong> - Хорошо смазан, маслянистый ход, глубокий звук (но Jade лучше).</li>
<li><strong>Outemu Jade Pink</strong> - Более крутая версия Cream Pink, с быстрой пружиной.</li>
</ul>
<hr>
<h2 id="tactiles">[TACTILES]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#tactiles" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Brown</strong> - Абсолютное говно. Тактильности нет, ощущается как грязный песочный линейник со звенящей пружиной.</li>
<li><strong>Outemu Orange</strong> - Чуть тяжелее, чем Brown, но такой же сухой хлам со звоном.</li>
<li><strong>Outemu Purple</strong> - Старый тяжелый тактильник. Бугор резкий and неприятный, пружина жестко звенит на возврате.</li>
<li><strong>Outemu Red Panda</strong> - Проходной клон Holy Panda. Округлый бугор на старте, но без ручной смазки так себе затея.</li>
<li><strong>Outemu Maple Leaf</strong> - Неплохой звонкий тактильник. Бугор четкий, ощущается быстрым, clacky звучание.</li>
<li><strong>Outemu Milk Tea</strong> - Бюджетный средняк. Из-за молочного корпуса звук чуть мягче, но тактильность слабая.</li>
<li><strong>Outemu Silent Jade Yellow</strong> - Топовый тихий тактильник. Четкий бугор на старте, вообще не ватный, смазан нормально. Близок к Gazzew Boba u4, но мягче.</li>
<li><strong>Outemu Cream Yellow</strong> - Тактильный аналог Cream Pink. Хорошая смазка, мягкий глухой звук, приятный ход. Тоже близок к u4.</li>
<li><strong>Outemu Silent Tom</strong> - Старый тихий тактильник. Бугор невнятный и размытый, уже не актуален.</li>
<li><strong>Outemu Silent Grey</strong> - Древнее ватное говно. Бугра почти нет, при нажатии полное ощущение резины.</li>
<li><strong>Outemu Silent Lemon V1</strong> - Был популярным тихим свитчем, но сильно песочит.</li>
<li><strong>Outemu Silent Lemon V2</strong> - Работа над ошибками V1. Стал гораздо плавнее, нормальный тихий тактил.</li>
</ul>
<hr>
<h2 id="clickies">[CLICKIES]<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#clickies" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Outemu Blue</strong>, <strong>Outemu Green</strong>, <strong>Outemu Gold</strong>, <strong>Outemu Ocean Clicky</strong>, <strong>Outemu Spring Breeze</strong>, <strong>Outemu Milk Blue</strong>, <strong>Outemu Jerry Clicky</strong>, <strong>Outemu Cream Blue</strong>, <strong>Outemu Jade Blue</strong> - Тотальное говно без исключений. Из-за дешевой конструкции Click Jacket внутри все люфтит и дребезжит. Мерзкий пластиковый хруст вместо нормального клика.</li>
</ul> ]]></description>
    <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>SSK-58tmr</title>
    <link>https://shiza.sccl.cc/en/Peripheral/Keyboards/SSK-58tmr</link>
    <guid>https://shiza.sccl.cc/en/Peripheral/Keyboards/SSK-58tmr</guid>
    <description><![CDATA[ <blockquote class="callout info" data-callout="info">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>In the process of thinking (development has not started) </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p>Currently working on another keyboard: <a href="../../../Sakuli60lp" class="internal" data-slug="Sakuli60lp">Sakuli60lp</a></p>
</div>
</div>
</blockquote>
<p><em>A.K.A.</em></p>
<h1 id="long-way-to-dream">Long way to dream<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#long-way-to-dream" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="in-short">In short…<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#in-short" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>I have long had a desire to build a custom keyboard from scratch…
This writing is essentially my shitpost <em>(Idk what the fuck:: I love writing letters)</em>
I’ll dump my thoughts on this project here, if you can call it that. (sort of like an overkill job, maybe it’s possible)</p>
<h2 id="whatamhow">Whatamhow<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#whatamhow" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>It is known that the topic of analog keyboards, mainly based on Hall-Effect sensors, has been popular in the keyboard market for the last few years.
I don’t see any point in listing the goodies, they are obvious.
And one of the minuses is the fucking energy consumption of HE keyboards compared to mechanical ones.
Which greatly complicates the assembly of a wireless keyboard…</p>
<p>For many, it may seem that wireless is useless shit, useless to anyone.
Until some time I thought so myself, sitting on a staggered 2 kg piece of aluminum with buttons.
But then I found myself in the hands of a split keyboard without a single wire.
: turned on 2 halves, shoved the USB dongle into the computer and you work
holds a charge for 3 months with 15 hours of daily use with 1500mAh batteries in each half (hule mechanics)
And it turned out to be so convenient that I can no longer imagine a keyboard with wires.</p>
<p>That’s why I look towards tmr, because he eats 8 times less than he
Although there must be pitfalls with it in the form of an unstable Vcc, which can spoil their accuracy, which is crap in comparison with he (well, in fact, in fact, they are stupidly less noisy, they don’t really suck in terms of accuracy)</p>
<h2 id="sobsna-what-do-i-need-where-the-fuck-does-it-all-begin">Sobsna what do I need, where the fuck does it all begin.<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#sobsna-what-do-i-need-where-the-fuck-does-it-all-begin" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Right now it’s a stage of thinking, which will later flow into tests.
According to budgets, I hope not to cost more than 25k rubles.
<small>the price for delivering sensors to Russia is just fucking fucked up (60++ euros per bag, fucking trade unions and sanctions)</small><br></p>
<p>In terms of software, at first I thought this was the top: <a href="https://github.com/peppapighs/libhmk" class="external">peppapighs/libhmk<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>, because this is the best open source software for analog keyboards that can be found so far. It’s a pity that no one has messed with the TMR section yet, but overall I don’t think there’s a big difference. (more on the difference later)</p>
<p>But unfortunately <a href="https://github.com/peppapighs/libhmk/issues/2" class="external">author stated<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - there will be no support for split
And implementing such a theme on your own is fucking hell, which will probably require re-wiring all the software. Because there is no implementation of communication and synchronization of two controllers (such as uart/i2c/spi) Well, at least you can put some kind of wireless on top of tinyusb if you break your ass a little.</p>
<p>But in order not to tear my ass, I’ll rather look towards <a href="https://github.com/zmkfirmware/zmk" class="external">zmk<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> because This is one of the best solutions for keyboard firewood.
And some idiot is already making a <a href="https://github.com/cr3eperall/zmk-feature-hall-effect" class="external">module<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> for it to support HE boards, with a rapid trigger, socd and other cool features.</p>
<h2 id="so-we-raised-the-topic-of-software">So we raised the topic of software…<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#so-we-raised-the-topic-of-software" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>But there is no mention of TRM anywhere.
But no one has ever made keyboards on TMR in the open source.
Moreover, no one has made Split Wireless TMR keyboards.</p>
<p>Everywhere current HE-HE-HE</p>
<p>This is one of the key problems of this project - there are no examples.
But fortunately there is already some progress in the HE field.
And there is hope that there will be no special problems with TMR.</p>
<h2 id="lets-move-on-to-the-difference-between-tmr-and-he">Let’s move on to the difference between TMR and HE.<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#lets-move-on-to-the-difference-between-tmr-and-he" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Pachama, I have hope that I can push TMR sensors under HE firewood without tearing my ass?</p>
<ul>
<li>TMR and HE have the same pinout (if we consider keyboard-friendly options in the SOT23-3 case)</li>
</ul>
<blockquote>
<p>GND, Vcc, Out</p>
</blockquote>
<ul>
<li>Can operate in the same voltage range</li>
</ul>
<blockquote>
<p>Keyboards usually dance at 3.3v - both technologies can work in this field</p>
</blockquote>
<ul>
<li>Similar transfer function</li>
</ul>
<blockquote>
<p>HE: VOUT = VQ + S*B
TMR: VOUT = VCC*(VOFFSET + S*B)</p>
<p>, where
VOUT - output voltage
VCC - supply voltage
VOFFSET - offset
VQ - Voltage at B = 0
S - sensitivity
B - induction (don’t give a fuck, the position of the magnet, the switch is tightly clamped)</p>
<p>In short, it’s just bullshit, we just need to take Vcc into account, which may become a problem in the future.</p>
</blockquote>
<p>The theme itself will be a columar format, like on a keyboard (it has a little more - 64 buttons, I think this keyboard will still have 58-60 buttons), which few people will be interested in.
But questions about HE/TMR are common, regardless of the layout, I hope at least someone will be interested in reading some of my belongings and research on this topic…</p>
<p><img src="../../../pictures/Peripheral/sccl_colemak.webp" width="auto" height="auto" alt="" loading="lazy"></p> ]]></description>
    <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>SSK-58tmr</title>
    <link>https://shiza.sccl.cc/ru/Peripheral/Keyboards/SSK-58tmr</link>
    <guid>https://shiza.sccl.cc/ru/Peripheral/Keyboards/SSK-58tmr</guid>
    <description><![CDATA[ <blockquote class="callout info" data-callout="info">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>В процессе обдумываний (разработка не началась) </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p>В данный момент занимаюсь другой клавиатурой: <a href="../../../Sakuli60lp" class="internal" data-slug="Sakuli60lp">Sakuli60lp</a></p>
</div>
</div>
</blockquote>
<p><em>A.K.A.</em></p>
<h1 id="долгий-путь-к-мечте">Долгий путь к мечте<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#долгий-путь-к-мечте" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<h2 id="если-кратко">Если кратко…<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#если-кратко" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>У меня уже давно есть желание собрать кастомную клавиатуру с нуля…
Ета писанина по-сути своей является моим шитпостом <em>(хз нахуя::я люблю писать буковы)</em>
Буду сюда вываливать свои мысли по поводу сего проектица, если ето можно так назвать. (вроде работы овердохуя, наверна можно)</p>
<h2 id="чотамкак">Чотамкак<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#чотамкак" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Известно, что на рынке клавиатур последние несколько лет попсует тема с аналоговыми клавиатурами, в основном на базе Hall-Effect сенсоров
Плюшки перечислять не вижу смысла, они очевидны.
А из минусов - ебейшее энергопотребление HE клавиатур по сравнению с механикой.
Что значительно усложняет сборку беспроводной клавы…</p>
<p>Для многих может показаться что беспровод - бесполезное говно, нахуй никому ненужное.
Я до каких то пор сама так думала, сидя на стаггеред 2кг куске аллюминия с кнопками.
Но потом в моих руках оказалась split клавиатура без единого провода.
: включил 2 половинки, пихнул usb донгл в комп и работаешь
держит заряд месяца 3 при 15 часовом ежедневном юзе с 1500мач аккумами в каждой половинке (механика хуле)
И эт оказалось настолько удобно, что я больше не мыслю клавиатуру, в которой будут провода.</p>
<p>Потому я гляжу в сторону tmr, ибо хавает он раз так в 8 меньше, чем he
Хотя с ним должно быть есть подводные камни в виде нестабильного Vcc, что может гадить их ебанутую в сравнении с he точность (ну вапще на самом деле они тупа меньше шумят, по точности не прям ебут)</p>
<h2 id="собсна-чо-мне-нада-с-чего-нахуй-всё-начинается">Собсна чо мне нада, с чего нахуй всё начинается.<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#собсна-чо-мне-нада-с-чего-нахуй-всё-начинается" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Щас пока этап кумеканья, который позже перетечет в тесты.
По бюджетам я надеюсь не уйти дороже 25к руб.
<small>цена доставки сенсоров в россию это пиздец просто нахуй (60++ евро за пакетик ебанные профсоюзы и санкции)</small><br></p>
<p>По софту - я сначал показалось, что это топ: <a href="https://github.com/peppapighs/libhmk" class="external">peppapighs/libhmk<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>, ибо это лучший опенсурс софт для аналоговых клав, чо пока можно найти. Жаль на нём пока вроде никто не мутил TMR поделия, но в целом не думаю, что велика разница. (о разнице позже)</p>
<p>Но к сожалению якы <a href="https://github.com/peppapighs/libhmk/issues/2" class="external">заявил аффтор<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> - поддержки split не буде
А имплементить такую тему самостоятельно - ебанутый ад, который потребует, должно быть, перековырчивания всего софта. Т.к. там нет реализации связи и синхронизации двух контроллеров (типа uart/i2c/spi) Ну хотяб беспровод какой-то налопатить поверх tinyusb можно если немного порвать жопу.</p>
<p>Но дабы не рвать жопу, скорее буду глядеть в сторону <a href="https://github.com/zmkfirmware/zmk" class="external">zmk<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> т.к. это одино из лучших решений для дров клавы.
И на него уже какой-то пиздузиаст пилит <a href="https://github.com/cr3eperall/zmk-feature-hall-effect" class="external">модуль<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> для поддержки HE бордов, с раппид триггером, socd и прочими крутыми фичами.</p>
<h2 id="вот-мы-подняли-тему-софта">Вот мы подняли тему софта…<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#вот-мы-подняли-тему-софта" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>А ведь нигде нет упоминаний TRM.
А ведь никто и не делал в опенсурсе клавы на TMR.
А ведь тем более никто не делал Split Wireless TMR клавы.</p>
<p>Везде тока HE-HE-HE</p>
<p>Это одна из ключевых проблем этого проекта - нет примеров.
Но благо уже есть какие-то подвижки на HE поле.
И есть надежда что с TMR не будет особых проблем.</p>
<h2 id="перейдём-собсна-к-разнице-tmr-и-he">Перейдём собсна к разнице TMR и HE.<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#перейдём-собсна-к-разнице-tmr-и-he" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Пачаму у меня есть надежда, что я смогу пихнуть TMR датчики, под HE дрова, при этом не порвав жопу?</p>
<ul>
<li>TMR и HE имеют одинаковую распиновку (если рассматривать удобные для клавы варианты в SOT23-3 корпусе)</li>
</ul>
<blockquote>
<p>GND, Vcc, Out</p>
</blockquote>
<ul>
<li>Могут работать в одном и том же диапазоне напряги</li>
</ul>
<blockquote>
<p>Клавы обычно пляшут от 3.3v - обе технологии могут работать на этом поле</p>
</blockquote>
<ul>
<li>Схожая передаточная функция</li>
</ul>
<blockquote>
<p>HE: VOUT = VQ + S*B
TMR: VOUT = VCC*(VOFFSET + S*B)</p>
<p>, где
VOUT — выходное напряжение
VCC — напряжение питания
VOFFSET — смещение
VQ - Напряга при B = 0
S — чувствительносты
B — индукция (похуй, положение магнита, наскильно сильно зажат свитч)</p>
<p>Кароче одна хуйня, нам нада только учитывать Vcc, что может станет проблемой в будущем.</p>
</blockquote>
<p>Сама темка будет columar формата, типа как на кортинке (на ней чутьб больше - 64 кнопки, я думаю в этой клаве таки будет 58-60 кнопок), что мало кому интересно.
Но вопросецы по поводу HE/TMR общие, независимо от лейаута, надеюсь хоть комута будет интересно почитать какие-та мои пожитки и исследования в этой теме…</p>
<p><img src="../../../pictures/Peripheral/sccl_colemak.webp" width="auto" height="auto" alt="" loading="lazy"></p> ]]></description>
    <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>sccl_nix: Declarative paradise</title>
    <link>https://shiza.sccl.cc/en/it/os/sccl_nix</link>
    <guid>https://shiza.sccl.cc/en/it/os/sccl_nix</guid>
    <description><![CDATA[ <h1 id="if-this-shitpost-like-article-looks-like-insanity">If this shitpost-like article looks like insanity<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#if-this-shitpost-like-article-looks-like-insanity" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Proper documentation: <a href="https://github.com/scclie/sccl_nix" class="external">github/scclie/sccl_nix/README.md<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a></p>
<h1 id="why-the-f-">Why <del>the f*&#x26;^</del> ?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#why-the-f-" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Bc an unstructured <a href="https://nixos.org/" class="external">NixOs<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> config is always the same story:</p>
<ul>
<li>first you “organize it properly”</li>
<li>then you add a second host</li>
<li>then a third</li>
<li>then packages, configs, exceptions start piling up</li>
<li><code>/etc/nixos</code> slowly turns into a dump of <code>if hostname == ...</code> conditionals</li>
</ul>
<blockquote>
<p>“ok, Ill refactor this properly later”</p>
</blockquote>
<p><em>(no u wont)</em></p>
<hr>
<h1 id="what-is-this">What is this?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#what-is-this" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Dotfiles are split into 3 core entities:</p>
<ul>
<li><code>hosts</code> - hardware and system-level stuff</li>
<li><code>profiles</code> - the user layer</li>
<li><code>shared</code> - everything you got tired of copying around</li>
</ul>
<p>machine != user != environment</p>
<hr>
<h2 id="hosts">hosts<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#hosts" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Everything that cannot realistically be shared between machines</p>
<ul>
<li>disks</li>
<li>drivers</li>
<li>network</li>
<li>system packages</li>
</ul>
<hr>
<h2 id="profiles">profiles<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#profiles" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>This is basically the “human layer”</p>
<ul>
<li>environments</li>
<li>personal software</li>
<li>shell configuration</li>
<li>all that user-level mess</li>
</ul>
<p>One host can contain as many profiles as you want - different users, different purposes, whatever.</p>
<p>The system is built per-host, and profiles are attached on top.</p>
<hr>
<h2 id="shared">shared<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#shared" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>An attempt to stop copy-paste culture</p>
<ul>
<li>base packages</li>
<li>WM configs</li>
<li>default settings</li>
</ul>
<hr>
<h2 id="how-it-connects">How it connects<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#how-it-connects" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Very simple:</p>
<pre><button class="expand-button" aria-label="Expand mermaid diagram" data-view-component><svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path fill-rule="evenodd" d="M3.72 3.72a.75.75 0 011.06 1.06L2.56 7h10.88l-2.22-2.22a.75.75 0 011.06-1.06l3.5 3.5a.75.75 0 010 1.06l-3.5 3.5a.75.75 0 11-1.06-1.06l2.22-2.22H2.56l2.22 2.22a.75.75 0 11-1.06 1.06l-3.5-3.5a.75.75 0 010-1.06l3.5-3.5z"></path></svg></button><code class="mermaid" data-clipboard="&#x22;flowchart TD\n    F[❄️ flake.nix<br/>Auto-discovery]\n\n    P1[👤 profiles/paper]\n    P2[👤 profiles/guest]\n\n    H1[🖥️  hosts/sacculos]\n    H2[💻 hosts/laptop]\n\n   NM[⚙️ nixos/modules<br/>System services]\n   PS[📦 profiles/shared<br/>Base configs&#x26;packages]\n\n    F --> H1\n    F --> H2\n    \n    H1 --> P1\n    H1 --> P2\n    H2 --> P2\n    \n    P1 --> PS\n    P2 --> PS\n    \n    H1 --> NM\n    H2 --> NM\n    \n    classDef flakeStyle stroke:#517599,stroke-width:2px,color:currentColor\n    classDef hostStyle stroke:#5e81ac,stroke-width:2px,color:currentColor\n    classDef profileStyle stroke:#8fbcbb,stroke-width:2px,color:currentColor\n    classDef sharedStyle stroke:#d08770,stroke-width:2px,color:currentColor\n    classDef moduleStyle stroke:#bf616a,stroke-width:2px,color:currentColor\n    \n    class F flakeStyle\n    class H1,H2 hostStyle\n    class P1,P2 profileStyle\n    class PS sharedStyle\n    class NM moduleStyle&#x22;">flowchart TD
    F[❄️ flake.nix&#x3C;br/>Auto-discovery]

    P1[👤 profiles/paper]
    P2[👤 profiles/guest]

    H1[🖥️  hosts/sacculos]
    H2[💻 hosts/laptop]

   NM[⚙️ nixos/modules&#x3C;br/>System services]
   PS[📦 profiles/shared&#x3C;br/>Base configs&#x26;packages]

    F --> H1
    F --> H2
    
    H1 --> P1
    H1 --> P2
    H2 --> P2
    
    P1 --> PS
    P2 --> PS
    
    H1 --> NM
    H2 --> NM
    
    classDef flakeStyle stroke:#517599,stroke-width:2px,color:currentColor
    classDef hostStyle stroke:#5e81ac,stroke-width:2px,color:currentColor
    classDef profileStyle stroke:#8fbcbb,stroke-width:2px,color:currentColor
    classDef sharedStyle stroke:#d08770,stroke-width:2px,color:currentColor
    classDef moduleStyle stroke:#bf616a,stroke-width:2px,color:currentColor
    
    class F flakeStyle
    class H1,H2 hostStyle
    class P1,P2 profileStyle
    class PS sharedStyle
    class NM moduleStyle
</code><div id="mermaid-container" role="dialog"><div id="mermaid-space"><div class="mermaid-content"></div></div></div></pre>
<h1 id="the-catch">The catch?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#the-catch" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>ofc, with enough skill you can still mess it up completely by wiring dependencies <em>in all the wrong places</em></p> ]]></description>
    <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>sccl_nix: Декларативный рай</title>
    <link>https://shiza.sccl.cc/ru/it/os/sccl_nix</link>
    <guid>https://shiza.sccl.cc/ru/it/os/sccl_nix</guid>
    <description><![CDATA[ <h1 id="если-этот-shitpost-like-статья-выглядит-как-шиза">Если этот shitpost-like статья выглядит как шиза<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#если-этот-shitpost-like-статья-выглядит-как-шиза" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Нормальная дока на ангельском: <a href="https://github.com/scclie/sccl_nix" class="external">github/scclie/sccl_nix/README.md<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a></p>
<h1 id="ная-зачем"><del>На*&#x26;я</del> Зачем?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#ная-зачем" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Потому, что необдуманный <a href="https://nixos.org/" class="external">NixOs<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> config - это всегда один и тот же сценарий:</p>
<ul>
<li>сначал “аккуратно структурируешь”</li>
<li>добавляешь второй хост</li>
<li>потом третий</li>
<li>прог всяких сыпешь, конфигов, исключений</li>
<li><code>/etc/nixos</code> превращается в помойку с условными <code>if hostname == ...</code></li>
</ul>
<blockquote>
<p>“ладно, сейчас я это нормально рефакторну”</p>
</blockquote>
<p><em>(нет)</em></p>
<hr>
<h1 id="чотут">Чотут?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#чотут" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Дотфайлы разделены на 3 сущности:</p>
<ul>
<li><code>hosts</code> - железо и вся системная шалуха</li>
<li><code>profiles</code> - пользователь</li>
<li><code>shared</code> - всё, что ты устал копировать</li>
</ul>
<p>машина != пользователь != окружение</p>
<hr>
<h2 id="hosts">hosts<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#hosts" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Всё, что нельзя синхронить между разными машинами</p>
<ul>
<li>диски</li>
<li>дрова</li>
<li>network</li>
<li>system packages</li>
</ul>
<h2 id="profiles">profiles<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#profiles" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Это уже “человек”</p>
<ul>
<li>окружение(-я)</li>
<li>свои проги</li>
<li>настройки шелла</li>
<li>весь этот user-level мусор</li>
</ul>
<p>На одном хосте может быть сколько угодно профилей, хоть для разных людей, хоть под какие-то свои задачи.
Система билдится под хост, а профили подтягиваются</p>
<h2 id="shared">shared<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#shared" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Это попытка остановить копипасту</p>
<ul>
<li>базовые пакеты</li>
<li>wm конфиги</li>
<li>дефолтные штуки</li>
</ul>
<hr>
<h2 id="как-эт-связано">Как эт связано<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#как-эт-связано" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Максимально просто:</p>
<pre><button class="expand-button" aria-label="Expand mermaid diagram" data-view-component><svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path fill-rule="evenodd" d="M3.72 3.72a.75.75 0 011.06 1.06L2.56 7h10.88l-2.22-2.22a.75.75 0 011.06-1.06l3.5 3.5a.75.75 0 010 1.06l-3.5 3.5a.75.75 0 11-1.06-1.06l2.22-2.22H2.56l2.22 2.22a.75.75 0 11-1.06 1.06l-3.5-3.5a.75.75 0 010-1.06l3.5-3.5z"></path></svg></button><code class="mermaid" data-clipboard="&#x22;flowchart TD\n    F[❄️ flake.nix<br/>Auto-discovery]\n\n    P1[👤 profiles/paper]\n    P2[👤 profiles/guest]\n\n    H1[🖥️  hosts/sacculos]\n    H2[💻 hosts/laptop]\n\n   NM[⚙️ nixos/modules<br/>System services]\n   PS[📦 profiles/shared<br/>Base configs&#x26;packages]\n\n    F --> H1\n    F --> H2\n    \n    H1 --> P1\n    H1 --> P2\n    H2 --> P2\n    \n    P1 --> PS\n    P2 --> PS\n    \n    H1 --> NM\n    H2 --> NM\n    \n    classDef flakeStyle stroke:#517599,stroke-width:2px,color:currentColor\n    classDef hostStyle stroke:#5e81ac,stroke-width:2px,color:currentColor\n    classDef profileStyle stroke:#8fbcbb,stroke-width:2px,color:currentColor\n    classDef sharedStyle stroke:#d08770,stroke-width:2px,color:currentColor\n    classDef moduleStyle stroke:#bf616a,stroke-width:2px,color:currentColor\n    \n    class F flakeStyle\n    class H1,H2 hostStyle\n    class P1,P2 profileStyle\n    class PS sharedStyle\n    class NM moduleStyle&#x22;">flowchart TD
    F[❄️ flake.nix&#x3C;br/>Auto-discovery]

    P1[👤 profiles/paper]
    P2[👤 profiles/guest]

    H1[🖥️  hosts/sacculos]
    H2[💻 hosts/laptop]

   NM[⚙️ nixos/modules&#x3C;br/>System services]
   PS[📦 profiles/shared&#x3C;br/>Base configs&#x26;packages]

    F --> H1
    F --> H2
    
    H1 --> P1
    H1 --> P2
    H2 --> P2
    
    P1 --> PS
    P2 --> PS
    
    H1 --> NM
    H2 --> NM
    
    classDef flakeStyle stroke:#517599,stroke-width:2px,color:currentColor
    classDef hostStyle stroke:#5e81ac,stroke-width:2px,color:currentColor
    classDef profileStyle stroke:#8fbcbb,stroke-width:2px,color:currentColor
    classDef sharedStyle stroke:#d08770,stroke-width:2px,color:currentColor
    classDef moduleStyle stroke:#bf616a,stroke-width:2px,color:currentColor
    
    class F flakeStyle
    class H1,H2 hostStyle
    class P1,P2 profileStyle
    class PS sharedStyle
    class NM moduleStyle
</code><div id="mermaid-container" role="dialog"><div id="mermaid-space"><div class="mermaid-content"></div></div></div></pre>
<h1 id="подвох">Подвох?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#подвох" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<p>Ну конечно при большом скилле и тут можно насрать, накидав зависимостей <em>не туда</em></p> ]]></description>
    <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
  </item><item>
    <title>Shaking. Visuomotor Feedback Loop</title>
    <link>https://shiza.sccl.cc/en/Games/Aim/Shaking</link>
    <guid>https://shiza.sccl.cc/en/Games/Aim/Shaking</guid>
    <description><![CDATA[ <p>The majority of tracking novices experience shakiness. During aiming, they perform movements in jerks. Each mouse flick is a separate action, followed by result analysis and another flick. The crosshair moves crookedly - overreaction occurs, along with multiple unnecessary movements, which further complicates subsequent analysis.</p>
<h2 id="visuomotor-feedback-loop">Visuomotor Feedback Loop<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#visuomotor-feedback-loop" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>This entire phenomenon can be described by a single term - Visuomotor Feedback Loop. Essentially, this is an information processing cycle that the nervous system runs at maximum possible speed:</p>
<p>Loop stages:</p>
<ol>
<li>
<p>Visual analysis. The eye captures the current position of the target and its trajectory. Assessment of distance, movement vector, movement speed.</p>
</li>
<li>
<p>Information processing. The brain processes visual data and calculates the necessary motor command. Micro-calculation occurs: distance, route prediction, turn angle calculation, etc.</p>
</li>
<li>
<p>Command execution. Muscles receive the signal and perform the movement. The mouse moves to the desired position.</p>
</li>
<li>
<p>Repeat. The loop closes and starts again.</p>
</li>
</ol>
<p>Reactive tracking works precisely on the basis of this loop. This is a sequence of micro-corrections that occur at such speed that they appear as a single smooth action. Even pro players perform the same micro-corrections, but their interpolation (smoothing between cycles) reaches a level where the movement looks absolutely smooth - each micro-correction adds to the initial vector rather than being a new movement vector. Plus, an experienced system incorporates slight trajectory prediction, pre-calculating the target’s next position.</p>
<h2 id="novice-vs-professional">Novice vs Professional<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#novice-vs-professional" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Novice:</p>
<ul>
<li>Sees target → processes information slowly → movement calculation (often occurs incorrectly, with artifacts and unnecessary movements) → hand performs action → result analysis → waiting → next flick</li>
</ul>
<p>Noticeable gaps appear between loop cycles. Each flick is perceived as a separate, discrete operation rather than part of a continuous flow.</p>
<p>Professional:</p>
<ul>
<li>Sees target → fast accurate information processing → micro-correction, even if the initial movement was inaccurate → instant result analysis → next correction</li>
</ul>
<p>The professional’s loop spins <em>faster</em>. Unlike the novice, an experienced player is capable of qualitatively correcting their previous movements - for example, while previously moving in a straight line, they can add precise correction within the same movement vector such that it won’t look like a flick or shake. These micro-adjustments layer upon each other, creating the appearance of smooth, continuous tracking.</p>
<h2 id="skill-development-mechanism">Skill Development Mechanism<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#skill-development-mechanism" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Many hours of training in aim trainers allow for optimization of the speed and effectiveness of the visuomotor feedback loop. The system learns to:</p>
<ul>
<li>
<p>Analyze visual flow faster</p>
</li>
<li>
<p>Analyze qualitatively - form more precise motor commands without unnecessary movements</p>
</li>
</ul>
<p>Result: micro-corrections that previously were visible as distinct jerks begin to merge into a single smooth movement.</p>
<h2 id="conclusion">Conclusion<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#conclusion" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Shakiness and jerks (flickshots with noticeable intervals) are signs of insufficient speed and accuracy of information processing. The system simply doesn’t manage to perform the necessary number of micro-corrections and has to make macro-movements.</p>
<p>Smooth tracking is the result of high speed and loop efficiency. Micro-corrections occur so frequently that they become practically invisible.</p>
<p>Tracking skill development is acceleration of the visuomotor feedback loop and optimization of its efficiency. Over time: better prediction, better interpolation, better synchronization, better analysis quality, artifacts disappear, etc.</p> ]]></description>
    <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Тряска. Зрительно-моторная петля</title>
    <link>https://shiza.sccl.cc/ru/Games/Aim/Shaking</link>
    <guid>https://shiza.sccl.cc/ru/Games/Aim/Shaking</guid>
    <description><![CDATA[ <h2 id="проблема-микро-флик-флик-флик">Проблема микро-флик-флик-флик<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#проблема-микро-флик-флик-флик" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>У бол-ва новичков в трекинге присутсвует тряска. Пре аиминге они совершают движения рывками. Каждый флик мышкой - это отдельное действие, после которого следует анализ результата и очередной флик Прицел перемещается криво - происодит оверреакт, и множетсво лишних движений, что ещё больше усложняет дальнейший анализ.</p>
<h2 id="зрительно-моторная-петля">Зрительно-моторная петля<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#зрительно-моторная-петля" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Все это явление можно описать одним термином - Зрительно-моторная петля (visuomotor feedback loop). По сути, это цикл обработки информации, который нервная система прогоняет на максимально возможной скорости:</p>
<p>Этапы петли:</p>
<ol>
<li>
<p>Визуальный анализ. Глаз фиксирует текущее положение цели и ее траекторию. Оценка дистанции, вектора движения, скорости перемещения.</p>
</li>
<li>
<p>Обработка информации. Мозг обрабатывает визуальные данные и рассчитывает необходимую моторную команду. Происходит микро-калькуляция: дистанция, предугадание маршрута, расчет угла поворота и т.п.</p>
</li>
<li>
<p>Исполнение команды. Мышцы получают сигнал и совершают движение. Мышь перемещается в нужную позицию.</p>
</li>
<li>
<p>Повтор. Петля замыкается и начинается заново.</p>
</li>
</ol>
<p>Реактивный трекинг работает именно на основе этой петли. Этопоследовательность микро-коррекций, которые происходят с такой скоростью, что кажутся единым плавным действием. Даже про-игроки совершают те же микро-коррекции, только их интерполяция (сглаживание между циклами) достигает уровня, при котором движение выглядит абсолютно гладким, каждая микро коррекция плюсуется к инишиал вектору, а не является новым вектором движения. Плюс опытная система закладывает небольшое предугадание траектории, допредсказывая следующую позицию цели.</p>
<h2 id="новичок-vs-профессионал">Новичок vs Профессионал<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#новичок-vs-профессионал" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Новичок:</p>
<ul>
<li>Видит таргет → долго обрабатывает информацию → расчет движения (часто происходит некорректно, с артефактами, лишними движениями) → рука совершает действие → анализ результата → ожидание → следующий флик</li>
</ul>
<p>Между циклами петли возникают ощутимые пробелы. Каждый флик воспринимается как отдельная, дискретная операция, а не как часть непрерывного потока.</p>
<p>Профессионал:</p>
<ul>
<li>Видит таргет → быстрая точная обработка информации → микро-коррекция, даже если первоначальное движение было неточным → мгновенный анализ результата → следующая коррекция</li>
</ul>
<p>Петля у профессионала крутится <em>быстрее</em>. В отличии от новичка - опытный игрок способен качественно корректировать прошлые свои движения - например двигаясь ранее по прямой - он способен в рамках того же вектора движения добавлять точную коррекцию, что это не будет выглядить как флик или тряска. Эти микро-регулировки накладываются друг на друга, создавая видимость гладкого, непрерывного трекинга.</p>
<h2 id="механизм-развития-навыка">Механизм развития навыка<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#механизм-развития-навыка" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Многочасовая тренировка в аим-тренерах позволяет оптимизировать скорости и эффективность зрительно-моторной петли. Система обучается:</p>
<ul>
<li>
<p>Анализировать визуальный поток быстрее</p>
</li>
<li>
<p>Качественно анализировать - формировать более точные моторные команды, без лишних движений</p>
</li>
</ul>
<p>Результат: микро-коррекции, которые раньше были видны как отчетливые рывки, начинают сливаться в единое гладкое движение.</p>
<h2 id="итог">Итог<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#итог" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Тряска и рывки (flickshot с заметными интервалами) - это признак недостаточной скорости и точности обработки информации. Система просто не успевает совершить необходимое количество микро-коррекций, и приходится делать макро-движения.</p>
<p>Плавный трекинг - это результат высокой скорости и эффективности петли. Микро-коррекции происходят столь часто, что становятся практически незаметны.</p>
<p>Развитие навыка трекинга - это ускорение зрительно-моторной петли и оптимизация ее эффективности. Со временем лучше прогнозирование, лучше интерполяция, лучше синхронизация, лучше качество анализа, пропадают артефакты и т.п.</p> ]]></description>
    <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>How to Make a Good Mousepad Review</title>
    <link>https://shiza.sccl.cc/en/Peripheral/Mousepads/How-to-make-a-good-mousepad-review</link>
    <guid>https://shiza.sccl.cc/en/Peripheral/Mousepads/How-to-make-a-good-mousepad-review</guid>
    <description><![CDATA[ <h1 id="tips-for-accurately-explaining-mousepad-characteristics">Tips for accurately explaining mousepad characteristics:<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#tips-for-accurately-explaining-mousepad-characteristics" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<hr>
<h2 id="1-surface-texture">1. Surface Texture<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#1-surface-texture" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Abrasive</strong> / <strong>Medium Abrasive</strong> / <strong>Smooth</strong></li>
<li>Sandpaper-like or not</li>
<li>How it interacts with skin and clothing sleeves
<img src="../../../pictures/Peripheral/k83_texture.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="2-friction-properties">2. Friction Properties<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#2-friction-properties" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Dynamic Friction (Glide):</strong></p>
<ul>
<li>Resistance when the mouse is already in motion</li>
<li>The lower it is, the easier the mouse glides after the initial movement
<a href="../../../pictures/Peripheral/cisapadv2.mov" class="internal" data-slug="pictures/Peripheral/cisapadv2.mov"><img src="../../../pictures/Peripheral/cisapadv2.png" width="100" height="auto" alt="cisapadv2" loading="lazy"></a></li>
</ul>
<p><strong>Static Friction (Stopping Power):</strong></p>
<ul>
<li>Resistance at the moment you start moving the mouse</li>
<li>The higher it is, the easier it is to stop the mouse precisely, but the harder it is to initiate movement
<img src="../../../pictures/Peripheral/mousepad_friciton_test.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="3-glide-characteristics">3. Glide Characteristics<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#3-glide-characteristics" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Mudpad Effect</strong>: High static + low dynamic friction == the mouse feels stuck at the start but glides smoothly afterward</li>
<li><strong>Consistent Glide</strong>: Minimal difference between static and dynamic friction
<img src="../../../pictures/Peripheral/old_mousepad.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="4-speed-rating-conventional">4. Speed Rating (Conventional)<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#4-speed-rating-conventional" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Control</strong>: High static and dynamic resistance, often a “mudpad,” but not always; the meta is often defined by static friction.</li>
<li><strong>Mid (Balanced)</strong>: Moderate static and dynamic resistance, suitable for everything.</li>
<li><strong>Speed</strong>: Low resistance, heavy on tracking.
<em>You can play any game on any pad with enough skill and dedication; it’s primarily a question of average comfort.</em></li>
</ul>
<h2 id="5-xy-axis-consistency">5. X/Y Axis Consistency<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#5-xy-axis-consistency" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Is there a difference between left-right and up-down movement?</li>
<li>Ideally, the X/Y ratio should be 1:1.</li>
</ul>
<h2 id="6-durability--maintenance">6. Durability &#x26; Maintenance<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#6-durability--maintenance" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Moisture Resistance:</strong></p>
<ul>
<li>A water absorption test usually indicates how quickly the pad will get dirty in general.
<img src="../../../pictures/Peripheral/mat_water_resist.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<p><strong>How to clean?</strong></p>
<ul>
<li>Some pads are picky about the choice of cleaning products.
<img src="../../../pictures/Peripheral/ins.gif" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="7-base-construction">7. Base Construction<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#7-base-construction" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Firmness Level:</strong></p>
<ul>
<li><strong>X-Soft</strong>: Significant squish, can be pressed down almost to the desk.</li>
<li><strong>Soft</strong>: Noticeable, springy give.</li>
<li><strong>Mid</strong>: Firm support, almost no compression.
<img src="../../../pictures/Peripheral/xsoft.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="8-surface-composition">8. Surface Composition<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#8-surface-composition" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Weave type (Tight, Jacquard, Hybrid, Cordura, Textured)</li>
<li>Material quality and stitching quality on the edges</li>
<li>Base material and how well it grips the desk
<img src="../../../pictures/Peripheral/raiden.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="9-comparative-analysis">9. Comparative Analysis<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#9-comparative-analysis" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Comparison with other popular models (Artisan, LGG, MGG, X-Raypad)</li>
<li>Similarities in:
<ul>
<li>Speed and glide characteristics</li>
<li>Texture and tactile feel</li>
<li>Overall user experience</li>
</ul>
</li>
<li>Example: “Similar to the Artisan Raiden, but a bit slower” or “Feels like the G-SR-SE, but not as muddy”</li>
</ul>
<blockquote class="callout example" data-callout="example">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Additional Tips: </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<ol>
<li>Test with different mouse skates for a complete picture.</li>
</ol>
<ul>
<li>It might be the case that:</li>
<li>Skates A are faster on Pad X and slower on Pad Y.</li>
<li>Skates B are faster on Pad Y and slower on Pad X.</li>
</ul>
<ol start="2">
<li>How the glide changes over time. Some pads <em>break in</em> after a week and feel different.</li>
<li>What it’s best suited for (Arena shooters or tactical/angle-holding games. Better for Tracking, Switching, Click-timing, or Universal).</li>
</ol>
</div>
</div>
</blockquote>
<blockquote class="callout tip" data-callout="tip">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Good Example </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p><a href="https://docs.google.com/spreadsheets/d/159aQ_JsUOg-KDLwOGdM8WyOEgfaDkmsb6Vlxnkw23-c/htmlview#gid=907849023" class="external">9Sanya’s Spreadsheet<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>
<img src="../../../pictures/Peripheral/cisa_ss.png" width="auto" height="auto" alt="" loading="lazy"></p>
</div>
</div>
</blockquote> ]]></description>
    <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Как сделать хороший обзор на коврик для мыши</title>
    <link>https://shiza.sccl.cc/ru/Peripheral/Mousepads/How-to-make-a-good-mousepad-review</link>
    <guid>https://shiza.sccl.cc/ru/Peripheral/Mousepads/How-to-make-a-good-mousepad-review</guid>
    <description><![CDATA[ <blockquote class="callout info" data-callout="info">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>This page on English: <a href="../../../EN-How-to-make-a-good-mousepad-review" class="internal alias" data-slug="EN-How-to-make-a-good-mousepad-review">EN How to make a good mousepad review</a></p></div>
                  
                </div>
</blockquote>
<h1 id="типсы-на-грамотное-объяснение-характеристик-коврика-для-мыши">Типсы на грамотное объяснение характеристик коврика для мыши:<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#типсы-на-грамотное-объяснение-характеристик-коврика-для-мыши" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h1>
<hr>
<h2 id="1-текстура-поверхности">1. Текстура поверхности<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#1-текстура-поверхности" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Абразивная</strong> / <strong>Средняя абразивная</strong> / <strong>Гладкая</strong></li>
<li>Наждак/не наждак</li>
<li>Дружит ли с кожей и рукавом
<img src="../../../pictures/Peripheral/k83_texture.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="2-силы-трения">2. Силы трения<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#2-силы-трения" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Динамическое трение (скольжение):</strong></p>
<ul>
<li>Сопротивление, когда мышь уже в движении</li>
<li>Чем ниже — тем проще она несется после старта
<a href="../../../pictures/Peripheral/cisapadv2.mov" class="internal" data-slug="pictures/Peripheral/cisapadv2.mov"><img src="../../../pictures/Peripheral/cisapadv2.png" width="100" height="auto" alt="cisapadv2" loading="lazy"></a></li>
</ul>
<p><strong>Статическое трение (остановка):</strong></p>
<ul>
<li>Сопротивление в момент, начала движения мышью</li>
<li>Чем выше — тем проще стоппить мышь, но сложнее стартовать
<img src="../../../pictures/Peripheral/mousepad_friciton_test.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="3-характер-скольжения">3. Характер скольжения<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#3-характер-скольжения" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Эффект болота</strong>: Высокое статическое + низкое динамическое трение == мышь вязнет на старте, но потом неплохо скользит</li>
<li><strong>Ровное скольжение</strong>: Минимальная разница между статикой и динамикой
<img src="../../../pictures/Peripheral/old_mousepad.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="4-скоростной-рейтинг-условный">4. Скоростной рейтинг (условный)<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#4-скоростной-рейтинг-условный" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li><strong>Контрольный (Control)</strong>: Высокое статик и динамик сопротивление, зачастую болото, но не всегда, мета статики</li>
<li><strong>Средний (Mid)</strong>: Умеренное статик и динамик сопротивление, подходит для всего</li>
<li><strong>Быстрый (Speed)</strong>: Низкое сопротивление, трекинг хеви
<em>на любом ковре при желеании и достаточной скиллухе можно играть что угодно, вопрос удобства в среднем</em></li>
</ul>
<h2 id="5-равенство-по-осям-xy">5. Равенство по осям X/Y<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#5-равенство-по-осям-xy" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Есть ли разница между движением влево-вправо и вверх-вниз</li>
<li>В идеале соотношение X/Y</li>
</ul>
<h2 id="6-живучесть">6. Живучесть<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#6-живучесть" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Сопротивление влаге:</strong></p>
<ul>
<li>Тест на впитываемость влаги обычно отражает насколько быстро ковёр в целом будет загрязняться
<img src="../../../pictures/Peripheral/mat_water_resist.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<p><strong>Чем мыть?</strong></p>
<ul>
<li>Некоторые ковры придирчивы к выбору средств для мытья
<img src="../../../pictures/Peripheral/ins.gif" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="7-подложка-база">7. Подложка (база)<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#7-подложка-база" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><strong>Жесткость:</strong></p>
<ul>
<li><strong>XSoft</strong>: Сильно проминается, можно вдавить чуть ли не до стола</li>
<li><strong>Soft</strong>: Чувствуется упругая податливость</li>
<li><strong>Mid</strong>: Твердая поддержка, почти не прогибается
<img src="../../../pictures/Peripheral/xsoft.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="8-состав-поверхности">8. Состав поверхности<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#8-состав-поверхности" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Тип плетения (плотное, жаккард, гибридное, кордура, рельефное)</li>
<li>Качество материала и прошивки краёв</li>
<li>Материал основы и насколько хорошо она держится за стол
<img src="../../../pictures/Peripheral/raiden.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ul>
<h2 id="9-сравнительный-анализ">9. Сравнительный анализ<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#9-сравнительный-анализ" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<ul>
<li>Сравнениее с другими популярными моделями (Artisan, lgg, mgg, x-raypad)</li>
<li>Сходства по:
<ul>
<li>Скорости и характеру скольжения</li>
<li>Тактильным ощущениям от текстуры</li>
<li>Общему впечатлению от использования</li>
</ul>
</li>
<li>Пример: “Похож на Artisan Raiden, но чуть меленее” или “Ощущения как от G-SR-SE, но не такой болотистый”</li>
</ul>
<blockquote class="callout example" data-callout="example">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Доп Типсы: </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<ol>
<li>Тест с разными глайдами на мышке для полной картины</li>
</ol>
<ul>
<li>может быть такое что</li>
<li>глайды A быстрее на коврике Х и медленее на коврике Y</li>
<li>глайды B быстрее на коврике Y и медленее на коврике X</li>
</ul>
<ol start="2">
<li>Характер глайда со временем, некоторые ковры через неделю <em>приглаживаются</em> и ощущаются иначе</li>
<li>Для чего он подходит больше всего (для ареновых шутеров или угловых. Лучше для трекинга, свитчинга, клинтинга или универсал)</li>
</ol>
</div>
</div>
</blockquote>
<blockquote class="callout tip" data-callout="tip">
<div class="callout-title">
                  <div class="callout-icon"></div>
                  <div class="callout-title-inner"><p>Хороший пример </p></div>
                  
                </div>
<div class="callout-content">
<div class="callout-content-inner">
<p><a href="https://docs.google.com/spreadsheets/d/159aQ_JsUOg-KDLwOGdM8WyOEgfaDkmsb6Vlxnkw23-c/htmlview#gid=907849023" class="external">Таблица 9Sanya<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> <img src="../../../pictures/Peripheral/cisa_ss.png" width="auto" height="auto" alt="" loading="lazy"></p>
</div>
</div>
</blockquote> ]]></description>
    <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>The Casualization of Aim - Why &quot;Pure&quot; Aim Skill Doesn&#039;t Decide Competitive Games</title>
    <link>https://shiza.sccl.cc/en/Games/Aim/Casualization-of-aim</link>
    <guid>https://shiza.sccl.cc/en/Games/Aim/Casualization-of-aim</guid>
    <description><![CDATA[ <p><img src="../../../pictures/aim/ground_tracking.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>In the world of cyber-athletes, hardcore gamers, and tryhards, the cult of aiming has been elevated to an absolute. Hours on training maps, endless duels, grinding in aim trainers, and the pursuit of the perfect sensitivity, mouse, mousepad, skates, posture, resolution, FOV, etc., etc. – these are the rituals of the modern neo-pilgrim, who believes that reaction speed and mouse precision will lead them to the top-1. But in reality, a hardcore analysis of most games <strong>“casualizes”</strong> aim as a key skill. In most modern competitive multiplayer games, “pure” aim is deliberately placed in a subordinate position by the developers. Its potential is harshly limited by systems designed to <strong>level the playing field</strong> between players of different skill levels.</p>
<h2 id="the-great-equalizer-rng-movement-and-uncontrollable-factors"><strong>The Great Equalizer: RNG, Movement, and Uncontrollable Factors</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#the-great-equalizer-rng-movement-and-uncontrollable-factors" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>The main enemy of raw aiming skill is randomness and limitations. Developers figured out long ago that a game where victory belongs entirely to the one with faster reactions and better mouse control is doomed to a niche audience <em>(the Quake series serves as an example)</em>. New players would leave, their asses sore, and matchmaking wouldn’t be able to handle the giant skill gap between the top and the bottom.</p>
<p>Hence, the crutch systems come into play:</p>
<ul>
<li>
<p><strong>Random Bullet Spread (RNG Spread):</strong> The most obvious example. Even in the most popular tactical shooter <em>Counter-Strike</em>, which is considered the esports benchmark <em>(well, at least it’s the most popular)</em>, bullets from any weapon while standing don’t fly strictly to one point, but within a certain circle of spread. In <em>Valorant</em>, this spread is even more pronounced. There’s no way to guaranteed control every bullet - you can only <strong>increase the probability</strong> of a hit. That’s a huge difference. Even a memorized spray pattern isn’t an exact science; it’s a ritual dance around random deviation.
<img src="../../../pictures/aim/rng_spread.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Movement Speed Control:</strong> A key but often overlooked aspect. In many games (<strong>CS2</strong>, <strong>Valorant</strong>, <strong>R6 Siege</strong>) the base movement speed of characters is relatively <strong>low and predictable</strong>. This is a powerful equalizing tool. <strong>Against a slow target, both a noob and a pro will aim almost equally effectively.</strong> The difference in their skill will be minimal. A tracking genius cannot reveal their full potential simply because the target doesn’t challenge them. The entire “spread” between bad and good aim shrinks. The difference becomes noticeable when a fast, unpredictable target appears. Here, a noob will simply get lost and won’t be able to hit it, while a cracked player, albeit with worse results than against a slow target, will still be able to track it. Thus, <strong>slow movement is a hidden mechanism that prevents a strong aimer from unleashing their full potential</strong> against a weak opponent.
<img src="../../../pictures/aim/apex_glide.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Moving Accuracy:</strong> A mechanic almost entirely removed from tactical shooters. In the same <em>CS</em>, firing while moving is synonymous with “miss.” This is a conscious decision that shifts the focus from shooting mechanics to positioning and tactics (counter-strafing, stop-shots).
<img src="../../../pictures/aim/strafe_rng.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Bloom, damage falloff, complex ballistics</strong> - all these are layers of RNG that add a factor of luck to the equation. Sometimes a wild shot will hit, while a perfectly aimed one will miss.
<img src="../../../pictures/aim/ballistics.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
</ul>
<p>The core idea is to <strong>lower the skill ceiling for aim</strong> (to neutralize the aim advantage). The difference between a good and a god-like aimer is negated by the fact that <strong>even a god can’t guarantee a hit</strong> due to RNG, and against a slow target, their superiority won’t be as noticeable. A novice always has a chance for a random hit or a “lucky” headshot.</p>
<h2 id="high-ttk-vs-low-ttk-the-aim-dependency-paradox"><strong>High TTK vs Low TTK: The Aim-Dependency Paradox</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#high-ttk-vs-low-ttk-the-aim-dependency-paradox" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Here lies the main paradox that many fail to grasp.</p>
<ul>
<li>
<p><strong>Low TTK (Time To Kill):</strong> Characteristic of tactical shooters (CS2, Valorant, R6 Siege). A kill happens in 1-2 hits. It would seem that jewel-like aim is needed here to land headshots consistently. But in reality, <strong>aim is less important</strong> than it seems. The decisive factor is often not the pure shot, but: <strong>Positioning</strong> (you can catch an enemy by surprise, get an easy kill without even starting a duel), <strong>Angle knowledge</strong> (pre-fires, off-angles, etc.), <strong>Luck</strong> (a random bullet flew into the face. A noob just jerked their hand, fired while running/jumping and one-tapped a much stronger player).
<img src="../../../pictures/aim/valorant_headshot.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>High TTK:</strong> A classic for arena shooters (<em>Quake</em>, <em>Apex Legends</em>, <em>Overwatch 2</em>, <em>The Finals</em>). Here, to kill an enemy, you need to continuously track them and hit them <strong>many times in a row</strong>. It’s simply impossible to track by accident for dozens of seconds.
<img src="../../../pictures/aim/quake_lg.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
</ul>
<p>And this is where <strong>raw aim takes the front seat</strong>. A lucky shot won’t decide anything here. You need to <strong>track the target long and accurately</strong>. In high-TTK games, the gap in aiming skill between players is much more visible. A strong player will consistently track and kill a novice, who simply won’t have the precision and mouse control to deal enough damage. Tactics and positioning alone won’t solve the problem here – you absolutely need to hit your shots (though you can try to compensate with movement, which again expands the aim-advantage spread based on the points above).</p>
<h2 id="escape-from-aim-tactics-movement-and-abstract-abilities"><strong>Escape from Aim: Tactics, Movement, and Abstract Abilities</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#escape-from-aim-tactics-movement-and-abstract-abilities" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Since pure aim is a difficult skill, requiring thousands of hours to hone, developers shift the focus to other, more “democratic” mechanics:</p>
<ol>
<li><strong>Tactics and Communication.</strong> You can be terrible with a mouse but still outsmart your opponent by taking unexpected positions, making calls for team play, and using utility.
<img src="../../../pictures/aim/dust_tactics.png" width="auto" height="auto" alt="" loading="lazy"></li>
<li><strong>Movement.</strong> In tactical shooters, it works as a <strong>limiter</strong> (slow and predictable). In arena shooters, it works as a <strong>divider</strong> (fast and complex), allowing a skilled player to dodge and demonstrate superior tracking.
<img src="../../../pictures/aim/Thumbnail_Best_Movement_Guide.png" width="auto" height="auto" alt="" loading="lazy"></li>
<li><strong>Abilities.</strong> The most powerful tool for de-leveling aim. Why aim perfectly when you can spam your opponent with grenades, turrets, smokes, slow-fields, and flashbangs? These mechanics require not precision, but good decision-making and timing.
<img src="../../../pictures/aim/overwatch_zarub.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ol>
<hr>
<h2 id="conclusion"><strong>Conclusion</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#conclusion" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Aim undoubtedly remains an important skill. But most competitive games are designed to <strong>“casualize”</strong> it, to make it <strong>one of many factors for victory, but not the only one</strong>, and certainly not the primary (decisive) one. Slow movement, RNG spread, and an abundance of abilities are part of a design philosophy aimed at keeping the game accessible to millions, not just a select few with perfectly honed motor skills.</p> ]]></description>
    <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Muscle Memory, Part of the Aiming Skill Set</title>
    <link>https://shiza.sccl.cc/en/Games/Aim/Muscle-memory</link>
    <guid>https://shiza.sccl.cc/en/Games/Aim/Muscle-memory</guid>
    <description><![CDATA[ <p>A myth lives in the mind of the average competitive gamer: that muscle memory is the holy grail of aim. The idea is that you just need to grind thousands of hours on one sensitivity, so that your hand, without any input from the brain, performs perfect movements. To memorize, like a virtuoso violinist scales, every centimeter of the mousepad, every micro-movement of the mouse. This idea is just as harmful and dangerous a coping mechanism as the belief that “aim is everything” (see <a href="../../../EN-Casualization-of-aim" class="internal alias" data-slug="EN-Casualization-of-aim">EN Casualization of aim</a>).</p>
<p><img src="../../../pictures/aim/muscle_memory.png" width="auto" height="auto" alt="" loading="lazy"></p>
<h2 id="not-memorization-but-adaptation"><strong>Not Memorization, but Adaptation</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#not-memorization-but-adaptation" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>The main misconception is the idea of muscle memory as a rigid recording in the neurons: “a 3.7 cm turn to the right == a headshot.” In reality, it’s not about recording specific movements, but about <strong>forming the ability to effectively adapt</strong> to different conditions, to conduct analysis.
When it comes to aim, the brain and nervous system learn not to remember mouse positions, but to <strong>solve motor tasks</strong>: “The target is moving like this, I need to apply a force of this specific strength and duration.”</p>
<h2 id="sens-schizophrenia-the-perfect-sens-is-an-illusion"><strong>Sens-Schizophrenia: The Perfect Sens is an Illusion</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#sens-schizophrenia-the-perfect-sens-is-an-illusion" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Acolytes of the cult believe that by finding their <em>perfect</em> sensitivity (let’s say, 52 cm/360), they will reach nirvana. But the world is unstable. What happens if:</p>
<ul>
<li>You change your mousepad/skates to slightly slower/faster ones</li>
<li>A speck of dust gets on the skates</li>
<li>The weather brings higher humidity – the mousepad becomes a bit slower</li>
<li>You’ve worn a slow spot on the mousepad, where movement in the center is slower than on the edges</li>
</ul>
<p><img src="../../../pictures/aim/change_skates_gg.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Any of these micro-changes <strong>completely invalidates</strong> the idea of memorized movements. With your <em>ideal</em> 52 cm/360 sensitivity, you de facto need to apply different amounts of force to perform the same movements expecting the same result. And if you rely purely on muscle memory, you will miss (You perfectly applied the force for a 10cm movement to the left, but the mouse traveled only 9.5cm or a full 10.5cm). Because your brain expected one level of resistance but got another.</p>
<h2 id="aim-is-basketball-an-analogy"><strong>Aim is Basketball: An Analogy</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#aim-is-basketball-an-analogy" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>A basketball player throwing the ball into the hoop doesn’t calculate millimeters or reproduce a shot memorized down to the nanosecond. They assess the distance, the defenders’ movements, their own momentum, and <strong>adapt the shot on the fly</strong>. They rely on a general feel for their body, the ball, and the hoop’s position. They can score from different positions, with different approaches, using one or two hands, with or without wind, even with balls of different weight and bounce. Because they have developed <strong>general coordination</strong>, not memorized one specific shot.</p>
<p>It’s the same with a cracked aimer. They don’t remember how many centimeters to move the mouse for a headshot from Mirage’s fireboxes into pit, they don’t know what hand movement is needed to turn 20°. They see the target, their brain instantly assesses the distance from the crosshair to the target and the target’s movement speed, and their arm, wrist, and fingers <strong>cooperate</strong> to solve this task. The composition of this “cooperation” will change depending on the sensitivity.</p>
<ul>
<li><strong>On a low sensitivity (50 cm/360)</strong> the main work is done by the forearm and shoulder for large turns, while the wrist and fingers make micro-corrections.</li>
<li><strong>On a high sensitivity (20 cm/360)</strong> the wrist and fingers are actively engaged, while the movement from the shoulder and forearm is reduced.</li>
</ul>
<p><strong>The perfect aimer isn’t the one who memorized one sensitivity, but the one who developed neuromotor control that allows them to effectively use any sensitivity to solve the task.</strong> Depending on the task – the sensitivity can be different – for arena shooters a faster sens might be more convenient, while for tactical ones – a slower one.</p>
<p><img src="../../../pictures/aim/sens_chart.png" width="auto" height="auto" alt="" loading="lazy"></p>
<h2 id="the-visuomotor-feedback-loop"><strong>The Visuomotor Feedback Loop</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#the-visuomotor-feedback-loop" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>When you grind an aim trainer for hours, you’re not training your arm muscles. You’re training the <strong>speed and efficiency of the feedback loop</strong>:</p>
<ol>
<li><strong>Eye:</strong> Sees the target and its movement.</li>
<li><strong>Brain:</strong> Processes the visual information and calculates the necessary motor command.</li>
<li><strong>Hand:</strong> Executes the command.</li>
<li><strong>Repeat the cycle:</strong> analysis of the previous result.</li>
</ol>
<p>The essence of training is to shorten the time it takes to complete this loop (reduce analysis time) and increase the accuracy of the calculation in step №2. Muscle memory here is not memory of the movement, but <strong>memory of how different motor commands correlate with the result on the screen</strong>. It’s a skill of <strong>calibration</strong>, not reproduction.</p>
<hr>
<h2 id="conclusion"><strong>Conclusion</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#conclusion" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>An obsession with muscle memory and the search for the “one true” sensitivity is a dead end. It creates a fragile system that collapses at the slightest change in conditions.</p>
<p><strong>The true skill of aiming is not muscle memory, but visuomotor coordination.</strong> It’s the ability of your brain and body to quickly and accurately adapt to any conditions: a new sensitivity, a different gameplay style, a changed situation. It’s about plasticity, not rigidity. You need to develop not the <em>memory of the hand</em>, but the connection between the eye, the brain, and the hand. And then you’ll have that cracked aim.</p>
<p>With regular aim training – changing sensitivity stops being noticeable – you can easily jump between 24-34-38-44-55-66-77-88 <em>(etc., etc.)</em> cm/360 without feeling much difference – the speed of adaptation to new conditions will take mere seconds.</p> ]]></description>
    <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Мышечная память, часть навыка прицеливания</title>
    <link>https://shiza.sccl.cc/ru/Games/Aim/Muscle-memory</link>
    <guid>https://shiza.sccl.cc/ru/Games/Aim/Muscle-memory</guid>
    <description><![CDATA[ <p>В голове массового компетитив-игрока живет миф о мышечной памяти как о священном Граале аима. Мол, нужно просто намотать тысячи часов на одной сенсе, чтобы рука сама, без участия мозга, совершала идеальные движения. Заучить, как скрипач-виртуоз гаммы, каждый сантиметр ковра, каждый микродвижек мышкой. Эта идея - такой же вредный и опасный копинг, как и вера в то, что “аим решает всё” (см. <a href="../../../RU-Casualization-of-aim" class="internal alias" data-slug="RU-Casualization-of-aim">RU Casualization of aim</a>).</p>
<p><img src="../../../pictures/aim/muscle_memory.png" width="auto" height="auto" alt="" loading="lazy"></p>
<h2 id="не-запоминание-а-адаптация"><strong>Не запоминание, а адаптация</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#не-запоминание-а-адаптация" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Главное заблуждение - представление о мышечной памяти как о жесткой записи в нейронах: «поворот на 3.7 см вправо == хедшот». На самом деле, это не запись конкретных движений, а <strong>формирование способности эффективно адаптироваться</strong> к разным условиям, проводить анализ.
В случае с аимом мозг и нервная система учатся не запоминать положения мыши, а <strong>решать моторные задачи</strong>: “Цель движется так-то, нужно применить усилие такой-то силы и длительности”.</p>
<h2 id="сенса-шизофрения-идеальная-сенса--это-иллюзия"><strong>Сенса-шизофрения: идеальная сенса — это иллюзия</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#сенса-шизофрения-идеальная-сенса--это-иллюзия" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Адепты культа верят, что найдя свою <em>идеальную</em> сенсу (условно, 52 см/360), они достигнут нирваны. Но мир нестабилен. Что будет, если:</p>
<ul>
<li>Ты сменил коврик/глайды на чуть более медленный/быстрый</li>
<li>На глайды попала пылинка</li>
<li>Погода прокнула повыешнную влажность - ковёр стал чуть медленее</li>
<li>Ты натёр слоу-спот на ковре, движение в центре медленее чем по краям</li>
</ul>
<p><img src="../../../pictures/aim/change_skates_gg.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Любое из этих микро-изменений <strong>полностью инвалидирует</strong> идею о заученных движениях. С твоей <em>идеальной</em> сенсой 52 см/360 де-факто необходимо прилагать разные усилия для совершения одинаковых движений в ожидании одного результата. И если ты уповаешь на чистую мышечную память, ты промажешь (Ты идеально приложил усилия на движение 10см влево, но мышь прокатилась лишь 9.5см или целых 10.5см). Потому что твой мозг ожидал одного сопротивления, а получил другое.</p>
<h2 id="аим---баскетбол-аналогия"><strong>Аим - баскетбол: Аналогия</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#аим---баскетбол-аналогия" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Баскетболист, бросающий мяч в кольцо, не вычисляет миллиметры и не воспроизводит заученный до наносекунды бросок. Он оценивает дистанцию, движение защитников, свое ускорение и <strong>адаптирует бросок на лету</strong>. Он полагается на общее чувство тела, мяча и положение кольца. Он может забить с разных позиций, с разного разбега, одной или двумя руками, хоть с ветром, хоть с разным весом и упругостью мяча. Потому что он развил <strong>общую координацию</strong>, а не заучил один конкретный бросок.</p>
<p>Точно так же и жоский аимер. Он не помнит, на сколько сантиметров нужно сдвинуть мышь для хедшота на Мираже с фаирбоксов в яму, он не знает какое движение рукой ему нужно сделать чтоб повернуться на 20°. Он видит цель, его мозг мгновенно оценивает расстояние прицела до цели и скорость передвижения цели, и его рука, кисть, пальцы <strong>кооперируются</strong>, чтобы решить эту задачу. Состав этой “кооперации” будет меняться в зависимости от сенсы.</p>
<p><img src="../../../pictures/aim/plecho.png" width="auto" height="auto" alt="" loading="lazy"></p>
<ul>
<li><strong>На низкой сенсе (50 см/360)</strong> основную работу выполняет предплечье и плечо для крупных поворотов, а кисть и пальцы вносят микро-коррекции.</li>
<li><strong>На высокой сенсе (20 см/360)</strong> в дело активно вступают кисть и пальцы, движение плечом и предплечьем сокращается.</li>
</ul>
<p><strong>Идеальный аимер — это не тот, кто заучил одну сенсу, а тот, кто развил нейромоторный контроль, позволяющий ему эффективно использовать любую сенсу для решения задачи.</strong> В зависимости от задачи - сенса может быть разной - для ареновых шутеров более удобна будет быстрая сенса, а для тактических - медленная.</p>
<p><img src="../../../pictures/aim/sens_chart.png" width="auto" height="auto" alt="" loading="lazy"></p>
<h2 id="зрительно-моторная-петля"><strong>Зрительно-моторная петля</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#зрительно-моторная-петля" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Когда ты часами долбишь в аим-тренере, ты тренируешь не мышцы руки. Ты тренируешь <strong>скорость и эффективность петли обратной связи</strong>:</p>
<ol>
<li><strong>Глаз:</strong> Видит цель и ее движение.</li>
<li><strong>Мозг:</strong> Обрабатывает визуальную информацию и вычисляет необходимую моторную команду.</li>
<li><strong>Рука:</strong> Выполняет команду.</li>
<li><strong>Повтор круга:</strong> анализ результатов прошлого</li>
</ol>
<p>Суть тренировок - сократить время прохождения этой петли (уменьшить время на анализ) и повысить точность расчета в пункте №2. Мышечная память здесь - это не память о движении, а <strong>память о том, как разные моторные команды соотносятся с результатом на экране</strong>. Это навык <strong>калибровки</strong>, а не воспроизведения.</p>
<hr>
<h2 id="вывод"><strong>Вывод</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#вывод" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Зацикленность на мышечной памяти и поиске “той самой” сенсы - это путь в тупик. Он создает хрупкую систему, которая рушится от малейшего изменения условий.</p>
<p><strong>Настоящий навык аима — это не мышечная память, а моторно-зрительная координация</strong> Это способность твоего мозга и тела быстро и точно адаптироваться к любым условиям: к новой сенсе, другому геймплею, изменившейся обстановке. Это пластичность, а не жесткость. Разивать нужно не <em>память руки</em>, а связь между глазом, мозгом и рукой. И тогда будет ебочка.</p>
<p>При регуляных тренировкая аима - смена сенсы перестаёт ощущаться - ты можешь спокойно скакать между 24-34-38-44-55-66-77-88 <em>(и т.д. и т.п.)</em> см/360 и при этом не особо ощущая разницу - скорость адаптации к новым условия будет занимать считанные секунды.</p> ]]></description>
    <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Main</title>
    <link>https://shiza.sccl.cc/</link>
    <guid>https://shiza.sccl.cc/</guid>
    <description><![CDATA[ <p>Me writing my absolute brainrot here!!!!</p>
<p><video src="./pictures/blobby-blobby-dancer.mp4" autoplay loop muted playsinline></video>
<small><em>am rly like this blobby dancer. Its the best <a href="https://www.nvidia.com/en-us/geforce/community/demos/" class="external">nvidia tech demo<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> ive ever seen.</em></small><br></p> ]]></description>
    <pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Оказуаливание аима - Почему &quot;чистый&quot; скилл прицеливания не решает в соревновательных играх</title>
    <link>https://shiza.sccl.cc/ru/Games/Aim/Casualization-of-aim</link>
    <guid>https://shiza.sccl.cc/ru/Games/Aim/Casualization-of-aim</guid>
    <description><![CDATA[ <p><img src="../../../pictures/aim/ground_tracking.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>В мире киберкотлет, кибершпротов и хардкорного гейминга культ аиминга возведен в абсолют. Часы на тренировочных картах, бесконечные дуэли, дроч в аим тренерах и погоня за идеальной сенсой, мышкой, ковром, глайдами, посадкой, разрешением, fov<em>ом</em> и т.д. и т.п. - всё это ритуалы современного неопилигрима, верящего, что скорость реакции и точность мыши доведут его до топ-1. Но по факту жоский анализ бол-ва игор <strong>оказуаливает</strong> аим как ключевой навык. В большинстве современных мультиплеерных компетитив игр “чистый” аим намеренно поставлен разработчиками в подчиненное положение. Его потенцевал жеско ограничен системами, призванными <strong>уровнять шансы</strong> между игроками разного уровня мастерства.</p>
<h2 id="великий-уравнитель-рандом-мувмент-и-неконтролируемые-факторы"><strong>Великий уравнитель: Рандом, мувмент и неконтролируемые факторы</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#великий-уравнитель-рандом-мувмент-и-неконтролируемые-факторы" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Главный враг raw-скилла аиминга - это случайность и ограничения. Разработчики давно воткнули, что игра, где победа безраздельно принадлежит тому, у кого быстрее реакция и лучше mouse-контроль, обречена на узкую аудиторию <em>(серия quake в качестве примера)</em>. Новые игроки будут уходить, с болью в попе, а матчмейкинг не справится с гигантским разрывом в скилле между вершиной и низом.</p>
<p>Поэтому в ход идут системы-костыли:</p>
<ul>
<li>
<p><strong>Random Bullet Spread (RNG Spread):</strong> Самый очевидный пример. Даже в самом популярном тактической шутере <em>Counter-Strike</em>, который считается эталоном киберспорта <em>(ну как минимум он самый популярный)</em>, пули из любого оружия в стоячем положении летят не строго в одну точку, а в пределах некого круга разброса. В <em>Valorant</em> этот разброс еще более выражен. Нет возможности гарантированно контролировать каждую пулю - можно лишь <strong>увеличить вероятность</strong> попадания. Это огромная разница - Даже заученный спрей-паттерн - это не точная наука, а танцы с бубном вокруг случайного отклонения <em>(пжзарегай)</em>.
<img src="../../../pictures/aim/rng_spread.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Контроль скорости передвижения:</strong> Ключевой, но часто упускаемый из виду аспект. Во многих играх (<strong>CS2</strong>, <strong>Valorant</strong>, <strong>R6 Siege</strong>) базовая скорость передвижения персонажей относительно <strong>низкая и предсказуемая</strong>. Это мощнейший инструмент уравнивания. <strong>Против медленной цели и новичок, и про будут целиться практически одинаково эффективно.</strong> Разница в их скилле будет минимальна. Гений трекинга не сможет раскрыть свой потанцевал, просто потому, что цель не бросает ему вызов. Вся “вилка” между плохим и хорошим аимом сжимается. Разница же ощущаестся когда появляется быстрая, непредсказуемая цель. Здесь нуб просто потеряется и не сможет по ней попасть, в то время как жоский-игрок, хоть и с худшим результатом, чем против медленной цели, всё же сможет её оттрекать. Таким образом, <strong>медленный мувмент - это скрытый механизм, не дающий сильному аимеру раскрыть свой полный потанцевал</strong> против слабого оппонента.
<img src="../../../pictures/aim/apex_glide.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Стрельба в движении:</strong> Механизм, практически полностью убранный из тактических шутеров. В том же <em>CS</em> стрельба на ходу - это синоним слова “промах”. Это сознательное решение, которое переводит акцент с пострелушек на позиционирование и тактику (стоп-шоты).
<img src="../../../pictures/aim/strafe_rng.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Система промахов (Bloom), уменьшение урона на дистанции, сложная баллистика</strong> — все это слои RNG, которые добавляют в уравнение фактор удачи. Иногда кривой выстрел попадет, а идеально наведенный - нет.
<img src="../../../pictures/aim/ballistics.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
</ul>
<p>Суть идеи - <strong>снизить ceiling (потолок) мастерства аима.</strong> (невелировать aim-advantage) Разница между хорошим и богоподобным аимером нивелируется тем, что <strong>даже бог не может гарантировать попадание</strong> из-за рандома, а против медленной цели его превосходство будет не так заметно. Новичок всегда имеет шанс на случайное попадание или “счастливый” хедшот.</p>
<h2 id="высокий-ttk-vs-низкий-ttk-парадокс-аим-зависимости"><strong>Высокий TTK vs Низкий TTK: Парадокс аим-зависимости</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#высокий-ttk-vs-низкий-ttk-парадокс-аим-зависимости" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Здесь кроется главный парадокс, который многие не осознают.</p>
<ul>
<li>
<p><strong>Низкий TTK (Time To Kill):</strong> Характерен для тактических шутанов (CS2, Valorant, R6 Siege). Убийство происходит за 1-2 попадания. Казалось бы, тут нужен ювелирный аим, чтоб давать по шапке с пермой. Но на деле <strong>аим менее важен</strong>, чем кажется. Решающим фактором часто становится не чистое попадание, а: <strong>Позиционирование</strong> (можно застать врага врасплох, дать одну по затылку, сделать килл даже не начиная дуэли), <strong>Знание углов</strong> (префы, оффэнглы и т.п.), <strong>Удача</strong> (Случайная пуля залетела в лицо. Новичок просто дёрнул рукой, стрельну на бегу/в прыжке и шотнул куда более сильного игрока)
<img src="../../../pictures/aim/valorant_headshot.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
<li>
<p><strong>Высокий TTK:</strong> Классика для ареновых шутеров (<em>Quake</em>, <em>Apex Legends</em>, <em>Overwatch 2</em>, <em>The Finals</em>). Здесь чтобы убить врага, нужно непрерывно трекать его и попадать в него <strong>много раз подряд</strong>. Случайно затрекать в течении десятка секунд просто не получится.
<img src="../../../pictures/aim/quake_lg.png" width="auto" height="auto" alt="" loading="lazy"></p>
</li>
</ul>
<p>И вот здесь <strong>raw-аим выходит на первое место</strong>. Удачным выстрелом тут ничего не решить. Нужно именно <strong>долго и точно вести цель</strong>. В играх с высоким TTK разрыв в мастерстве аима между игроками виден значительно больше. Сильный игрок будет стабильно оттрекивать и убивать новичка, у которого просто не хватит точности и контроля над мышью, чтобы нанести достаточно дамага. Тактикой и позицией тут проблему не решить - нужно именно попадать, но можно пытаться вывозить на мувменте, но тут опять же расширяется вилка aim-advantage исходя из пунктов выше.</p>
<h2 id="бегство-от-аима-тактика-мувмент-и-абстрактные-способности"><strong>Бегство от аима: Тактика, мувмент и абстрактные способности</strong><a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#бегство-от-аима-тактика-мувмент-и-абстрактные-способности" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Поскольку чистый аим - навык сложный, требующий тысячи часов на оттачивание, разработчики уводят фокус в другие, более “демократичные” механики:</p>
<ol>
<li><strong>Тактика и коммуникация.</strong> Можно очень плохо двигать мышкой, но постоянно удивлять соперника, занимать неожиданные позиции, давать коллы для коммандой работы, юзать абилки.
<img src="../../../pictures/aim/dust_tactics.png" width="auto" height="auto" alt="" loading="lazy"></li>
<li><strong>Мувмент.</strong> В так. шутерах он работает как <strong>ограничитель</strong> (медленный и предсказуемый). В ареновых - как <strong>разделитель</strong> (быстрый и сложный), позволяющий сильному игроку доджить и демонстрировать превосходство в трекинге.
<img src="../../../pictures/aim/Thumbnail_Best_Movement_Guide.png" width="auto" height="auto" alt="" loading="lazy"></li>
<li><strong>Способности (Abilities).</strong> Мощнейший инструмент для делевелизации аима. Зачем идеально целиться, если можно закидать соперника гранатами, турелями, смоками, всякими слоу-спотами и флешками. Эти механики требуют не точности, а правильного принятия решений и тайминга.
<img src="../../../pictures/aim/overwatch_zarub.png" width="auto" height="auto" alt="" loading="lazy"></li>
</ol>
<hr>
<h2 id="вывод">Вывод<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#вывод" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Аим, безусловно, остается важным навыком. Но бол-во компетитив игр задезайнены так, чтоб <strong>оказуалить</strong> его, сделать <strong>одним из многих факторов победы</strong>, <strong>но не единственным</strong> и уж точно не основным (решающим). Медленный мувмент, RNG разброс и обилие абилок - это дизайнерская философия, направленная на то, чтоб игра оставалась доступной для миллионов, а не для горстки избранных с идеально отточенной моторикой.</p> ]]></description>
    <pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Search</title>
    <link>https://shiza.sccl.cc/search</link>
    <guid>https://shiza.sccl.cc/search</guid>
    <description><![CDATA[ <input type="text" id="search-input" class="search-page-input" placeholder="Search..." autofocus>
<div id="search-results"></div> ]]></description>
    <pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Rulemak CAWS</title>
    <link>https://shiza.sccl.cc/en/Peripheral/Keyboards/Rulemak-CAWS</link>
    <guid>https://shiza.sccl.cc/en/Peripheral/Keyboards/Rulemak-CAWS</guid>
    <description><![CDATA[ <p>The Colemak CAWS project itself was created by the Colemak community to unite popular mods: <code>Curl</code>, <code>Angle</code>, <code>Wide</code>, <code>Symbols</code>, with the main work on CAWS done by <a href="https://dreymar.colemak.org/" class="external">DreymaR<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>. This Russian variant is my adaptation for Cyrillic.</p>
<h2 id="core-concept">Core Concept<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#core-concept" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>The Russian layout is built as a phonetic analogue of the English one:</p>
<ul>
<li>A > А</li>
<li>R > Р</li>
<li>S > С</li>
<li>T > Т</li>
<li>G > Г</li>
</ul>
<p>and so on, where possible.</p>
<p>This approach means you don’t have to learn a new layout from scratch - you can start typing confidently right away, knowing only the base layout: many words and combinations are typed with similar finger movements regardless of which layout you’re using.</p>
<h2 id="why-it-works">Why It Works<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#why-it-works" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Letter and sound frequencies in Russian and English are largely similar. Therefore, phonetically mapping the English layout to Russian provides a reasonably good distribution of workload without requiring separate deep optimization for Russian texts. (<a href="https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C" class="external">Russian<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>, <a href="https://en.wikipedia.org/wiki/Letter_frequency" class="external">English<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>)</p>
<h2 id="heatmap">Heatmap<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#heatmap" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Top 1000 words for Russian and English
<img src="../../../pictures/Peripheral/rulemak_caws_thermal.png" width="auto" height="auto" alt="" loading="lazy">
<img src="../../../pictures/Peripheral/colemak_caws_thermal.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>You can poke around and compare on my visualizer:</p>
<p><a href="https://heatkeys.sccl.cc" class="external">heatkeys.sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> <strong>(you can poke it right here!)</strong></p>
<iframe src="https://heatkeys.sccl.cc" style="width: 100%; height: 770px; border: 1px solid var(--secondary); border-radius: 8px;" loading="lazy"></iframe>
<h2 id="whats-here">What’s Here?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#whats-here" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>One of the features of Colemak CAWS is the central block of keys with symbols:</p>
<p><code>- [ \ / ]</code></p>
<p>Because of this, the layout feels almost like a split keyboard: there’s additional space between the hands, and some rarely used symbols end up under the index fingers.</p>
<p>In the Russian version, this space turned out to be perfect for letters:</p>
<p><code>Щ</code>, <code>Ш</code>, <code>Э</code>.</p>
<p>They’re not used that often, but they’re significantly more comfortable to press than in traditional layouts, where such letters are usually relegated to the right pinky.</p>
<p>Not all phonetic correspondences are obvious. For example:</p>
<ul>
<li><code>V → В</code></li>
<li><code>W → Ж</code></li>
</ul>
<p>This mapping might look strange, but it’s actually historically accurate.</p>
<p>The remaining letters had to be shoved wherever they’d fit:</p>
<ul>
<li><code>Ъ</code> ended up under the pinky, much as I’d prefer otherwise, since it’s used extremely rarely.</li>
<li><code>Ю</code> took the place of <code>\</code>. This letter isn’t too frequent either, so this turned out to be the least painful placement option.</li>
<li><code>Ё</code> - some idiot in the Russian layout stuck it in the ass-end of the world - in this variant it’s on <code>Е</code>, but on the <em>AltGr</em> layer.</li>
</ul>
<p>The layout doesn’t try to be perfect for Russian. The goal was to make the Russian part as similar as possible to the English one, so you don’t have to keep two different layouts in your head, while preserving the ergonomics and convenience of Colemak.</p>
<h2 id="compatibility">Compatibility<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#compatibility" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>The layout was made for ANSI keyboards.</p>
<p>On ISO it might work slightly differently.</p>
<p>On Split I use the regular phonetic DH.</p>
<h2 id="installation-for-windows">Installation for Windows<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#installation-for-windows" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>The layout was built using <a href="https://www.microsoft.com/en-us/download/details.aspx?id=102134" class="external">Microsoft Keyboard Layout Creator<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> (<code>.kdl</code> file for editing is in the archive)</p>
<p>It’s better to drop the DLL files manually and register them in the registry by hand too.</p>
<p>But you can run the installer and pray the system doesn’t croak.</p>
<p><strong>Download archive:</strong>
<a href="../../../files/rumkcaws.7z" class="internal" data-slug="files/rumkcaws.7z">rumkcaws.7z</a></p>
<h2 id="linux">Linux<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#linux" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><small>No version for Linux, I use split and DH there anyway - the layout itself is basically for a laptop.</small><br></p> ]]></description>
    <pubDate>Sun, 13 Apr 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Rulemak CAWS</title>
    <link>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Rulemak-CAWS</link>
    <guid>https://shiza.sccl.cc/ru/Peripheral/Keyboards/Rulemak-CAWS</guid>
    <description><![CDATA[ <p>Сам проект Colemak CAWS был создан сообществом вокруг Colemak для объеденения популярных модов <code>Curl</code>, <code>Angle</code>, <code>Wide</code>, <code>Symbols</code>, а основная работа над CAWS выполнена <a href="https://dreymar.colemak.org/" class="external">DreymaR<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>. Данный русский вариант является моей адаптацией для кириллицы.</p>
<h2 id="основная-идея">Основная идея<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#основная-идея" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Русская раскладка построена как фонетический аналог английской:</p>
<ul>
<li>A > А</li>
<li>R > Р</li>
<li>S > С</li>
<li>T > Т</li>
<li>G > Г</li>
</ul>
<p>и так далее, где это возможно.</p>
<p>Такой подход позволяет не учить новую раскладку - на ней можно печатать сразу уверенно зная лишь основную: многие слова и сочетания набираются похожими движениями пальцев независимо от выбранной раскладки.</p>
<h2 id="почему-это-работает">Почему это работает<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#почему-это-работает" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Частотность букв и звуков в русском и английском языках во многом схожа. Потому фонетическое отображение английской раскладки на русский язык даёт достаточно хорошее распределение нагрузки без отдельной глубокой оптимизации под русские тексты. (<a href="https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C" class="external">Русский<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>, <a href="https://en.wikipedia.org/wiki/Letter_frequency" class="external">Англиский<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> )</p>
<h2 id="heatmap">Heatmap<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#heatmap" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Топ-1000 слов для русского и англиского
<img src="../../../pictures/Peripheral/rulemak_caws_thermal.png" width="auto" height="auto" alt="" loading="lazy">
<img src="../../../pictures/Peripheral/colemak_caws_thermal.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Почекать, сравнить можно на моём визуализаторе:</p>
<p><a href="https://heatkeys.sccl.cc" class="external">heatkeys.sccl.cc<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> <strong>(можно потыкать прям тут!)</strong></p>
<iframe src="https://heatkeys.sccl.cc" style="width: 100%; height: 770px; border: 1px solid var(--secondary); border-radius: 8px;" loading="lazy"></iframe>
<h2 id="а-чо-тут">А чо тут?<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#а-чо-тут" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Одной из особенностей Colemak CAWS является центральный блок клавиш со знаками:</p>
<p><code>- [ \ / ]</code></p>
<p>Из-за него раскладка ощущается почти как split-клавиатура: между руками появляется дополнительное пространство, а часть редко используемых символов оказывается под указательными пальцами.</p>
<p>В русской версии это место отлично подошло для букв:</p>
<p><code>Щ</code>, <code>Ш</code>, <code>Э</code>.</p>
<p>Они используются не так часто, но нажимаются значительно удобнее, чем в традиционных раскладках, где подобные буквы обычно отправляют на правый мизинец.</p>
<p>Не все фонетические соответствия очевидны. Например:</p>
<ul>
<li><code>V → В</code></li>
<li><code>W → Ж</code></li>
</ul>
<p>Такое сопоставление может выглядеть странно, но оно вполне исторически достоверное.</p>
<p>Остальные буквы пришлось пихнуть куда впихнётся:</p>
<ul>
<li><code>Ъ</code> отправился под мизинец, как бы того мне хотелось, поскольку используется крайне редко.</li>
<li><code>Ю</code> заняла место <code>\</code>. Буква тоже не слишком частотная, поэтому это оказался наиболее безболезненный вариант её размещения.</li>
<li><code>Ё</code> какой то идиот в русской пихнул её в жопу мира - в данном варианте она на <code>Е</code>, но на слое <em>AltGr</em></li>
</ul>
<p>Раскладка не пытается быть идеальной для русского языка. Задача была сделать русскую часть максимально похожей на английскую, чтобы не приходилось держать в голове две разные раскладки, но сохранить эргономику и удобство от Colemak.</p>
<h2 id="совместимость">Совместимость<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#совместимость" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Раскладка делалась под ANSI-клавиатуры.</p>
<p>На ISO она может работать немного не так.</p>
<p>На Split я использую обычный фонетический DH.</p>
<h2 id="установка-для-windows">Установка для Windows<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#установка-для-windows" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Раскладка собрана через <a href="https://www.microsoft.com/en-us/download/details.aspx?id=102134" class="external">microsoft keyboard layout creator<svg aria-hidden="true" class="external-icon" style="max-width:0.8em;max-height:0.8em" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a> (<code>.kdl</code> файл для редактирования в архиве)</p>
<p>Лучше закидывать dll ручками и прописывать их в реестре тоже ручками.</p>
<p>Но можно тыкнуть установщик и молиться, что система не помрёт.</p>
<p><strong>Скачать архив:</strong>
<a href="../../../files/rumkcaws.7z" class="internal" data-slug="files/rumkcaws.7z">rumkcaws.7z</a></p>
<h2 id="linux">Linux<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#linux" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p><small>А для лини нет, я там использую split и dh, сама раскладка, по сути, для ноута.</small><br></p> ]]></description>
    <pubDate>Sun, 13 Apr 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>The Problem with Aim Guides</title>
    <link>https://shiza.sccl.cc/en/Games/Aim/Coaching-problem</link>
    <guid>https://shiza.sccl.cc/en/Games/Aim/Coaching-problem</guid>
    <description><![CDATA[ <h2 id="coaching">Coaching<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#coaching" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>A novice’s request to “pls coach me” often puts an experienced player in a difficult position. They possess a skill that has been honed to the point of automatism, to a pure <em>feeling</em>. The first problem they encounter is the <strong>inability to convey this feeling</strong>. The answer “just hit your shots,” while truthful, is absolutely useless for someone who hasn’t yet experienced or understood this “just.”</p>
<p>To help, the experienced player takes a logical step-<strong>deconstruction</strong>. They break down the holistic skill into its component parts.
Each of these components is a high-level <strong>abstraction</strong>, created to simplify the transmission of a complex ability. In theory, this should help the novice transition from a state of not understanding to their first real experience.</p>
<h2 id="overanalysis">Overanalysis<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#overanalysis" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>On one hand, a beginner might be able to extract something useful for themselves. However, it can also happen that instead of a holistic sensation of “tracking the target with the crosshair,” they start agonizing over a dozen isolated parameters, like: “Now I need to track precisely along the trajectory, controlling the speed, and now the target has sharply changed direction-I need a flick, but without overflicking, to jump onto the target smoothly yet quickly.”</p>
<p><img src="../../../pictures/aim/Pasted-image-20251001163625.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>A simple action becomes burdened by the need to <strong>simultaneously control all these concepts created “for simplification.”</strong></p>
<h2 id="the-inadequacy-of-abstractions">The Inadequacy of Abstractions<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#the-inadequacy-of-abstractions" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Over time, it becomes clear that any created model is incomplete. It fails to convey the pure feeling, that very <em>kinesthetics</em> of aim-the fusion of eye, hand, and mouse into a single action. The model itself begins to demand simplification.</p>
<p>And then a new level of explanation emerges, an even higher-level abstraction, such as:</p>
<ul>
<li>“Just play more”</li>
<li>“Just track the target and hit it”</li>
<li>“Don’t shake, but you can tense your arms as much as you want”</li>
<li>“Lead the target with your gaze, and your hand will follow automatically”</li>
</ul>
<p><img src="../../../pictures/aim/Pasted-image-20251001170344.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p><strong>This is the purest truth.</strong> This is exactly how all experienced players operate-they can perform at a sufficiently high level on autopilot. But for a novice, who is still struggling with basic concepts, this advice sounds like mockery.</p>
<h2 id="the-ultimate-solution">The Ultimate Solution<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#the-ultimate-solution" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>In the end, the circle closes. All the complex explanations and multi-layered abstractions lead to the only working solution that has always existed: <strong>“Watch how others do it and try to replicate it until you succeed.”</strong></p>
<p><img src="../../../pictures/aim/Pasted-image-20251001170718.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>This is not merely an evasion. It is an acknowledgment that some skills cannot be conveyed through words and diagrams. They can only be <strong>absorbed through observation and built up through thousands of repetitions</strong>. Practice, in the end, dissolves all abstractions, returning the player to the very starting point of the question-to that intuitive “track the target smoothly with your crosshair and strive to hit more.” But now, this “just” is backed by real, rather than theoretical, experience.</p> ]]></description>
    <pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate>
  </item><item>
    <title>Проблема гайдов по аиму</title>
    <link>https://shiza.sccl.cc/ru/Games/Aim/Coaching-problem</link>
    <guid>https://shiza.sccl.cc/ru/Games/Aim/Coaching-problem</guid>
    <description><![CDATA[ <h2 id="коучинг">Коучинг<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#коучинг" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Просьба новичка “закоучи пжпж” ставит опытного игрока в тупик. Он обладает навыком, доведенным до автоматизма, до чувства. И первая проблема, с которой он сталкивается - <strong>невозможность передать чувство</strong>. Ответ “просто попадай” хоть и правдив, но абсолютно бесполезен для того, кто этого “просто” еще не ощущает и не может понять.</p>
<p>Чтобы помочь, опытный игрок совершает логичный шаг - <strong>деконструкцию</strong>. Он разбирает целостный навык на составляющие компоненты.
Каждый из этих компонентов является высокоуровневой <strong>абстракцией</strong>, созданной для упрощения передачи сложного умения. Что в теории должно помочь новичку перейти от непонимания к первому опыту.</p>
<h2 id="черезмерный-анализ">Черезмерный анализ<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#черезмерный-анализ" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>С одной стороны новичок сможет чота для себя выдернуть полезное, но может быть и такое, что вместо целостного ощущения “вести прицелом по таргету” - он начинает мучительно думать о десятке изолированных параметров, аля: “Сейчас нужно трекать ровно по траектории, контролируя скорость, а теперь цель резко сменила вектор движения - нужен флик, но без оверфлика, чтоб плавно, но быстро прыгнуть на таргет”.</p>
<p><img src="../../../pictures/aim/Pasted-image-20251001163625.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Простое действие утяжеляется необходимостью <strong>одновременно контролировать все эти созданные “для упрощения” концепции</strong>.</p>
<h2 id="неполноценность-абстракций">Неполноценность абстракций<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#неполноценность-абстракций" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>Со временем становится ясно, что любая созданная модель неполна. Она не передает чистое чувство, ту самую <em>кинестетику</em> аима, слияние глаза, руки и мыши в одном действии. Сама модель начинает требовать упрощения.</p>
<p>И тогда возникает новый уровень объяснений, еще более высокоуровневая абстракция аля:</p>
<ul>
<li>“Just play more”</li>
<li>“Просто веди по таргету и попадай”</li>
<li>“Не трясись, но руки напрягать можешь сколько угодно”</li>
<li>“Взглядом веди таргет, а рука сама повторит”</li>
</ul>
<p><img src="../../../pictures/aim/Pasted-image-20251001170344.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p><strong>Это и есть чистейшая правда.</strong> Именно так и делают все опытные игроки - они на автопилоте могут сыграть на достаточно высоком уровне. Но для новичка, который все еще борется с базовыми концепциями, этот совет звучит как издевательство.</p>
<h2 id="ультимативное-решение">Ультимативное решение<a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#ультимативное-решение" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
<p>В итоге круг замыкается. Все сложные объяснения и многослойные абстракции приводят к единственному работающему решению, которое существовало всегда: <strong>“Смотри, как делают другие, и пытайся повторить, пока не получится”</strong>.</p>
<p><img src="../../../pictures/aim/Pasted-image-20251001170718.png" width="auto" height="auto" alt="" loading="lazy"></p>
<p>Это не просто уход от ответа. Это признание, что некоторые навыки невозможно передать словами и схемами. Их можно только <strong>перенять через наблюдение и наработать через тысячи повторений</strong>. Практика в конечном счете растворяют все абстракции, возвращая игрока к тому, с чего начинался вопрос, - к тому самому интуитивному “веди прицелом ровно по таргету и стремись попадать больше”. Но теперь это “просто” подкреплено реальным, а не теоретическим опытом.</p> ]]></description>
    <pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate>
  </item>
    </channel>
  </rss>