<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.kerembozdas.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.kerembozdas.com/" rel="alternate" type="text/html" /><updated>2026-05-08T12:43:30+00:00</updated><id>https://blog.kerembozdas.com/feed.xml</id><title type="html">Kerem Bozdas</title><subtitle>Personal blog</subtitle><entry><title type="html">FlashSpace Raycast Extension</title><link href="https://blog.kerembozdas.com/2026/05/08/raycast-flashspace-extension.html" rel="alternate" type="text/html" title="FlashSpace Raycast Extension" /><published>2026-05-08T09:27:00+00:00</published><updated>2026-05-08T09:27:00+00:00</updated><id>https://blog.kerembozdas.com/2026/05/08/raycast-flashspace-extension</id><content type="html" xml:base="https://blog.kerembozdas.com/2026/05/08/raycast-flashspace-extension.html"><![CDATA[<div class="paragraph">
<p>I published a <a href="https://www.raycast.com/krmbzds/flashspace">Raycast extension</a> extension that lets you control FlashSpace without leaving your keyboard.
If you use FlashSpace to manage virtual workspaces on macOS now you can do so from within Raycast.</p>
</div>
<div class="sect1">
<h2 id="_features">Features</h2>
<div class="sectionbody">
<details>
<summary class="title">Details</summary>
<div class="content">
<div class="ulist">
<div class="title">Workspace Management</div>
<ul>
<li>
<p><strong>List Workspaces</strong> - View all workspaces with display assignments</p>
</li>
<li>
<p><strong>Create Workspace</strong> - Create new workspaces with display, icon, and hotkey options</p>
</li>
<li>
<p><strong>Delete Workspace</strong> - Remove workspaces with confirmation dialog</p>
</li>
<li>
<p><strong>Update Workspace</strong> - Modify workspace display and app settings</p>
</li>
<li>
<p><strong>Activate Workspace</strong> - Quick-switch to any workspace by name</p>
</li>
</ul>
</div>
<div class="ulist">
<div class="title">Profile Management</div>
<ul>
<li>
<p><strong>List Profiles</strong> - View all profiles with active indicator</p>
</li>
<li>
<p><strong>Create Profile</strong> - Create profiles with copy and activate options</p>
</li>
<li>
<p><strong>Delete Profile</strong> - Remove profiles with confirmation dialog</p>
</li>
</ul>
</div>
<div class="ulist">
<div class="title">App Management</div>
<ul>
<li>
<p><strong>Assign App</strong> - Assign running apps to workspaces</p>
</li>
<li>
<p><strong>Unassign App</strong> - Remove app assignments from all workspaces</p>
</li>
<li>
<p><strong>Assign Visible Apps</strong> - Bulk-assign all visible apps to a workspace</p>
</li>
<li>
<p><strong>List Workspace Apps</strong> - View apps assigned to each workspace</p>
</li>
<li>
<p><strong>List Running Apps</strong> - View all currently running apps</p>
</li>
<li>
<p><strong>Floating Apps</strong> - Toggle float/unfloat for apps</p>
</li>
</ul>
</div>
<div class="ulist">
<div class="title">Utility Commands</div>
<ul>
<li>
<p><strong>Focus Window</strong> - Focus windows by direction or cycle through apps/windows</p>
</li>
<li>
<p><strong>List Displays</strong> - View connected displays with active indicator</p>
</li>
<li>
<p><strong>Get Status</strong> - View current active profile, workspace, app, and display</p>
</li>
<li>
<p><strong>Hide Unassigned Apps</strong> - Hide all apps not assigned to any workspace</p>
</li>
<li>
<p><strong>Open FlashSpace</strong> - Launch the FlashSpace application</p>
</li>
<li>
<p><strong>Open Space Control</strong> - Open FlashSpace Space Control</p>
</li>
</ul>
</div>
</div>
</details>
</div>
</div>
<div class="sect1">
<h2 id="_screenshots">Screenshots</h2>
<div class="sectionbody">
<details>
<summary class="title">Details</summary>
<div class="content">
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/4987ad99-f37a-4706-91b1-e6df863680b0" alt="FlashSpace - List Profiles" width="600">
</div>
<div class="title">Figure 1. List profiles and switch between them</div>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/b8410355-3cb3-467e-a02a-1326db02f328" alt="FlashSpace - List Workspaces" width="600">
</div>
<div class="title">Figure 2. List workspaces and switch between them</div>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/b18ba0d0-2fcd-4256-9d7b-ab98f349829e" alt="FlashSpace - List Workspace Apps" width="600">
</div>
<div class="title">Figure 3. List apps running in active workspace or other workspaces and switch between them</div>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/626ef10c-e53e-4a38-9181-95e3dab702b1" alt="FlashSpace - Floating Apps" width="600">
</div>
<div class="title">Figure 4. Toggle float/unfloat for running apps</div>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/7af7d896-3332-4390-b611-f6ba7149ed52" alt="FlashSpace - Assign App to Workspace" width="600">
</div>
<div class="title">Figure 5. Assign app to workspace</div>
</div>
<div class="imageblock text-center">
<div class="content">
<img src="https://github.com/user-attachments/assets/d9b2e657-767b-4f52-8b80-8378e6d12a0f" alt="FlashSpace - Create New Workspace" width="600">
</div>
<div class="title">Figure 6. Create new workspace</div>
</div>
</div>
</details>
</div>
</div>
<div class="sect1">
<h2 id="_installation">Installation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Open <a href="https://www.raycast.com/krmbzds/flashspace">FlashSpace Raycast extension</a> page on the Raycast Store and click Install or search for "FlashSpace" inside Raycast Store.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_prerequisites">Prerequisites</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>FlashSpace (the app) must be installed on your Mac.</p>
</li>
<li>
<p>The flashspace CLI must be available in your PATH, or set a custom path in the extension preferences. Common locations:</p>
<div class="ulist">
<ul>
<li>
<p><code>/opt/homebrew/bin/flashspace</code></p>
</li>
<li>
<p><code>/usr/local/bin/flashspace</code></p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Open Raycast extension preferences to set a custom path if needed.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_feedback-and-contributions">Feedback and contributions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you use the extension and find issues or want features, open an issue or a PR on the FlashSpace extensions repo. The extension depends on the FlashSpace app and its CLI; feature parity follows what&#8217;s exposed by the app/CLI. Download <a href="https://github.com/wojciech-kulik/FlashSpace">FlashSpace App</a> to use this extension.</p>
</div>
<div class="paragraph">
<p>Happy hacking!</p>
</div>
</div>
</div>]]></content><author><name></name></author><category term="extensions" /><summary type="html"><![CDATA[Manage FlashSpace workspaces, profiles and apps directly from Raycast]]></summary></entry><entry><title type="html">Longman Dictionary Desktop and TUI Clients</title><link href="https://blog.kerembozdas.com/2026/05/07/longman-dictionary-qt-and-tui-clients.html" rel="alternate" type="text/html" title="Longman Dictionary Desktop and TUI Clients" /><published>2026-05-07T16:32:00+00:00</published><updated>2026-05-07T16:32:00+00:00</updated><id>https://blog.kerembozdas.com/2026/05/07/longman-dictionary-qt-and-tui-clients</id><content type="html" xml:base="https://blog.kerembozdas.com/2026/05/07/longman-dictionary-qt-and-tui-clients.html"><![CDATA[<div class="paragraph">
<p>I&#8217;ve just released two clients for the Longman Dictionary of Contemporary English (LDOCE 5th ed.): a fork of Qt-based desktop client and a terminal client written in Rust.</p>
</div>
<div class="sect1">
<h2 id="_ldoce5viewer"><a href="https://github.com/krmbzds/ldoce5viewer">ldoce5viewer</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>My updated fork of the original LDOCE viewer. I kept the original project as a base and applied fixes and improvements so it works well on modern systems. Notable changes are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Migration from Qt4 to Qt5</p>
</li>
<li>
<p>Automatic Dark Mode Support</p>
</li>
<li>
<p>Complete Python 3 Migration</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/user-attachments/assets/3547e025-40e1-405d-9017-d8887336001c" alt="ldoce5viewer screenshot" width="600">
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ldoce5viewer-tui"><a href="https://github.com/krmbzds/ldoce5viewer-tui">ldoce5viewer-tui</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>A Rust rewrite of the original Python TUI implementation. It brings a snappy, keyboard-driven experience to the terminal while keeping the same familiar workflow. The rewrite focuses on performance, responsiveness, and portability; if you prefer working inside the terminal, the Rust client is lightweight and fast while preserving the features people liked in the original Python version.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/user-attachments/assets/10ca502a-7084-4899-bfb6-8ed46dfde671" alt="ldoce5viewer-tui screenshot" width="600">
</div>
</div>
<div class="ulist">
<div class="title">Notable features:</div>
<ul>
<li>
<p>Terminal-first, keyboard-driven UI with low latency and small memory footprint</p>
</li>
<li>
<p>Vim-style navigation, browser-like history, find-in-page and Zen mode</p>
</li>
<li>
<p>Tantivy-powered full-text search with advanced filters overlay</p>
</li>
<li>
<p>Live incremental (prefix) search while you type</p>
</li>
<li>
<p>Audio playback support from the terminal</p>
</li>
<li>
<p>In-terminal picture rendering on Kitty/iTerm2, Unicode block fallback elsewhere</p>
</li>
<li>
<p>Single-binary builds via Cargo and cross-platform support</p>
</li>
</ul>
</div>
<div class="ulist">
<div class="title">Both projects are available on GitHub:</div>
<ul>
<li>
<p><a href="https://github.com/krmbzds/ldoce5viewer">ldoce5viewer</a></p>
</li>
<li>
<p><a href="https://github.com/krmbzds/ldoce5viewer-tui">ldoce5viewer-tui</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Check the repositories for releases, installation instructions, and pre-built binaries.</p>
</div>
<div class="paragraph">
<p>Happy hacking!</p>
</div>
</div>
</div>]]></content><author><name></name></author><category term="tui" /><summary type="html"><![CDATA[LDDOCE5 clients for desktop and terminal]]></summary></entry><entry><title type="html">How to continue using master branch in Git</title><link href="https://blog.kerembozdas.com/2025/11/22/how-to-continue-using-master-branch-in-git.html" rel="alternate" type="text/html" title="How to continue using master branch in Git" /><published>2025-11-22T07:19:00+00:00</published><updated>2025-11-22T07:19:00+00:00</updated><id>https://blog.kerembozdas.com/2025/11/22/how-to-continue-using-master-branch-in-git</id><content type="html" xml:base="https://blog.kerembozdas.com/2025/11/22/how-to-continue-using-master-branch-in-git.html"><![CDATA[<div class="paragraph">
<p>Git <a href="https://lore.kernel.org/lkml/xmqqv9ildh46.fsf@gitster.c.googlers.com">v2.28.0</a> adds configuration options to allow users to define their preferred default branch name for new repositories. Also, in this version the default branch was changed from <code>master</code> to <code>main</code>.</p>
</div>
<div class="sect1">
<h2 id="_configuring-local-repositories">Configuring Local Repositories</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you prefer to stick with <code>master</code>, you can set a global configuration that <code>git init</code> will respect:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="console"><span></span><span class="tok-gp">$ </span>git<span class="tok-w"> </span>config<span class="tok-w"> </span>--global<span class="tok-w"> </span>init.defaultBranch<span class="tok-w"> </span><span class="tok-s2">&quot;master&quot;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Now, every time you run <code>git init</code>, your repository will start with <code>master</code> instead of <code>main</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the-problem-with-cloning">The Problem with Cloning</h2>
<div class="sectionbody">
<div class="paragraph">
<p>While <code>init.defaultBranch</code> enforces your preference for <strong>new</strong> local repositories, forks inherit the upstream repository&#8217;s default branch. If you have muscle memory for <code>git push origin master</code> or simply prefer the consistency of <code>master</code> across all your personal projects, this is annoying. You have to manually rename the branch, push the new branch, update the default branch on the remote, and delete the old one.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_automating-the-fix">Automating the Fix</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To solve this, I wrote a small Ruby script that wraps <code>git clone</code>. It checks if the repository belongs to <code>github.username</code>, clones the repository, renames default branch to <code>master</code>, pushes the <code>master</code> branch, uses <code>gh</code> to change default branch to <code>master</code>, and deletes the old branch.</p>
</div>
<div class="paragraph">
<p>First, make sure you have your GitHub username configured:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="console"><span></span><span class="tok-gp">$ </span>git<span class="tok-w"> </span>config<span class="tok-w"> </span>--global<span class="tok-w"> </span>github.username<span class="tok-w"> </span><span class="tok-s2">&quot;krmbzds&quot;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Here is the script, which I&#8217;ve named <code>git-clone</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="ruby"><span></span><span class="tok-ch">#!/usr/bin/env ruby</span>

