<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
    <title>Лев Верещагин</title>
    <subtitle>Блог Льва</subtitle>
    <link rel="self" type="application/atom+xml" href="https://vrslev.com/ru/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://vrslev.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-27T17:23:00+03:00</updated>
    <id>https://vrslev.com/ru/atom.xml</id>
    <entry xml:lang="ru">
        <title>cmp-cov: Трекаем покрытие Python-кода во время рефакторинга</title>
        <published>2026-04-27T17:23:00+03:00</published>
        <updated>2026-04-27T17:23:00+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/cmp-cov-track-python-test-coverage-during-refactoring/"/>
        <id>https://vrslev.com/ru/posts/cmp-cov-track-python-test-coverage-during-refactoring/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/cmp-cov-track-python-test-coverage-during-refactoring/">&lt;p&gt;Когда покрытие кода тестами не 100%, при рефакторинге сложно отслеживать его изменения. Раньше я либо забивал на это, либо копировал секцию с покрытием и сравнивал дифф вручную в VS Code. Вот такие диффы приходилось отсматривать (тут пример игрушечный: я добавил всего один тест!):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt;13c13&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; chatbotfront&#x2F;api&#x2F;rest&#x2F;system.py                                  9      1    89%   14&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; chatbotfront&#x2F;api&#x2F;rest&#x2F;system.py                                  9      0   100%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt;62c62&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; tests&#x2F;api&#x2F;test_system.py                                         3      0   100%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; tests&#x2F;api&#x2F;test_system.py                                         7      0   100%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt;92,93c92,93&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; TOTAL                                                         2388    105    96%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; ==================================== 208 passed in 44.62s =====================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; TOTAL                                                         2392    104    96%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; ==================================== 209 passed in 44.35s =====================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Чтобы сделать такие проверки проще и человечнее, написал утилиту &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vrslev&#x2F;cmp-cov&quot;&gt;cmp-cov&lt;&#x2F;a&gt;. Она сравнивает текущее покрытие с сохранённым baseline. Пример использования:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pytest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-cov&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; uvx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cmp-cov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; save-baseline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;...pytest output...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Saved&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; baseline&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;Users&#x2F;lev&#x2F;web&#x2F;chat&#x2F;bot&#x2F;front&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  path:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &#x2F;Users&#x2F;lev&#x2F;.cache&#x2F;cmp-coverage&#x2F;%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront&#x2F;default&#x2F;coverage.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  sources:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 85&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;Users&#x2F;lev&#x2F;.cache&#x2F;cmp-coverage&#x2F;%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront&#x2F;default&#x2F;sources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  total:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;   95.69%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Добавил тест, запустил заново — на этот раз c командой &lt;code&gt;diff&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pytest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-cov&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; uvx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cmp-cov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; diff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;...pytest output...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Project:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  &#x2F;Users&#x2F;lev&#x2F;web&#x2F;chat&#x2F;bot&#x2F;front&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Baseline:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; (&#x2F;Users&#x2F;lev&#x2F;.cache&#x2F;cmp-coverage&#x2F;%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront&#x2F;default&#x2F;coverage.xml&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: light-dark(#6F42C1, #B392F0);&quot;&gt;Saved:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    2026-04-27&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 17:16:58&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: light-dark(#6F42C1, #B392F0);&quot;&gt;Total:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 95.69%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; →&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 95.69%&lt;&#x2F;span&gt;&lt;span&gt; (+0.00&lt;&#x2F;span&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: light-dark(#6F42C1, #B392F0);&quot;&gt;↑&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uncovered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; →&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; covered&lt;&#x2F;span&gt;&lt;span&gt; (1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lines,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; runs&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: light-dark(#6F42C1, #B392F0);&quot;&gt;  chatbotfront&#x2F;api&#x2F;rest&#x2F;system.py:14&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: light-dark(#6F42C1, #B392F0);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; covered&lt;&#x2F;span&gt;&lt;span&gt; (4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lines,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; runs&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: light-dark(#6F42C1, #B392F0);&quot;&gt;  tests&#x2F;api&#x2F;test_system.py:7-10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Теперь ясно видно, что изменилось в покрытии.&lt;&#x2F;p&gt;
