<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>amureki.me</title>
      <link>https://amureki.me</link>
      <description>Notes from Rust Saiargaliev</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://amureki.me/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Safer local envs with 1Password and op run</title>
          <pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2026-06-18-safer-local-envs-with-1password/</link>
          <guid>https://amureki.me/notes/2026-06-18-safer-local-envs-with-1password/</guid>
          <description xml:base="https://amureki.me/notes/2026-06-18-safer-local-envs-with-1password/">&lt;p&gt;I kept too many secrets in my &lt;code&gt;.env&lt;&#x2F;code&gt; files.&lt;&#x2F;p&gt;
&lt;p&gt;The goal: run local commands without keeping sensitive environment variables in plaintext inside the project directory.&lt;&#x2F;p&gt;
&lt;p&gt;This led me to looking for ways to be protected against:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;supply-chain attacks: a random dependency or tool reading local files;&lt;&#x2F;li&gt;
&lt;li&gt;agentic workflows: coding agents accidentally seeing or exposing secrets from the workspace.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I already use a password manager for secrets. In my case, that is 1Password, and like many password managers it has a CLI integration.&lt;&#x2F;p&gt;
&lt;p&gt;The CLI can read items from your vault and pass them to local commands without you copying values around. The part I care about here is &lt;code&gt;op run&lt;&#x2F;code&gt;: it can start a process with environment variables resolved from 1Password.&lt;&#x2F;p&gt;
&lt;p&gt;That means I can keep the local &lt;code&gt;.env&lt;&#x2F;code&gt; workflow, but stop putting real secret values in the file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SECRET_KEY=op:&#x2F;&#x2F;dev&#x2F;project&#x2F;SECRET_KEY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DATABASE_URL=op:&#x2F;&#x2F;dev&#x2F;project&#x2F;DATABASE_URL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then &lt;code&gt;op run&lt;&#x2F;code&gt; resolves those pointers only for the command it starts:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;op&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --env-file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; .env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; uv run manage.py runserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A nice side effect: reading the real values goes through 1Password. If something unexpected tries to resolve them, I get an unlock prompt first, which gives me a chance to stop and ask: &quot;did I actually mean to give this command my secrets?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;github.com&#x2F;user-attachments&#x2F;assets&#x2F;d5f86e6d-bb04-4bd0-ad06-933dd6b333db&quot; alt=&quot;1Password unlock prompt&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;That is already enough, but I did not want to type the full command every time, so I wrapped it in a tiny zsh helper:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;  op&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --env-file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;OP_ENV_FILE&lt;&#x2F;span&gt;&lt;span&gt;:-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;}&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;font-style: italic;&quot;&gt;$@&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now I can run my Django server like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; uv run manage.py runserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;or a FastAPI app:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; fastapi dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The process still gets the environment it needs, but the secrets are managed by 1Password instead of sitting casually in the repository&#x2F;worktree.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;advanced-aliases&quot;&gt;Advanced: aliases&lt;&#x2F;h2&gt;
&lt;p&gt;I am also quite lazy and like &lt;a href=&quot;&#x2F;notes&#x2F;2019-03-15-heroku-aliases&#x2F;&quot;&gt;aliases&lt;&#x2F;a&gt;, so I wanted this to work too:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; runserver&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;uv run manage.py runserver&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; runserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The minimal &lt;code&gt;opr&lt;&#x2F;code&gt; helper does not support that, because shell aliases are not executables. &lt;code&gt;op run&lt;&#x2F;code&gt; tries to execute &lt;code&gt;runserver&lt;&#x2F;code&gt; as a real command from &lt;code&gt;$PATH&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To make &lt;code&gt;opr&lt;&#x2F;code&gt; understand zsh aliases too, I expand the first argument before calling &lt;code&gt;op run&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; env_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;OP_ENV_FILE&lt;&#x2F;span&gt;&lt;span&gt;:-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -a&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; cmd expanded&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; expansions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;  cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;font-style: italic;&quot;&gt;$@&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;  while&lt;&#x2F;span&gt;&lt;span&gt; (( $#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; ${+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;aliases&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;$cmd&lt;&#x2F;span&gt;&lt;span&gt;[1]]}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; expansions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span&gt; ));&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;    expanded&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;(${(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;z&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;aliases&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;$cmd&lt;&#x2F;span&gt;&lt;span&gt;[1]]})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;    cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;expanded&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;]}&amp;quot; &amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;}&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;expansions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;  done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;  op&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --env-file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;$env_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;quot;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;]}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then the lazy version works:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;opr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; runserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;alternatives&quot;&gt;Alternatives&lt;&#x2F;h2&gt;
&lt;p&gt;This helper is intentionally tiny. If you are interested in the idea, but did not like my solution or want something more production-like, here are some alternatives:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotenvx&#x2F;dotenvx&quot;&gt;dotenvx&lt;&#x2F;a&gt;, which supports encrypted &lt;code&gt;.env&lt;&#x2F;code&gt; workflows and stays close to the familiar dotenv model.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmno-dev&#x2F;varlock&quot;&gt;Varlock&lt;&#x2F;a&gt;, which adds a committed &lt;code&gt;.env.schema&lt;&#x2F;code&gt;, type&#x2F;required metadata, redacted config checks, and secret leak scanning.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sobolevn.me&#x2F;git-secret&#x2F;&quot;&gt;git-secret&lt;&#x2F;a&gt;, which encrypts secret files before committing them to Git. Useful, but a different trade-off: after decrypting, you still have plaintext files in the worktree.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Devcontainers can also help by isolating the tooling that touches a project, but they do not remove the secrets problem by themselves: the container still needs those values from somewhere.&lt;&#x2F;p&gt;
&lt;p&gt;These are bigger tools than my alias, but that can be the right trade-off for a team, especially if you want an explicit env contract for humans and agents.&lt;&#x2F;p&gt;
&lt;p&gt;None of this protects you from code running inside the target process: that code can read its own environment. The win is smaller than that, but still useful: fewer plaintext secrets sitting around for tools, agents, or accidental commits to stumble over.&lt;&#x2F;p&gt;
&lt;p&gt;I would not add this to every project by default. It is most useful when the same checkout is touched by lots of tools, scripts, or agents.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Fast Keyboard Layout Switching on macOS</title>
          <pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2025-03-07-fast-input-switch-macos/</link>
          <guid>https://amureki.me/notes/2025-03-07-fast-input-switch-macos/</guid>
          <description xml:base="https://amureki.me/notes/2025-03-07-fast-input-switch-macos/">&lt;p&gt;For the longest time, switching input languages on my Mac was frustratingly slow.