<span class="tok-n">repo_url</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-no">ARGV</span><span class="tok-o">[</span><span class="tok-mi">0</span><span class="tok-o">]</span><span class="tok-w"> </span><span class="tok-o">||</span><span class="tok-w"> </span><span class="tok-nb">abort</span><span class="tok-p">(</span><span class="tok-s2">&quot;Usage: </span><span class="tok-si">#{</span><span class="tok-vg">$PROGRAM_NAME</span><span class="tok-si">}</span><span class="tok-s2"> &lt;repo_url&gt;&quot;</span><span class="tok-p">)</span>
<span class="tok-n">user</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-sb">`git config github.username 2&gt;/dev/null`</span><span class="tok-o">.</span><span class="tok-n">strip</span>
<span class="tok-nb">exec</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;clone&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">repo_url</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-k">if</span><span class="tok-w"> </span><span class="tok-n">user</span><span class="tok-o">.</span><span class="tok-n">empty?</span><span class="tok-w"> </span><span class="tok-o">||</span><span class="tok-w"> </span><span class="tok-o">!</span><span class="tok-n">repo_url</span><span class="tok-o">.</span><span class="tok-n">match?</span><span class="tok-p">(</span><span class="tok-sr">%r{[:/](</span><span class="tok-si">#{</span><span class="tok-no">Regexp</span><span class="tok-o">.</span><span class="tok-n">escape</span><span class="tok-p">(</span><span class="tok-n">user</span><span class="tok-p">)</span><span class="tok-si">}</span><span class="tok-sr">)/}</span><span class="tok-p">)</span>

<span class="tok-k">if</span><span class="tok-w"> </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;clone&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">repo_url</span><span class="tok-p">)</span>
<span class="tok-w">  </span><span class="tok-n">dir</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-no">File</span><span class="tok-o">.</span><span class="tok-n">basename</span><span class="tok-p">(</span><span class="tok-n">repo_url</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;.git&quot;</span><span class="tok-p">)</span>

<span class="tok-w">  </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;which&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;gh&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-ss">out</span><span class="tok-p">:</span><span class="tok-w"> </span><span class="tok-no">File</span><span class="tok-o">::</span><span class="tok-no">NULL</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-p">(</span><span class="tok-n">owner</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">repo_name</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-n">repo_url</span><span class="tok-o">.</span><span class="tok-n">match</span><span class="tok-p">(</span><span class="tok-sr">%r{github\.com[:/](.+?)/(.+?)(?:\.git)?$}</span><span class="tok-p">)</span><span class="tok-o">.</span><span class="tok-n">captures</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-C&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">dir</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;checkout&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-b&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;master&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;origin/main&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-C&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">dir</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;push&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-u&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;origin&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;master&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;gh&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;api&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;--silent&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;repos/</span><span class="tok-si">#{</span><span class="tok-n">owner</span><span class="tok-si">}</span><span class="tok-s2">/</span><span class="tok-si">#{</span><span class="tok-n">repo_name</span><span class="tok-si">}</span><span class="tok-s2">&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-X&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;PATCH&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-f&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;default_branch=master&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-C&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">dir</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;branch&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-D&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;main&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">&amp;&amp;</span>
<span class="tok-w">    </span><span class="tok-nb">system</span><span class="tok-p">(</span><span class="tok-s2">&quot;git&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;-C&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-n">dir</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;push&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;origin&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;--delete&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;main&quot;</span><span class="tok-p">)</span>
<span class="tok-k">end</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Currently the script only works for GitHub repositories. However, you can easily adapt or extend it.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_usage">Usage</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To use this script without replacing your system <code>git</code> binary, you can define a shell function in your <code>.zshrc</code> or <code>.bashrc</code>. This function will intercept <code>git clone</code> commands and route them to our script, while passing all other commands to the standard git binary.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="bash"><span></span>git<span class="tok-o">()</span><span class="tok-w"> </span><span class="tok-o">{</span>
<span class="tok-w">  </span><span class="tok-k">if</span><span class="tok-w"> </span><span class="tok-o">[</span><span class="tok-w"> </span><span class="tok-s2">&quot;</span><span class="tok-nv">$1</span><span class="tok-s2">&quot;</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-s2">&quot;clone&quot;</span><span class="tok-w"> </span><span class="tok-o">]</span><span class="tok-p">;</span><span class="tok-w"> </span><span class="tok-k">then</span>
<span class="tok-w">    </span><span class="tok-nb">shift</span>
<span class="tok-w">    </span>~/bin/git-clone<span class="tok-w"> </span><span class="tok-s2">&quot;</span><span class="tok-nv">$@</span><span class="tok-s2">&quot;</span>
<span class="tok-w">  </span><span class="tok-k">else</span>
<span class="tok-w">    </span><span class="tok-nb">command</span><span class="tok-w"> </span>git<span class="tok-w"> </span><span class="tok-s2">&quot;</span><span class="tok-nv">$@</span><span class="tok-s2">&quot;</span>
<span class="tok-w">  </span><span class="tok-k">fi</span>
<span class="tok-o">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>For the script to work you need to install <a href="https://github.com/cli/cli?tab=readme-ov-file#installation">gh</a> and login with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="console"><span></span><span class="tok-gp">$ </span>gh<span class="tok-w"> </span>auth<span class="tok-w"> </span>login</code></pre>
</div>
</div>
<div class="paragraph">
<p>Now you can clone any repository like usual:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="console"><span></span><span class="tok-gp">$ </span>git<span class="tok-w"> </span>clone<span class="tok-w"> </span>https://github.com/krmbzds/rails
<span class="tok-go">Cloning into &#39;rails&#39;...</span>
<span class="tok-go">remote: Enumerating objects: 763230, done.</span>
<span class="tok-go">remote: Counting objects: 100% (124/124), done.</span>
<span class="tok-go">remote: Compressing objects: 100% (77/77), done.</span>
<span class="tok-go">remote: Total 763230 (delta 75), reused 47 (delta 47), pack-reused 763106 (from 3)</span>
<span class="tok-go">Receiving objects: 100% (763230/763230), 216.12 MiB | 6.72 MiB/s, done.</span>
<span class="tok-go">Resolving deltas: 100% (570644/570644), done.</span>
<span class="tok-go">branch &#39;master&#39; set up to track &#39;origin/main&#39;.</span>
<span class="tok-go">Switched to a new branch &#39;master&#39;</span>
<span class="tok-go">Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)</span>
<span class="tok-go">remote:</span>
<span class="tok-go">remote: Create a pull request for &#39;master&#39; on GitHub by visiting:</span>
<span class="tok-go">remote:      https://github.com/krmbzds/rails/pull/new/master</span>
<span class="tok-go">remote:</span>
<span class="tok-go">To https://github.com/krmbzds/rails</span>
<span class="tok-go"> * [new branch]            master -&gt; master</span>
<span class="tok-go">branch &#39;master&#39; set up to track &#39;origin/master&#39;.</span>
<span class="tok-go">Deleted branch main (was 8aebd0b507).</span>
<span class="tok-go">To https://github.com/krmbzds/rails</span>
<span class="tok-go"> - [deleted]               main</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Now all your forks will use master.</p>
</div>
<div class="paragraph">
<p>Happy hacking!</p>
</div>
</div>
</div>]]></content><author><name></name></author><category term="git" /><summary type="html"><![CDATA[Old habits die hard]]></summary></entry><entry><title type="html">New release: turkish_id v1.7.0</title><link href="https://blog.kerembozdas.com/2024/11/10/new-release-turkish-id-v1-7-0.html" rel="alternate" type="text/html" title="New release: turkish_id v1.7.0" /><published>2024-11-10T13:15:00+00:00</published><updated>2024-11-10T13:15:00+00:00</updated><id>https://blog.kerembozdas.com/2024/11/10/new-release-turkish-id-v1-7-0</id><content type="html" xml:base="https://blog.kerembozdas.com/2024/11/10/new-release-turkish-id-v1-7-0.html"><![CDATA[<div class="paragraph">
<p>I&#8217;ve released a new version of <code>turkish_id</code> gem.</p>
</div>
<div class="paragraph">
<p>Now, it supports querying ID numbers for people that are not a Turkish citizen but are registered in the <a href="https://en.wikipedia.org/wiki/Blue_Card_(Turkey)">blue card</a> registry. The numerical validation works the same way, so no differences there. There is a separate endpoint for querying ID numbers that are in the blue card registry; hence the new <code>foreigner_registered?</code> method.</p>
</div>
<div class="paragraph">
<p>Here&#8217;s how you can use it. First, create a new instance:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="rb"><span></span><span class="tok-n">identity_number</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-no">TurkishId</span><span class="tok-o">.</span><span class="tok-n">new</span><span class="tok-p">(</span><span class="tok-s2">&quot;99911494534&quot;</span><span class="tok-p">)</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Use <code>valid?</code> method to check numerical validity:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="rb"><span></span><span class="tok-n">identity_number</span><span class="tok-o">.</span><span class="tok-n">valid?</span><span class="tok-w">  </span><span class="tok-c1">#=&gt; true</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Use <code>foreigner_registered?</code> method to query the foreigner registry:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="pygments highlight"><code data-lang="rb"><span></span><span class="tok-n">identity_number</span><span class="tok-o">.</span><span class="tok-n">foreigner_registered?</span><span class="tok-p">(</span><span class="tok-s2">&quot;Yukihiro&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;Matsumoto&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-mi">14</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-mi">4</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-mi">1965</span><span class="tok-p">)</span><span class="tok-w">  </span><span class="tok-c1">#=&gt; false</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>And that&#8217;s how you can query a person with a <a href="https://en.wikipedia.org/wiki/Blue_Card_(Turkey)">blue card</a>. Hope you find it helpful.</p>
</div>
<div class="paragraph">
<p>Happy hacking!</p>
</div>]]></content><author><name></name></author><category term="rubygems" /><summary type="html"><![CDATA[Now you can query foreigner registry]]></summary></entry><entry><title type="html">My newfound appreciation for LuaSnip</title><link href="https://blog.kerembozdas.com/2023/04/19/my-newfound-appreciation-for-luasnip.html" rel="alternate" type="text/html" title="My newfound appreciation for LuaSnip" /><published>2023-04-19T07:49:00+00:00</published><updated>2023-04-19T07:49:00+00:00</updated><id>https://blog.kerembozdas.com/2023/04/19/my-newfound-appreciation-for-luasnip</id><content type="html" xml:base="https://blog.kerembozdas.com/2023/04/19/my-newfound-appreciation-for-luasnip.html"><![CDATA[<div class="paragraph">
<p>Are you familiar with Neovim, the popular text editor? If so, you may have heard of <a href="https://github.com/L3MON4D3/LuaSnip">LuaSnip</a>, a snippet engine written entirely in Lua.</p>
</div>
<div class="paragraph">
<p>I recently wanted to add my own snippet to create Sidekiq workers. During my search, I came across a YouTube playlist called <a href="https://www.youtube.com/watch?v=Vr7A90_tSns&amp;list=PL0EgBggsoPCnZ3a6c0pZuQRMgS_Z8-Fnr">LuaSnip Zero to Hero</a>. s1n7ax does a great job explaining how to write snippets in Lua. I recommend anyone interested in writing their own Lua snippets to watch it.</p>
</div>
<div class="paragraph">
<p>Whether it&#8217;s XML or JSON-based, most snippet engines come with their own syntax definitions which are often encumbered with constraints. I have dealt with them in the past. After playing around with Lua snippets, I was amazed how flexible they are. You have to see it to believe it. So check it out.</p>
</div>
<div class="paragraph">
<p>Here&#8217;s the snippet I wrote for creating an ActiveRecord Job:</p>
</div>
<div class="listingblock">
<div class="title">.config/nvim/snippets/rails.lua</div>
<div class="content">
<pre class="pygments highlight"><code data-lang="lua"><span></span><span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">luasnip</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nb">require</span><span class="tok-p">(</span><span class="tok-s2">&quot;luasnip&quot;</span><span class="tok-p">)</span>
<span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">fmt</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nb">require</span><span class="tok-p">(</span><span class="tok-s2">&quot;luasnip.extras.fmt&quot;</span><span class="tok-p">).</span><span class="tok-nv">fmt</span>

<span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">s</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nv">luasnip</span><span class="tok-p">.</span><span class="tok-py">snippet</span>
<span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">t</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nv">luasnip</span><span class="tok-p">.</span><span class="tok-py">text_node</span>
<span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">c</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nv">luasnip</span><span class="tok-p">.</span><span class="tok-py">choice_node</span>
<span class="tok-kd">local</span><span class="tok-w"> </span><span class="tok-nv">i</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nv">luasnip</span><span class="tok-p">.</span><span class="tok-py">insert_node</span>

<span class="tok-nv">luasnip</span><span class="tok-p">.</span><span class="tok-nf">add_snippets</span><span class="tok-p">(</span><span class="tok-s2">&quot;rails&quot;</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-p">{</span>
<span class="tok-w">  </span><span class="tok-nf">s</span><span class="tok-p">(</span>
<span class="tok-w">    </span><span class="tok-s2">&quot;job&quot;</span><span class="tok-p">,</span>
<span class="tok-w">    </span><span class="tok-nf">fmt</span><span class="tok-p">(</span>
<span class="tok-w">      </span><span class="tok-s">[[</span>
<span class="tok-s">      class {}Job &lt; ActiveJob::Base</span>
<span class="tok-s">        queue_as :{}</span>
<span class="tok-s">        sidekiq_options retry: {}, backtrace: {}</span>

<span class="tok-s">        def perform({})</span>
<span class="tok-s">          {}</span>
<span class="tok-s">        end</span>
<span class="tok-s">      end</span>
<span class="tok-s">      ]]</span><span class="tok-p">,</span>
<span class="tok-w">      </span><span class="tok-p">{</span>
<span class="tok-w">        </span><span class="tok-nf">i</span><span class="tok-p">(</span><span class="tok-mi">1</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;Example&quot;</span><span class="tok-p">),</span>
<span class="tok-w">        </span><span class="tok-nf">c</span><span class="tok-p">(</span><span class="tok-mi">2</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-p">{</span><span class="tok-w"> </span><span class="tok-nf">t</span><span class="tok-p">(</span><span class="tok-s2">&quot;default&quot;</span><span class="tok-p">),</span><span class="tok-w"> </span><span class="tok-nf">t</span><span class="tok-p">(</span><span class="tok-s2">&quot;low&quot;</span><span class="tok-p">),</span><span class="tok-w"> </span><span class="tok-nf">t</span><span class="tok-p">(</span><span class="tok-s2">&quot;high&quot;</span><span class="tok-p">),</span><span class="tok-w"> </span><span class="tok-nf">t</span><span class="tok-p">(</span><span class="tok-s2">&quot;critical&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-p">}),</span>
<span class="tok-w">        </span><span class="tok-nf">i</span><span class="tok-p">(</span><span class="tok-mi">3</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;25&quot;</span><span class="tok-p">),</span>
<span class="tok-w">        </span><span class="tok-nf">i</span><span class="tok-p">(</span><span class="tok-mi">4</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;false&quot;</span><span class="tok-p">),</span>
<span class="tok-w">        </span><span class="tok-nf">i</span><span class="tok-p">(</span><span class="tok-mi">5</span><span class="tok-p">,</span><span class="tok-w"> </span><span class="tok-s2">&quot;*args&quot;</span><span class="tok-p">),</span>
<span class="tok-w">        </span><span class="tok-nf">i</span><span class="tok-p">(</span><span class="tok-mi">6</span><span class="tok-p">),</span>
<span class="tok-w">      </span><span class="tok-p">}</span>
<span class="tok-w">    </span><span class="tok-p">)</span>
<span class="tok-w">  </span><span class="tok-p">),</span>
<span class="tok-p">})</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>I had to add <a href="https://github.com/krmbzds/nvim/commit/af8ec80d8ea6552275d58718e0276d9c8dfd72a6">this line</a> to load my custom snippets in my <code>lsp-zero</code> config:</p>
</div>
<div class="listingblock">
<div class="title">lua/config/plugins/lsp-zero.lua</div>
<div class="content">
<pre class="pygments highlight"><code data-lang="lua"><span></span><span class="tok-nb">require</span><span class="tok-p">(</span><span class="tok-s2">&quot;luasnip.loaders.from_lua&quot;</span><span class="tok-p">).</span><span class="tok-nb">load</span><span class="tok-p">({</span><span class="tok-w"> </span><span class="tok-nv">paths</span><span class="tok-w"> </span><span class="tok-o">=</span><span class="tok-w"> </span><span class="tok-nv">vim</span><span class="tok-p">.</span><span class="tok-py">fn</span><span class="tok-p">.</span><span class="tok-nf">stdpath</span><span class="tok-p">(</span><span class="tok-s2">&quot;config&quot;</span><span class="tok-p">)</span><span class="tok-w"> </span><span class="tok-o">..</span><span class="tok-w"> </span><span class="tok-s2">&quot;/snippets/&quot;</span><span class="tok-w"> </span><span class="tok-p">})</span>
<span class="tok-nb">require</span><span class="tok-p">(</span><span class="tok-s2">&quot;luasnip.loaders.from_vscode&quot;</span><span class="tok-p">).</span><span class="tok-nf">lazy_load</span><span class="tok-p">()</span><span class="tok-w"> </span><span class="tok-c1">-- friendly-snippets</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Go wild!</p>
</div>]]></content><author><name></name></author><category term="neovim" /><summary type="html"><![CDATA[I learned how to write Lua snippets]]></summary></entry></feed>