&lt;p&gt;Из похожего есть &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Bachmann1234&#x2F;diff_cover&quot;&gt;&lt;code&gt;diff-cover&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, но он показывает покрытие только для строк, изменённых в git diff. Мне же нужно сравнивать покрытие до и после, когда меняется сам код.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Исходный код: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vrslev&#x2F;cmp-cov&quot;&gt;github.com&#x2F;vrslev&#x2F;cmp-cov&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Попробовать можно так: &lt;code&gt;uvx cmp-cov save-baseline&lt;&#x2F;code&gt;, поменяйте код, затем &lt;code&gt;uvx cmp-cov diff&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Выживание в ИТ</title>
        <published>2026-01-13T10:48:48+03:00</published>
        <updated>2026-01-13T10:48:48+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/survival-in-it/"/>
        <id>https://vrslev.com/ru/posts/survival-in-it/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/survival-in-it/">&lt;p&gt;Специалисты зарабатывают больше работяг ценой хрупкости и риска перестать быть конкурентно способным:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[...] специалист приобрел много специализированных знаний по низкой себестоимости, чтобы быть конкурентоспособным. Однако, учитывая низкую себестоимость, эти знания не являются надежной основой для дальнейшего профессионального роста; скорее, они одноразовые. Средство выживания для специалиста — это его способность быстро осваивать новые темы, быстро создавать востребованные продукты и затем переходить к следующему. Это называется поверхностным изучением (skimming). Это та же стратегия, которой придерживаются сорняки, если использовать экологическую аналогию. На уровне эксперта, человеку требуется 80–100 часов в неделю, чтобы оставаться конкурентоспособным. Для уровня мастеров это 60–80 часов, а для сохранения компетентности требуется 40–60 часов в неделю.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;em&gt;— Jacob Lund Fisker, книга «Early Retirement Extreme»&lt;&#x2F;em&gt;
&lt;br &#x2F;&gt;&lt;br &#x2F;&gt;
Для того, чтобы оставаться конкурентно способным в ИТ, явно не нужно 80–100 часов в неделю — это перебор. Но общий посыл правда интересный (хоть и несколько заезженный).&lt;&#x2F;p&gt;
&lt;p&gt;Как не оказаться в дураках? В целом, советы тоже уже заезжены, вот, что говорит ChatGPT:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Знания быстро устаревают.
Технические навыки в разработке — «дешёвые единицы знания»: язык, фреймворк, подход. Через 2–5 лет многое нужно осваивать заново.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Главный навык — быстрое обучение.
Разработчик постоянно забывает старое и переучивается под новые технологии. Специализация не даёт устойчивой опоры, важно уметь адаптироваться.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Конкуренция не только по навыкам.
Когда многие дошли до нужного уровня, решение о найме опирается на вторичные факторы: коммуникация, «фит», презентация, стрессоустойчивость.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Карьера — это пирамида, а не лестница.
Выше меньше мест, и рост зависит не только от компетенции. Легко попасть в роль, где сложно быть компетентным (эффект Питера).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Выгорание — системный риск.
Специалисты, идентифицирующие себя с одной технологией, сильнее страдают, когда рынок меняется или знания обесцениваются.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Стратегия выживания — метанавыки.
Ценнее не «знать Django», а уметь:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;учиться быстро&lt;&#x2F;li&gt;
&lt;li&gt;мыслить архитектурно&lt;&#x2F;li&gt;
&lt;li&gt;понимать принципы систем&lt;&#x2F;li&gt;
&lt;li&gt;эффективно использовать AI-инструменты&lt;&#x2F;li&gt;
&lt;li&gt;развивать софт-скиллы&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Это вещи, которые устаревают медленнее всего.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ИТ по сути — про адаптацию.
Разработчик успешен тогда, когда не привязан к инструменту, а способен решать задачи и переключаться между технологиями без боли.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>View Transitions и Speculation Rules</title>
        <published>2025-12-30T14:31:34+03:00</published>
        <updated>2025-12-30T14:31:34+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/view-transitions-and-speculation-rules/"/>
        <id>https://vrslev.com/ru/posts/view-transitions-and-speculation-rules/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/view-transitions-and-speculation-rules/">&lt;p&gt;Приятно видеть, как современные функции CSS меняют веб-разработку: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.jonoalderson.com&#x2F;conjecture&#x2F;its-time-for-modern-css-to-kill-the-spa&#x2F;&quot;&gt;It&#x27;s time for modern CSS to kill the SPA - Jono Alderson&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;View Transitions и Speculation Rules отлично подходят для простых сайтов. Они предлагают нативные решения браузера для плавной навигации и оптимизации производительности без сложности SPA. Кстати, сайт vrslev.com уже использует правила предсказания для более быстрой загрузки страниц.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Любая аугментация — это одновременно и ампутация</title>
        <published>2025-12-28T16:31:11+03:00</published>
        <updated>2025-12-28T16:31:11+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/every-augmentation-is-also-an-amputation/"/>
        <id>https://vrslev.com/ru/posts/every-augmentation-is-also-an-amputation/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/every-augmentation-is-also-an-amputation/">&lt;p&gt;Большинство технологий — это обоюдоострый меч:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Говоря о влиянии технологий на отдельного человека и общество в целом, &lt;strong&gt;любая аугментация — это одновременно и ампутация&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;— &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nealstephenson.substack.com&#x2F;p&#x2F;remarks-on-ai-from-nz&quot;&gt;Нил Стивенсон&lt;&#x2F;a&gt;, «Заметки об ИИ из Новой Зеландии» (via &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2025&#x2F;May&#x2F;18&#x2F;neal-stephenson&#x2F;&quot;&gt;Саймон Уиллисон&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Автоматическая аннотация функций Python одной комбинацией клавиш в VS Code</title>
        <published>2025-07-24T00:49:28+03:00</published>
        <updated>2025-07-24T00:49:28+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/auto-type-annotate/"/>
        <id>https://vrslev.com/ru/posts/auto-type-annotate/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/auto-type-annotate/">&lt;p&gt;Я посмотрел &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=YTDpiP1-PRg&quot;&gt;это видео&lt;&#x2F;a&gt; от &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;asottile&quot;&gt;Энтони Соттиле&lt;&#x2F;a&gt; о полезном инструменте для автоматической генерации аннотаций функций: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getsentry&#x2F;auto-type-annotate&quot;&gt;auto-type-annotate&lt;&#x2F;a&gt;. Он, в свою очередь, вдохновлён не поддерживаемым инструментом &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dropbox&#x2F;pyannotate&quot;&gt;PyAnnotate&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Вдохновившись этим, я &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vrslev&#x2F;dotfiles&#x2F;compare&#x2F;955fa16aef44ab094c598028352b088b10954666...68f096e10f46dcdfb5f55c4552cbe26616a28c47&quot;&gt;добавил&lt;&#x2F;a&gt; собственную комбинацию клавиш в VS Code: теперь при нажатии Cmd+K, а затем Cmd+M, аннотации волшебным образом появляются у [некоторых] функций!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Простые DSL, которые работают</title>
        <published>2025-07-08T14:34:43+03:00</published>
        <updated>2025-07-08T14:34:43+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/simple-dsls-that-work/"/>
        <id>https://vrslev.com/ru/posts/simple-dsls-that-work/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/simple-dsls-that-work/">&lt;p&gt;Год назад я выпустил &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;community-of-python&#x2F;auto-typing-final&quot;&gt;auto-typing-final&lt;&#x2F;a&gt; — исправитель и линтер, реализующий правило из &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;community-of-python&#x2F;pylines&#x2F;blob&#x2F;6a9fa5d46c46fecce66749760ad745d64e1c2c14&#x2F;code-style.md&quot;&gt;руководства по стилю&lt;&#x2F;a&gt; сообщества Python Raiffeisenbank России: «используйте &lt;code&gt;typing.Final&lt;&#x2F;code&gt; для констант». Сейчас он интегрирован во всей нашей кодовой базе (даже есть расширение для VS Code).&lt;&#x2F;p&gt;