The default &lt;em&gt;Control + Space&lt;&#x2F;em&gt; shortcut had a nearly &lt;strong&gt;one-second delay&lt;&#x2F;strong&gt; before switching languages.
If you&#x27;re a fast typist, that means typing the first few characters in the wrong language — super annoying.&lt;&#x2F;p&gt;
&lt;p&gt;I tried every solution I could find:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Custom AppleScripts.&lt;&#x2F;li&gt;
&lt;li&gt;The unmaintained (but surprisingly still functional) open-source tool &lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hatashiro&#x2F;kawa&quot;&gt;Kawa&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;I even wrote my own Swift-based solution.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;None of them fixed the actual problem — the &lt;strong&gt;delay itself&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;The Solution&lt;&#x2F;h2&gt;
&lt;p&gt;After a lot of trial and error, I stumbled upon this in &lt;em&gt;System Preferences → Keyboard → Shortcuts -&amp;gt; Input Sources&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;github.com&#x2F;user-attachments&#x2F;assets&#x2F;4314b71d-a55b-4555-941c-660460e60916&quot; alt=&quot;Input Sources&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The default shortcut for &lt;strong&gt;&quot;Select the previous input source&quot;&lt;&#x2F;strong&gt; (&lt;em&gt;Control + Space&lt;&#x2F;em&gt;) has a delay.&lt;&#x2F;li&gt;
&lt;li&gt;The shortcut for &lt;strong&gt;&quot;Select next source in Input menu&quot;&lt;&#x2F;strong&gt; (&lt;em&gt;Control + Option + Space&lt;&#x2F;em&gt;) does &lt;em&gt;not&lt;&#x2F;em&gt; have a delay.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For whatever reason, Apple made the slower one the default. The fix?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Just swap the shortcuts.&lt;&#x2F;em&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Now, the &lt;em&gt;Control + Space&lt;&#x2F;em&gt; shortcut switches input languages instantly,
and the &lt;em&gt;Control + Option + Space&lt;&#x2F;em&gt; shortcut has the delay (who cares?).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;but-why&quot;&gt;But why?&lt;&#x2F;h2&gt;
&lt;p&gt;I still have questions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Why does the &quot;previous&quot; shortcut have a delay while the &quot;next&quot; one doesn’t?&lt;&#x2F;li&gt;
&lt;li&gt;Why isn’t the faster shortcut the default?&lt;&#x2F;li&gt;
&lt;li&gt;Is this a bug, a design choice, or just legacy behavior?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you know the answer, I’d love to hear it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;for-globe-globe-with-meridians-icon-lovers&quot;&gt;For Globe (🌐) icon lovers&lt;&#x2F;h2&gt;
&lt;p&gt;In case you like are using Apple&#x27;s keyboard with the Globe icon,
you may also experience a delay when switching input languages.
For you I found another hint:
In &lt;em&gt;System Preferences → Keyboard → Shortcuts -&amp;gt; Mission Control&lt;&#x2F;em&gt; you can disable the shortcut for &quot;Quick Note&quot; (🌐Q)
which can cause the delay if you just want to switch the input language.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;github.com&#x2F;user-attachments&#x2F;assets&#x2F;c36fd69b-e05f-473b-93b5-75c8daf6f0a4&quot; alt=&quot;Mission Control&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Another example of some creativity ruining the user experience.&lt;&#x2F;p&gt;
&lt;p&gt;Keep calm and typing fast!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Disable `auto_now` and `auto_now_add` in Django migrations</title>
          <pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2024-09-27-django-disable-auto-now/</link>
          <guid>https://amureki.me/notes/2024-09-27-django-disable-auto-now/</guid>
          <description xml:base="https://amureki.me/notes/2024-09-27-django-disable-auto-now/">&lt;p&gt;Django&#x27;s &lt;code&gt;DateField&lt;&#x2F;code&gt; and &lt;code&gt;DateTimeField&lt;&#x2F;code&gt; fields have two options that can be set to automatically set the field to the current date and time when a new record is created or updated:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auto_now&lt;&#x2F;code&gt;: Automatically sets the field to the current date and time every time the record is saved.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;auto_now_add&lt;&#x2F;code&gt;: Automatically sets the field to the current date and time when the record is first created.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A common use case for these options is setting &lt;code&gt;created_at&lt;&#x2F;code&gt; and &lt;code&gt;updated_at&lt;&#x2F;code&gt; fields in a model:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; django.db&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt; Article&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt;models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt;Model&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;CharField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;font-style: italic;&quot;&gt;max_length&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;255&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    created_at&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;DateTimeField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;font-style: italic;&quot;&gt;auto_now_add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    updated_at&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;DateTimeField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;font-style: italic;&quot;&gt;auto_now&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;True&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, if you want to migrate some data you might stumble into a problem.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; django.db&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; migrations, models&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt; create_old_article&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;font-style: italic;&quot;&gt;apps&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;font-style: italic;&quot;&gt; schema_editor&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; apps.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_model&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;blog&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;Article&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    old_article&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;title&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;My old article&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;created_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;2020-01-01 12:00:00&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;updated_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;2024-01-01 12:00:00&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article.objects.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;create&lt;&#x2F;span&gt;&lt;span&gt;(**old_article)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt; Migration&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt;migrations&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E5C07B;&quot;&gt;Migration&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      dependencies&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;blog&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;0001_initial&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      operations&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          migrations.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;RunPython&lt;&#x2F;span&gt;&lt;span&gt;(create_old_article),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running this migration would set &lt;code&gt;created_at&lt;&#x2F;code&gt; and &lt;code&gt;updated_at&lt;&#x2F;code&gt; to the current date and time, not the specified historical dates.&lt;&#x2F;p&gt;
