<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>All Posts - // TODO: Fix Later (2019)</title><link>https://viktor.dev/en/posts/</link><description>All Posts | // TODO: Fix Later (2019)</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>email@viktor.dev (Viktor Chukhantsev)</managingEditor><webMaster>email@viktor.dev (Viktor Chukhantsev)</webMaster><copyright>© Viktor Chukhantsev</copyright><lastBuildDate>Thu, 12 Dec 2019 19:03:33 +0700</lastBuildDate><atom:link href="https://viktor.dev/en/posts/" rel="self" type="application/rss+xml"/><item><title>A lightning talk by Gary Bernhardt from CodeMash 2012</title><link>https://viktor.dev/en/2019-12-12-gary-bernhardt-from-codemash-2012/</link><pubDate>Thu, 12 Dec 2019 19:03:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-12-12-gary-bernhardt-from-codemash-2012/</guid><description><![CDATA[<p></p>
<p><a href="https://www.destroyallsoftware.com/talks/wat" target="_blank" rel="noopener noreffer ">Watch on www.destroyallsoftware.com</a></p>]]></description></item><item><title>Flask nocache decorator</title><link>https://viktor.dev/en/2019-11-21-flask-nocache-decorator/</link><pubDate>Tue, 22 Oct 2019 10:03:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-11-21-flask-nocache-decorator/</guid><description><![CDATA[<p>Flask nocache decorator.</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">make_response</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span><span class="p">,</span> <span class="n">update_wrapper</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">nocache</span><span class="p">(</span><span class="n">view</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="nd">@wraps</span><span class="p">(</span><span class="n">view</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">no_cache</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span> <span class="o">=</span> <span class="n">make_response</span><span class="p">(</span><span class="n">view</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Last-Modified&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Cache-Control&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Pragma&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;no-cache&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Expires&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;-1&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">response</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">update_wrapper</span><span class="p">(</span><span class="n">no_cache</span><span class="p">,</span> <span class="n">view</span><span class="p">)</span></span></span></code></pre></div></div>
<p>Use it wisely.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">nocache</span> <span class="kn">import</span> <span class="n">nocache</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.route</span><span class="p">(</span><span class="s1">&#39;/my_endpoint&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@nocache</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">my_endpoint</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;Endpoint without cache&#34;</span></span></span></code></pre></div></div>]]></description></item><item><title>Move Sidekiq jobs</title><link>https://viktor.dev/en/2019-10-22-move-sidekiq-jobs/</link><pubDate>Tue, 22 Oct 2019 02:51:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-10-22-move-sidekiq-jobs/</guid><description><![CDATA[<p>I was looking for a way to move jobs from one high priority queue to another less prioritized in Sidekiq.</p>
<p>There is nothing built into Sidekiq to complete this, but obviously, you can just use Redis commands to do it.</p>
<p>Here is code snippet to do that.</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-ruby">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">from_queue_name</span> <span class="o">=</span> <span class="s1">&#39;default&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">to_queue_name</span> <span class="o">=</span> <span class="s1">&#39;low&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">count_block</span> <span class="o">=</span> <span class="nb">proc</span> <span class="p">{</span> <span class="no">Sidekiq</span><span class="o">.</span><span class="n">redis</span> <span class="k">do</span> <span class="o">|</span><span class="n">conn</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="n">conn</span><span class="o">.</span><span class="n">llen</span><span class="p">(</span><span class="s2">&#34;queue:</span><span class="si">#{</span><span class="n">from_queue_name</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="n">count_block</span><span class="o">.</span><span class="n">call</span> <span class="o">&gt;</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">  <span class="no">Sidekiq</span><span class="o">.</span><span class="n">redis</span> <span class="k">do</span> <span class="o">|</span><span class="n">conn</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">    <span class="n">conn</span><span class="o">.</span><span class="n">rpoplpush</span> <span class="s2">&#34;queue:</span><span class="si">#{</span><span class="n">from_queue_name</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;queue:</span><span class="si">#{</span><span class="n">to_queue_name</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div></div>
<p>This code snippet will move all the items from one queue to another until there are no more jobs.</p>]]></description></item><item><title>Rational alternative of Agile</title><link>https://viktor.dev/en/2019-10-23-rational-alternative-of-agile/</link><pubDate>Tue, 22 Oct 2019 02:51:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-10-23-rational-alternative-of-agile/</guid><description><![CDATA[<p>Somehow you know something is wrong in a software team when 80% of the time the people are just talking, meeting, scratching on a board&hellip; but not coding.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2u0sNRO-QKQ?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>]]></description></item><item><title>Ruby on Rails Engine vs Mountable App</title><link>https://viktor.dev/en/2019-07-26-ruby-on-rails-enginve-vs-mountable-app/</link><pubDate>Fri, 26 Jul 2019 03:03:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-07-26-ruby-on-rails-enginve-vs-mountable-app/</guid><description><![CDATA[<h1 id="full-engine">Full Engine</h1>
<p>With a full engine, the parent application inherits the routes from the engine. It is not necessary to specify anything in <strong>parent_app/config/routes.rb</strong>. Specifying the gem in <strong>Gemfile</strong> is enough for the parent app to inherit the models, routes etc. The engine routes are specified as:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-ruby">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># new_engine/config/routes.rb </span>
</span></span><span class="line"><span class="cl"><span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span> 
</span></span><span class="line"><span class="cl">  <span class="c1"># whatever </span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div></div>
<p><em>No namespacing of models, controllers, etc. These are immediately accessible to the parent application.</em></p>]]></description></item><item><title>Split Ruby on Rails routes into multiple smaller files</title><link>https://viktor.dev/en/2019-07-26-split-ruby-on-rails-routes/</link><pubDate>Fri, 26 Jul 2019 02:51:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-07-26-split-ruby-on-rails-routes/</guid><description><![CDATA[<p>One time I faced fact that my application is big enough and <strong>routes.rb</strong> look like a mess. I’ve managed that this way.</p>
<p>I added routes directory to application config directory and added it in <strong>autoload_paths</strong> to ensure that routes are reloaded when these files change.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-ruby">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># config/application.rb</span>
</span></span><span class="line"><span class="cl"><span class="n">config</span><span class="o">.</span><span class="n">autoload_paths</span> <span class="o">&lt;&lt;</span> <span class="no">Rails</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;config/routes&#39;</span><span class="p">)</span></span></span></code></pre></div></div>
<p>Then moved necessary routes to small files like this.</p>]]></description></item><item><title>Clear Sidekiq queues</title><link>https://viktor.dev/en/2019-07-26-clear-sidekiq-queues/</link><pubDate>Fri, 26 Jul 2019 01:03:33 +0700</pubDate><author>email@viktor.dev (Viktor Chukhantsev)</author><guid>https://viktor.dev/en/2019-07-26-clear-sidekiq-queues/</guid><description><![CDATA[<p>Sidekiq is mostly used for moving long-running jobs into a background process. It uses Redis to manage its job queue. We often need to clear this queue of jobs to start afresh.</p>
<p>To clear the queue of jobs, I ran the following commands as listed in Sidekiq wiki.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-ruby">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="no">Sidekiq</span><span class="o">::</span><span class="no">ScheduledSet</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">clear</span>
</span></span><span class="line"><span class="cl"><span class="no">Sidekiq</span><span class="o">::</span><span class="no">RetrySet</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">clear</span></span></span></code></pre></div></div>
<p>Sometimes, these commands would clear the queue. Other times, you would need to clear the queue from Redis itself.</p>]]></description></item></channel></rss>