&lt;p&gt;Вдохновлённый работой над Ty в &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;charliermarsh&#x2F;ruff&quot;&gt;Ruff&lt;&#x2F;a&gt; и PR Карла Мейера с фреймворком тестирования на основе Markdown &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;astral-sh&#x2F;ruff&#x2F;pull&#x2F;13636&quot;&gt;в Ruff&lt;&#x2F;a&gt;, где показано, как встроенные примеры тестов в Markdown могут упростить и тестирование, и документацию.&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы упростить и тесты, и документацию, я &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;community-of-python&#x2F;auto-typing-final&#x2F;pull&#x2F;125&quot;&gt;реализовал&lt;&#x2F;a&gt; простой внутренний DSL на основе Markdown для определения сценариев преобразований прямо в тексте:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;###&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt; Множественные присваивания с &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&quot;&gt;Final&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);font-weight: bold;&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&gt;```&lt;&#x2F;span&gt;&lt;span&gt;python&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Final&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; удалить («удалить» означает, что нужно убрать «Final». Есть ещё «вставить» — обратное действие)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Такие примеры заменили сложную параметризацию с многострочными строками.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Почему этот внутренний DSL работает:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Повышает ясность. Заголовки описывают каждый тестовый случай, а блоки кода с разделителями отделяют входные данные, ожидаемые изменения и аннотации.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Единый источник истины. Один и тот же фрагмент Markdown одновременно управляет параметризацией pytest и служит пользовательской документацией.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;vyvod&quot;&gt;Вывод&lt;a class=&quot;zola-anchor&quot; href=&quot;#vyvod&quot; aria-label=&quot;Anchor link for: vyvod&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Небольшие DSL, подобные этому, работают эффективно: их легко парсить, читать и писать.
Этот пример доказывает, что порой самые простые инструменты оказывают наибольшее влияние.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Декларативный Homebrew</title>
        <published>2024-05-14T14:51:08+03:00</published>
        <updated>2024-05-14T14:51:08+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/declarative-homebrew/"/>
        <id>https://vrslev.com/ru/posts/declarative-homebrew/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/declarative-homebrew/">&lt;p&gt;Мне важно поддерживать единообразную среду разработки на обоих моих MacBook — рабочем и личном. (Именно поэтому я &lt;a href=&quot;..&#x2F;dev-env-with-mise&quot;&gt;использую&lt;&#x2F;a&gt; mise и храню &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vrslev&#x2F;dotfiles&quot;&gt;dotfiles&lt;&#x2F;a&gt; в репозитории.)&lt;&#x2F;p&gt;