&lt;p&gt;To preserve the historical dates during migration, you can temporarily disable the &lt;code&gt;auto_now&lt;&#x2F;code&gt; and &lt;code&gt;auto_now_add&lt;&#x2F;code&gt; behavior:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt; create_old_article&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;font-style: italic;&quot;&gt;apps&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;font-style: italic;&quot;&gt; schema_editor&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; apps.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_model&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;blog&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;Article&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    old_article&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;title&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;My old article&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;created_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;2020-01-01 12:00:00&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;        &amp;#39;updated_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;2024-01-01 12:00:00&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;    # Disable the auto_now and auto_now_add behavior&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article._meta.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_field&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;created_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;).auto_now_add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article._meta.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_field&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;updated_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;).auto_now&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article.objects.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;create&lt;&#x2F;span&gt;&lt;span&gt;(**old_article)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;    # Re-enable the `auto_now` and `auto_now_add` behavior &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;    #  in case there are other operations within the migration&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article._meta.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_field&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;created_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;).auto_now_add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Article._meta.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;get_field&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;#39;updated_at&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;).auto_now&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; True&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This approach disables the automated logic for the duration of the migration, allowing the fields to be set to the specified values.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Heroku CLI aliases</title>
          <pubDate>Sun, 17 Mar 2019 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2019-03-15-heroku-aliases/</link>
          <guid>https://amureki.me/notes/2019-03-15-heroku-aliases/</guid>
          <description xml:base="https://amureki.me/notes/2019-03-15-heroku-aliases/">&lt;p&gt;Heroku has nice and powerful &lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;devcenter.heroku.com&#x2F;articles&#x2F;heroku-cli&quot;&gt;CLI&lt;&#x2F;a&gt;, which I am using quite heavily for company and personal stuff almost every day.&lt;&#x2F;p&gt;