&lt;p&gt;Ранее меня беспокоил один момент в этом процессе — поддержание актуальности установленных пакетов Homebrew. Раньше я время от времени запускал команду &lt;code&gt;make dump&lt;&#x2F;code&gt;, которая обновляла Brewfile с помощью &lt;code&gt;brew bundle dump&lt;&#x2F;code&gt;. Проблема заключалась в том, что состояние файла всегда отставало от реального состояния системы.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь у меня есть функция Fish, которая обновляет Brewfile при каждом выполнении потенциально разрушительной команды brew:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt; brew&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  command&lt;&#x2F;span&gt;&lt;span&gt; brew &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;argv&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;and&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: light-dark(#D73A49, #F97583);&quot;&gt;  switch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;argv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    case&lt;&#x2F;span&gt;&lt;span&gt; install uninstall reinstall tap untap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      brew&lt;&#x2F;span&gt;&lt;span&gt; bundle dump&lt;&#x2F;span&gt;&lt;span&gt; --file&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;DOTFILES_ROOT&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;Brewfile&lt;&#x2F;span&gt;&lt;span&gt; --force&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;end&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>mise-en-place: среда разработки в мире cargo</title>
        <published>2024-05-11T09:46:33+03:00</published>
        <updated>2024-05-11T09:46:33+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/dev-env-with-mise/"/>
        <id>https://vrslev.com/ru/posts/dev-env-with-mise/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/dev-env-with-mise/">&lt;p&gt;Пару дней назад я открыл для себя &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mise.jdx.dev&quot;&gt;mise&lt;&#x2F;a&gt; (произносится как «meez»). Это универсальный менеджер версий инструментов, похожий на asdf или pyenv, а также менеджер окружения, как direnv, который отличается высокой скоростью работы, надёжностью, декларативной конфигурацией и таким же удобством использования, как у cargo.&lt;&#x2F;p&gt;
&lt;p&gt;Я отказался от &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hatch.pypa.io&#x2F;latest&#x2F;&quot;&gt;hatch&lt;&#x2F;a&gt;, который ранее использовал исключительно для загрузки Python из &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;indygreg&#x2F;python-build-standalone&quot;&gt;python-build-standalone&lt;&#x2F;a&gt; с помощью команды &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hatch.pypa.io&#x2F;1.10&#x2F;blog&#x2F;2023&#x2F;12&#x2F;11&#x2F;hatch-v180&#x2F;#python-management&quot;&gt;&lt;code&gt;hatch python install all --update&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. Я также перестал использовать Node из Homebrew и удалил собственные скрипты из dotfiles, которые синхронизировали установки pipx между рабочим и личным ноутбуками.&lt;&#x2F;p&gt;
&lt;p&gt;Мой &lt;code&gt;~&#x2F;.config&#x2F;mise&#x2F;config.toml&lt;&#x2F;code&gt; теперь выглядит так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tools&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;python&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3.12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3.11&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3.10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3.9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3.8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&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;node&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;usage&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;latest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; требуется самим mise&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;pipx:maturin&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;latest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;pipx:poetry&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;latest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;pipx:pypi-command-line&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;latest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;pipx:watchfiles&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;latest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&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&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;settings&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;experimental&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; бэкенд pipx находится в экспериментальном режиме&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Кроме того, я начал использовать функцию управления окружением от mise. Файл &lt;code&gt;.mise.local.toml&lt;&#x2F;code&gt; с переменными окружения, специфичными для компании, я разместил в директории с рабочими репозиториями:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env&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;PIP_INDEX_URL&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CERT_PATH&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;GITLAB_TOKEN&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&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: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Пока что всё работает отлично.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Привет 🎉</title>
        <published>2024-02-02T20:16:52+03:00</published>
        <updated>2024-02-02T20:16:52+03:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://vrslev.com/ru/posts/intro/"/>
        <id>https://vrslev.com/ru/posts/intro/</id>
        
        <content type="html" xml:base="https://vrslev.com/ru/posts/intro/">&lt;p&gt;Привет! 👋&lt;&#x2F;p&gt;
&lt;p&gt;Меня зовут Лев, я самоучка-разработчик из России. Я начинаю свою первую работу через неделю, и мне не терпится познакомиться со многими новыми вещами. Именно поэтому я решил документировать свои знания в формате TIL (Today I Learned).&lt;&#x2F;p&gt;
&lt;p&gt;Следите за обновлениями, до скорой встречи!&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