&lt;p&gt;Very often I need to log in to one of my apps or to the addons, but default commands are very verbose, so here are my shorter aliases:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;# Heroku&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-login&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku login&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-logs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku logs -t&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-bash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku run bash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;## Addons&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-cloudamqp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open cloudamqp&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-newrelic&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open newrelic&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-scheduler&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open scheduler&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-librato&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open librato&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-logentries&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open logentries&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-connect&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku addons:open herokuconnect&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7F848E;font-style: italic;&quot;&gt;## Django-related&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-shell-plus&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku run python manage.py shell_plus&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C678DD;&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E06C75;&quot;&gt; heroku-dbshell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt;&amp;quot;heroku run python manage.py dbshell&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>Revoke third-party access</title>
          <pubDate>Thu, 10 Aug 2017 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2017-08-10-revokeaccess/</link>
          <guid>https://amureki.me/notes/2017-08-10-revokeaccess/</guid>
          <description xml:base="https://amureki.me/notes/2017-08-10-revokeaccess/">&lt;p&gt;Somewhere in a Twitter, I found a couple of links to social networks settings
and advice to check the list of third-party services, which have access to your account.
I started going through my social accounts and cleaning there.&lt;&#x2F;p&gt;
&lt;p&gt;That was a horrible mess, sometimes I did not recognize what is this service
is used for and why I gave it permissions.&lt;&#x2F;p&gt;
&lt;p&gt;So, I&#x27;ve just decided to keep a list of links to social accounts settings,
so I can revisit it sometimes and clean up again.&lt;&#x2F;p&gt;
&lt;p&gt;Here is a link to it: &lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;amureki.me&#x2F;revokeaccess&#x2F;&quot;&gt;https:&#x2F;&#x2F;amureki.me&#x2F;revokeaccess&#x2F;&lt;&#x2F;a&gt;
(&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;amureki&#x2F;revokeaccess&quot;&gt;GitHub&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How GitHub uses GitHub to develop and deploy GitHub</title>
          <pubDate>Fri, 21 Oct 2016 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2016-10-21-how-github-uses-github-to-deploy-github/</link>
          <guid>https://amureki.me/notes/2016-10-21-how-github-uses-github-to-deploy-github/</guid>
          <description xml:base="https://amureki.me/notes/2016-10-21-how-github-uses-github-to-deploy-github/">&lt;p&gt;So, the talk was from Johannes Nicolai from Enterprise Solutions Engineering team. There were almost no marketing stuff, but about their inner structure and flow.&lt;&#x2F;p&gt;
&lt;p&gt;Company-wise they have around 600 people, half of them working remotely from everywhere, half of them based in San Francisco. And they are operating the 51st popular website on the internet.&lt;&#x2F;p&gt;
&lt;p&gt;They are doing everything over GitHub, like literally everything. Marketing, finance, legal and agreements teams all using only GitHub and markdown for issues, documents reviewing and stuff. They all against email - want to be everything documented on GitHub, so if in case it could be pointed to right issue or discussion.&lt;&#x2F;p&gt;
&lt;p&gt;An interesting thing - even for documents and non-code repositories, they have different CI checks and linters, for example for the blog they have text errors, buzzwords, passive-aggressive style checks (around 10-16 different linters only for text).&lt;&#x2F;p&gt;
&lt;p&gt;They are doing around 500 deploys per week. All devops stuff - deployments, metrics, changing some devops configurations, increasing limits they are doing via hubot in Slack. If something is going wrong, for example, DDoS, online team is talking about it and doing some performance checks and fixes right in Slack commands - that helps to see in the future what happened and what was done to check it and to fix it (also helps other people to learn how to be in that kind of situations).&lt;&#x2F;p&gt;
&lt;p&gt;GitHub&#x27;s engineers have deployment timeline - you can see if there were increased errors rate or some spikes, you see after which PRs that happened, who made it, who fixed it.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to deploy your feature (from feature-branch only), you are queuing up for it in Slack, hubot will notify when you can deploy a feature, notify where you can deploy it and here you go. If you’re ready for production, first your branch goes for canary-production (for a small part of the servers), then after 5-15 minutes, it goes for all servers. Only after that, your branch is merged to main. :)&lt;&#x2F;p&gt;
&lt;p&gt;Also, they are actively using feature-flags, so deployed features they can turn on for themselves&#x2F;certain teams&#x2F;some repositories&#x2F;part of end users.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;some-useful-links&quot;&gt;Some useful links:&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=YIpNpptGX6Q&quot;&gt;FutureStack15: Changing the Laws of Engineering with Pull Requests (talk from New Relic)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hubot.github.com&#x2F;&quot;&gt;Hubot - chatops bot used in GitHub&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;githubengineering.com&#x2F;&quot;&gt;GitHub Engineering Blog&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jnunemaker&#x2F;flipper&quot;&gt;Package for feature-flags&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Количество строк кода в Django-проекте</title>
          <pubDate>Tue, 20 Jan 2015 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2015-01-20-django-project-loc/</link>
          <guid>https://amureki.me/notes/2015-01-20-django-project-loc/</guid>
          <description xml:base="https://amureki.me/notes/2015-01-20-django-project-loc/">&lt;p&gt;Составил недавно небольшую команду для подсчета количества строчек полезного (более или менее) кода в своих Django-проектах.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #ABB2BF; background-color: #282C34;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;quot;*.py&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; f !&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; &amp;#39;*&#x2F;migrations&#x2F;*&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: #98C379;&quot;&gt; grep . {}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #56B6C2;&quot;&gt; \;&lt;&#x2F;span&gt;&lt;span&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #61AFEF;&quot;&gt; wc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D19A66;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Коротко про команду: берем все файлы с расширением &lt;code&gt;.py&lt;&#x2F;code&gt;, исключаем папки миграций, после чего уже внутри самих файлов считаем все не пустые строчки.&lt;&#x2F;p&gt;
&lt;p&gt;Update: Нашел &lt;a rel=&quot;noopener noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AlDanial&#x2F;cloc&quot;&gt;cloc&lt;&#x2F;a&gt; - отличная утилитка для подробного подсчета количества строчек в проектах для разных языков программирования.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Регистрация при восстановлении пароля</title>
          <pubDate>Sat, 17 Jan 2015 00:00:00 +0000</pubDate>
          <author>Rust Saiargaliev</author>
          <link>https://amureki.me/notes/2015-01-17-signup-on-password-recovery/</link>
          <guid>https://amureki.me/notes/2015-01-17-signup-on-password-recovery/</guid>
          <description xml:base="https://amureki.me/notes/2015-01-17-signup-on-password-recovery/">&lt;p&gt;На одном из сервисов недавно возникла ситуация: в поддержку пришло письмо, с жалобой пользователя, которому не приходит письмо для восстановления пароля.&lt;&#x2F;p&gt;
&lt;p&gt;После короткой проверки выяснил, что такого пользователя просто нет в системе.&lt;&#x2F;p&gt;
&lt;p&gt;И в голову пришла мысль, а почему бы не регистрировать пользователей, которые по какой-либо причине считают что уже имеют аккаунт на сайте? Их цель - получить свой пароль и зайти на сервис, так давайте позволим им это.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
