<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alex Selimov</title><link>https://www.alexselimov.com/</link><description>Recent content on Alex Selimov</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><managingEditor>alex@alexselimov.com (Alex Selimov)</managingEditor><webMaster>alex@alexselimov.com (Alex Selimov)</webMaster><copyright>© Alex Selimov</copyright><lastBuildDate>Mon, 03 Oct 2022 14:17:10 -0400</lastBuildDate><atom:link href="https://www.alexselimov.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Kagi Search, human connection, and why LLMs are not a good search replacement</title><link>https://www.alexselimov.com/posts/small_search_human_contact/</link><pubDate>Wed, 03 Jun 2026 22:04:23 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/small_search_human_contact/</guid><description>&lt;p>I switched to Kagi search maybe 1 to 2 months ago, and I&amp;rsquo;ve noticed a significant life quality improvement.
The amount of AI slop web pages I have to click through before getting to a real answer has dropped significantly.
Sadly, for certain searches I still get the AI slop summary pages, but it&amp;rsquo;s a lot more manageable since switching.
The biggest surprise for me has been the friends I made along the way.&lt;/p></description><content:encoded><![CDATA[<p>I switched to Kagi search maybe 1 to 2 months ago, and I&rsquo;ve noticed a significant life quality improvement.
The amount of AI slop web pages I have to click through before getting to a real answer has dropped significantly.
Sadly, for certain searches I still get the AI slop summary pages, but it&rsquo;s a lot more manageable since switching.
The biggest surprise for me has been the friends I made along the way.</p>
<h2 id="kagi-search-exposes-me-to-a-lot-more-blog-based-solutions">Kagi search exposes me to a lot more blog based solutions</h2>
<p>I&rsquo;ve found that searching for solutions to technical problems in Kagi brings me to many more blogs.
Recently I&rsquo;ve been learning Zig, coming from a mainly Rust/C++ background.
As with any language, I&rsquo;ve been searching for the idiomatic approach to solving different problems to make sure I understand the Zig &ldquo;philosophy.&rdquo;
With Kagi I feel like I get taken to more blogs where I can read the struggles and solutions of real human beings.</p>
<p>One recent example was my struggle with parsing JSON in Zig, particularly around the <code>std.json.Parsed</code> type.
Nice posts from Karl Seguin<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> gave me a good overview as well as a deeper dive into the <code>Parsed</code> type.
Most helpful was that it seemed like he had the same distaste about passing around a <code>Parsed(T)</code> instead of <code>T</code> and gave a decent solution.
This was a better solution than what ChatGPT recommended which I really appreciated.</p>
<h2 id="human-connection-through-blogs">Human connection through blogs</h2>
<p>In addition to reading the actual unique voice and experience of a human being, I found that most blogs (including mine) have a reply by email option.
I really wish I had saved the source, but some time ago I read a blog post telling people to respond via email when you see a good blog post.
I&rsquo;ve been making an effort to do it when I find a post that has been very helpful.
Most times it&rsquo;s just a short &ldquo;Thank you for your post on X, it really helped me out with my issues!&rdquo;
Every time I&rsquo;ve done this, I get a short response from the blog owner mentioning that they are happy their blog was helpful.
It&rsquo;s a pretty small bit of human contact, but I feel like it&rsquo;s just a small positive interaction that brightens the internet wasteland.
Now for my maybe more controversial take.</p>
<h2 id="why-i-dont-think-llms-are-a-good-search-replacement">Why I don&rsquo;t think LLMs are a good search replacement</h2>
<p>I&rsquo;ve refined a simple philosophy around LLMs after using them pretty much full time and trying to go down the Agentic Engineering™️ rabbit hole<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.
In my view, use of LLMs is a direct trade between current velocity and long term growth, with continual reliance dropping you down to the mean without you even realizing it.
This trade is obviously not straightforward.
I use LLMs and agentic tools daily in my job because keeping up velocity is important.
Gone are the days when you can spend 1 week searching online/reading your code for the 100th time to try and find the issue (for better or worse).
But I try to pull out the moments where the task offers growth potential and I have the time budget to spend.</p>
<p>In general, I think the safest use of LLMs is when you already know exactly what you want and you just need the clanker to implement or find the small tidbit of missing info.
In the context of learning Zig, I&rsquo;m not satisfied using LLMs because I don&rsquo;t know what I want.
I may know that I need to parse a specific JSON payload, but I don&rsquo;t know what the right way to implement that is.
With that in mind, I hesitate to just ask ChatGPT/Codex &ldquo;How do I parse this specific JSON to get this result&rdquo; for the following reasons:</p>
<ul>
<li>LLMs are designed to convince you. Many studies<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> exist that show an LLM can basically convince anyone of anything.</li>
<li>If you don&rsquo;t have a strong opinion coming into LLM usage, you likely will just accept the LLM solution. Even if you have issues and try to refine the solution, you are still locked into the solution space provided by the LLM/your knowledge.</li>
<li>That combined solution space is not necessarily the correct solution space.</li>
</ul>
<p>That&rsquo;s why I think doing real search and finding real sources has a better chance of giving you an optimal solution, since you are exploring a potentially larger solution space.
You also avoid the whole issue of getting your understanding psyoped by the sycophancy machine.
This only works though if the search provider is focused on providing good search instead of providing good ads or forcing LLM interactions<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.
Thank goodness for Kagi.</p>
<h2 id="this-only-matters-if-you-care">This only matters if you care</h2>
<p>There are plenty of situations where I have to do something that I really don&rsquo;t care about.
Maybe I need to write a one-off script quickly, create a custom file parser for an atrocious file format, or just need some answer even if it isn&rsquo;t the best answer.
In those situations I use LLMs without hesitation.
But I&rsquo;m always honest with myself that using LLMs is sacrificing growth for convenience.
And the particularly insidious part of this, is that you don&rsquo;t know what you are giving up.
While researching solutions for one specific problem, you may accidentally come across a transformative idea or a technical concept that may help with another problem.</p>
<div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">LLMs give you exactly what you ask for, and maybe that isn&rsquo;t always the best thing&hellip;</div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://www.openmymind.net/Reading-A-Json-Config-In-Zig/">https://www.openmymind.net/Reading-A-Json-Config-In-Zig/</a> and <a href="https://www.openmymind.net/Zigs-std-json-Parsed/">https://www.openmymind.net/Zigs-std-json-Parsed/</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Here&rsquo;s a blog post describing my descent and recovery from an AI doomer spiral: <a href="https://www.alexselimov.com/posts/let_no_crisis_go_to_waste/">https://www.alexselimov.com/posts/let_no_crisis_go_to_waste/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Theoretical proof: <a href="https://arxiv.org/abs/2602.19141">https://arxiv.org/abs/2602.19141</a> and real world example: <a href="https://www.science.org/doi/10.1126/sciadv.adw5578">https://www.science.org/doi/10.1126/sciadv.adw5578</a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://blog.google/products-and-platforms/products/search/search-io-2026/#powerful-ai">Google is defaulting to AI mode for search</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Handling the great code forge fragmentation</title><link>https://www.alexselimov.com/posts/forge_fragmentation/</link><pubDate>Fri, 15 May 2026 20:29:05 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/forge_fragmentation/</guid><description>&lt;figure>&lt;img src="https://www.alexselimov.com/posts/forge_fragmentation/cover.webp"
 alt="Picture of shower tiles that look like 10x developer git history">&lt;figcaption>
 &lt;p>The kind of developer I hope to be someday&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>It seems like there are a lot of people either leaving or talking about leaving Github, a very prominent one being &lt;a href="https://mitchellh.com/writing/ghostty-leaving-github">Mitchell Hashimoto&lt;/a>.
Fragmentation seems inevitable, as people/companies start to distribute among the various options (Codeberg, self-host Forgejo, Gitlab, etc&amp;hellip;).
I think the decision Hashimoto makes with ghostty will potentially set the tone for how the death of Github will happen.
I have some scattered thoughts about the situation:&lt;/p></description><content:encoded><![CDATA[<figure><img src="/posts/forge_fragmentation/cover.webp"
    alt="Picture of shower tiles that look like 10x developer git history"><figcaption>
      <p>The kind of developer I hope to be someday</p>
    </figcaption>
</figure>

<p>It seems like there are a lot of people either leaving or talking about leaving Github, a very prominent one being <a href="https://mitchellh.com/writing/ghostty-leaving-github">Mitchell Hashimoto</a>.
Fragmentation seems inevitable, as people/companies start to distribute among the various options (Codeberg, self-host Forgejo, Gitlab, etc&hellip;).
I think the decision Hashimoto makes with ghostty will potentially set the tone for how the death of Github will happen.
I have some scattered thoughts about the situation:</p>
<ul>
<li><a href="/posts/forge_fragmentation/#tracking-activity-across-providers">Tracking activity across providers</a></li>
<li><a href="/posts/forge_fragmentation/#some-kind-of-trust-system-is-needed-to-stop-ai-slop">Some kind of trust system is needed to stop AI slop</a></li>
<li><a href="/posts/forge_fragmentation/#get-your-username-locked-in-now">Get your username locked in NOW</a></li>
<li><a href="/posts/forge_fragmentation/#is-self-hosting-the-right-tool-to-stop-ai-slop?">Is self-hosting the right tool to stop AI slop?</a></li>
<li><a href="/posts/forge_fragmentation/#mirroring-self-hosted-repos-to-github-for-engagement">Mirroring self-hosted repos to Github for engagement</a></li>
<li><a href="/posts/forge_fragmentation/#conclusion">Conclusion</a></li>
</ul>
<h2 id="tracking-activity-across-providers">Tracking activity across providers</h2>
<p>I hope to someday be a 10x bathroom tile developer with a git contribution heatmap being a solid color.
I have already had an issue with tracking my progress working on repositories split between my self-hosted Forgejo instance and Github.
I&rsquo;m a simple man that wants to see my contributions measured on a public heatmap for both satisfaction and motivation.
So I solved this problem for myself with a go script and hugo module that you can use to create a git heatmap combining data from multiple hosting platforms.
Just takes one go command to generate the activity file, some hugo config changes, and a simple shortcode embedded in your hugo markdown.</p>
<p><a href="https://github.com/aselimov/-hugo-unified-git-activity">[Github repo available here]</a></p>





<style>
:root {
  --color-empty: #2a2a2a;
  
  --color-l1: #7a5010;
  --color-l2: #C47E1A;
  --color-l3: #EF9F27;
  --color-l4: #F7C46A;
  
}
@media (prefers-color-scheme: light) {
  :root {
    --color-empty: #e8e4dc;
    --color-l1: #F7C46A;
    --color-l2: #EF9F27;
    --color-l3: #C47E1A;
    --color-l4: #7a5010;
  }
}
#heatmap { overflow-x: auto; }
#heatmap text { font-family: inherit; fill: currentColor; }
#heatmap-caption {font-size: 0.8em; text-align: center; margin-top: 0px;}
#heatmap-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.75em;
  margin-top: 4px;
}
#heatmap-legend { display: flex; align-items: center; gap: 4px; }
#tooltip {
  position: fixed;
  background: #333;
  color: white;
  padding: 5px 10px;
  border-radius: 4px;
  font-size: 12px;
  pointer-events: none;
}
.hidden { display: none; }
</style>

<div id="heatmap"></div>
<script type="module">
    import {flattenData, constructWeeks, render, setupTooltips, totalCount, renderLegend} from "\/js\/build_heatmap.js"

    const data = await fetch("/activity.json").then((r) => r.json());
    const counts = flattenData(data);
    const weeks = constructWeeks();
    const svg = render(weeks, counts);
    document.getElementById("heatmap").appendChild(svg);
    setupTooltips(svg);

    document.getElementById("contribution-count").textContent =
      `${totalCount(counts)} contributions in the last year`;

    const legendEl = document.getElementById("heatmap-legend");
    legendEl.appendChild(document.createTextNode("Less"));
    legendEl.appendChild(renderLegend());
    legendEl.appendChild(document.createTextNode("More"));
</script>

<div id="heatmap-footer">
  <span id="contribution-count"></span>
  <span id="heatmap-legend"></span>
</div>


<p id="heatmap-caption"> This is my unified git heatmap from my <a href='https://forge.alexselimov.com/aselimov'>Forgejo</a> and <a href='https://github.com/aselimov'>Github</a> </p>

<div id="tooltip" class="hidden"></div>



<p>I also have some random thoughts I wanted to write out about the whole situation.</p>
<h2 id="some-kind-of-trust-system-is-needed-to-stop-ai-slop">Some kind of trust system is needed to stop AI slop</h2>
<p>I think the years of allowing contributions from anyone with an account is over for open source.
Maintainers are drowning in AI generated PRs/issues from unvetted sources.
Even though AI contribution quality is reported to be improving<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, the core volume issue isn&rsquo;t.
The current system is requiring maintainers to wade through PRs/issues that potentially took 0 human effort/time to produce.
Even if some of them are useful/correct, the sheer volume makes the entire system intractable.
You guys already probably know this.</p>
<p>Hashimoto has a solution to this called <a href="https://github.com/mitchellh/vouch">vouch</a> that is currently being developed.
It tracks approved/blocked contributors on a repo basis using a Github actions workflow by appending usernames to a <code>VOUCHED.td</code> file.
The syntax of the file is:</p>





<pre tabindex="0"><code># Vouched contributors for this project.
#
# See https://github.com/mitchellh/vouch for details.
#
# Syntax:
#   - One handle per line (without @), sorted alphabetically.
#   - Optional platform prefix: platform:username (e.g., github:user).
#   - Denounce with minus prefix: -username or -platform:username.
#   - Optional details after a space following the handle.
aselimov
github:aselimov</code></pre><p>This is a step in the right direction, but I still think a trust system needs to be built into the forge platform.
Ideally you would also be able enable vouch chaining somehow.
Effectively</p>





<pre tabindex="0"><code>aselimov VOUCHED by user1 on repo1
user1 VOUCHED by user2 on repo2
aselimov indirectly VOUCHED for repo2</code></pre><p>I think we need a web with some barrier of entry to ensure contributors are high quality and motivated instead of bots that will write hit pieces<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<h2 id="get-your-username-locked-in-now">Get your username locked in NOW</h2>
<p>If we are transitioning to a vouching based trust model you are going to want to lock in a consistent username across the main platforms.
That way, if a cross-platform trust chain is established, you will have fewer issues from username squatters impersonating you.
Seems like the main Github alternatives are:</p>
<ul>
<li>Codeberg</li>
<li>Gitlab</li>
<li>Bitbucket</li>
</ul>
<p>Personally I think Codeberg/self-hosted Forgejo is the best option, but you probably should make an account on each just in-case.</p>
<h2 id="is-self-hosting-the-right-tool-to-stop-ai-slop">Is self-hosting the right tool to stop AI slop?</h2>
<p>Self-hosting Forgejo is the maximally guarded vouching system.
In most cases<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, the host disables account creation to not get inundated with spam/malware.
To get account access, you have to reach out to either the host or a known admin to get registered.
Probably this means sending an email, LinkedIn message, DM on x, etc&hellip;
I&rsquo;m not completely opposed to this concept if I ever spin up a project successful enough to be targeted by the slopocalypse.</p>
<h2 id="mirroring-self-hosted-repos-to-github-for-engagement">Mirroring self-hosted repos to Github for engagement</h2>
<p>My current workflow does involve mirroring all of my repos to Github to enable some level of community engagement.
The main motivating factor is to enable some sort of issues tracker, but receiving PRs is a nice bonus.
Migrating the PR from Github to Forge requires manual effort on my part which acts as a hardening step.
It ensures that I need to approve the PR before it gets anywhere close to my CI.
This could be a layer of protection if my brain stops working, and I start introducing vulnerable actions<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> by mistake.</p>
<h2 id="conclusion">Conclusion</h2>
<ul>
<li>Add a <a href="https://github.com/aselimov/-hugo-unified-git-activity">unified git activity map</a> to your hugo site!</li>
<li>Establish your username/identity on all of the major forges.</li>
<li>I have no idea where things are going from here or if Github can recover.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Curl maintainer talking about how the AI slop storm has actually turned high quality <a href="https://daniel.haxx.se/blog/2026/04/22/high-quality-chaos/">https://daniel.haxx.se/blog/2026/04/22/high-quality-chaos/</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>A maintainer of matplotlib closed a PR because it was a good first issue for a human and the PR was opened by an openclaw bot. The bot then wrote a blog post naming the maintainer as an anti-ai gatekeeper <a href="https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html">https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I&rsquo;ve done this on my instance and I think it&rsquo;s the Forgejo default setting.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Using <code>pull_request_target</code> can allow someone opening a PR to execute code in the runner context.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Staring at walls to improve focus and productivity</title><link>https://www.alexselimov.com/posts/men_who_stare_at_walls/</link><pubDate>Mon, 27 Apr 2026 05:27:30 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/men_who_stare_at_walls/</guid><description>&lt;p>&lt;img src="https://www.alexselimov.com/posts/men_who_stare_at_walls/cover.webp" alt="Edited image from Men Who Stare At Goats with George Clooney staring at wall instead of a goat">&lt;/p>
&lt;p>I came across &lt;a href="https://www.youtube.com/watch?v=NZD5IFpyDcE&amp;amp;pp=ygUgc3RhcmluZyBhdCB3YWxsIGZvciBwcm9kdWN0aXZpdHk%3D">a video by Simple Lucas&lt;/a> describing a routine to improve focus and productivity.
The routine was basically:&lt;/p>
&lt;ol>
&lt;li>Don&amp;rsquo;t use any screens/entertainment when trying to focus on work.&lt;/li>
&lt;li>When you start to feel mentally drained, sit and stare at a wall for x minutes to recover focus.&lt;/li>
&lt;/ol>
&lt;p>I&amp;rsquo;ve been trying it, and it&amp;rsquo;s a very effective (but hard) routine.&lt;/p></description><content:encoded><![CDATA[<p><img src="/posts/men_who_stare_at_walls/cover.webp" alt="Edited image from Men Who Stare At Goats with George Clooney staring at wall instead of a goat"></p>
<p>I came across <a href="https://www.youtube.com/watch?v=NZD5IFpyDcE&amp;pp=ygUgc3RhcmluZyBhdCB3YWxsIGZvciBwcm9kdWN0aXZpdHk%3D">a video by Simple Lucas</a> describing a routine to improve focus and productivity.
The routine was basically:</p>
<ol>
<li>Don&rsquo;t use any screens/entertainment when trying to focus on work.</li>
<li>When you start to feel mentally drained, sit and stare at a wall for x minutes to recover focus.</li>
</ol>
<p>I&rsquo;ve been trying it, and it&rsquo;s a very effective (but hard) routine.</p>
<h2 id="the-problem">The problem</h2>
<p>The core problem is that most people by default are in an information overload.
A paper published in 2012 showed that in 2008 the average person was receiving 34 GB of information daily, with a daily information exposure growth rate of about 5.4% per year <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.
Extrapolating that trend, we would be at about 87 GB worth of data today.
This calculation includes audio, visual, and text data and incorporates quality into the measurement, i.e. 10 minutes of HD video has more information than 10 minutes of 480p video.
It&rsquo;s unclear to me exactly how the quality impacts things, but regardless it is obvious that we are all being drowned in a sea of information.</p>
<p>I certainly go through periods of &ldquo;brain fog&rdquo; and lack of focus/motivation.
These periods usually go something like:</p>
<ol>
<li>Get a bad night of sleep (up late for an event, kids keep waking me up).</li>
<li>Wake up very tired so consume large amounts of caffeine.</li>
<li>Have trouble focusing after 2/3 cups so use media while working to dull the pain (music/podcasts) or take more &ldquo;breaks&rdquo; (reading hackernews).</li>
<li>Stay up late because I&rsquo;m wired on caffeine and dopamine from scrolling.</li>
<li>Go back to 2.</li>
</ol>
<p>I find these cycles very hard to break out of when I&rsquo;m in them.
The media consumption constitutes a small dopamine hit.
Large numbers of small hits puts you in a hole, where you need even more/stronger hits to feel good.</p>
<h2 id="disconnecting">Disconnecting</h2>
<p>The obvious solution is to disconnect from scrolling, but that doesn&rsquo;t overcome the biggest issue.
When I&rsquo;m in this &ldquo;brain fog&rdquo; cycle (and sometimes outside of it), I will find that around 1/2 pm I hit a wall.
My head will start hurting, my motivation will be trash, and my productivity significantly degrades.
My first instinct is to go for more coffee.
That usually lets me keep working, but at a slow/painful pace.
While looking for focusing strategies I came across the life-changing solution&hellip;</p>
<h2 id="stare-at-a-wall">Stare at a Wall!</h2>
<p>After watching Simple Lucas&rsquo; experience, I decided to try it when I hit my focus wall.</p>
<p>It worked.</p>
<p>In my attempts, I combined wall staring with a few other concepts I had heard about.
First was activating the parasympathetic nervous system by staring at the wall &ldquo;out-of-focus&rdquo; and using peripheral vision.
Second was incorporating mind blanking which means trying to think of nothing.
I tried intervals of 5-10 minutes and when I was done, my focus was back!</p>
<p>What I didn&rsquo;t expect was how difficult it would be.
Sitting for 5-10 minutes staring at a wall without thinking of anything is hard!
I relate it somewhat to the feeling I have with working out.
Often times I want to avoid it because it&rsquo;s hard, but I&rsquo;m always happy when I push through and complete it.
It was the exact same experience with the wall staring.</p>
<p>So far I&rsquo;ve been feeling significant focus/productivity improvements.
I&rsquo;ve also been using some other strategies to improve focus, which I&rsquo;ll be talking about in a future post.
I plan to continue this routine and will update to see how much it has impacted productivity/focus.
Thanks for reading!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://ijoc.org/index.php/ijoc/article/view/1566">https://ijoc.org/index.php/ijoc/article/view/1566</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>From AI doomer to handwriting code again</title><link>https://www.alexselimov.com/posts/let_no_crisis_go_to_waste/</link><pubDate>Sun, 29 Mar 2026 10:53:45 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/let_no_crisis_go_to_waste/</guid><description>&lt;blockquote>
&lt;p>Let no good crisis go to waste&lt;br>
-- Winston Churchill &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>&lt;/blockquote>
&lt;p>I&amp;rsquo;ve been thinking about the above quote lately.
Normally this is applied in political contexts, but I think it does a good job describing the last couple of months for me.
For example, today I’ve been sick as a dog (probably with that new covid variant).
Normally I would be trying to speed things along by rotting my brain on YouTube or other pointless entertainment.
While there was some of that, I was really surprised to find myself wanting to write some code for a project I’m working on! And this wasn’t Agentic Engineering™.
I was enjoying writing good old-fashioned, organic, artisanal, free-range, handwritten code.
I knew I had to summarize (at least for myself) how exactly I got here.&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>Let no good crisis go to waste<br>
-- Winston Churchill <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p></blockquote>
<p>I&rsquo;ve been thinking about the above quote lately.
Normally this is applied in political contexts, but I think it does a good job describing the last couple of months for me.
For example, today I’ve been sick as a dog (probably with that new covid variant).
Normally I would be trying to speed things along by rotting my brain on YouTube or other pointless entertainment.
While there was some of that, I was really surprised to find myself wanting to write some code for a project I’m working on! And this wasn’t Agentic Engineering™.
I was enjoying writing good old-fashioned, organic, artisanal, free-range, handwritten code.
I knew I had to summarize (at least for myself) how exactly I got here.</p>
<h2 id="the-crisis"><strong>The “crisis”</strong></h2>
<p>Around last September I started working pretty hard in my free-time on a startup idea (state of idea still tbd).
Even though I’m anti-social media, I decided to swallow the poison pill and get on LinkedIn to try and build some early traction/validation.
When I got on, I started getting drowned by</p>
<ul>
<li>“AI has made programmers obsolete.”</li>
<li>“Agentic engineering is the future”</li>
<li>“If you aren’t orchestrating agent swarms you are falling behind.”</li>
</ul>
<p>That started to raise some hairs and my anxiety.
Now at the time I was using Claude Code daily at work and for my personal project.
I noticed that Claude Code was decent at my work tasks but not very good at my more innovative personal tasks.
Then my feed started hitting me with news about the “inflection point” with Opus 4.6, full agent dev teams, mandated agentic engineering in big tech.
The news about Gas Town and Ralph Loops made me feel like I was falling behind.</p>
<p>Personally I saw big workflow and productivity improvements with AI tools.
This was particularly around search and boilerplate generation.
Biggest use-case was copying patterns (although I always had to double-check it was actually implemented correctly).
When I tried doing more complex changes, I saw the LLMs struggle.
None of this suggested that full agent dev teams were actually feasible long-term.
So I thought this was a skill issue.</p>
<p>Now I have two kids and my wife raises them full-time.
This means it’s on my shoulders to make sure we can eat and that we have a roof over our heads.
I really had to figure out some way of getting through the AI apocalypse intact.
I was mainly experimenting with different projects, different types of AI vibe coding (spec-driven, human in the loop, human-less Ralph loops).
I’ve seen <a href="https://www.businessinsider.com/sober-startup-founders-younger-drinking-less-alcohol-2025-8?">articles suggesting it wasn’t just me.</a></p>
<h2 id="the-realization-that-i"><strong>The realization that I&rsquo;m spiraling</strong></h2>
<p>After several months of grinding with steadily growing anxiety, I came across Mitchell Hashimoto’s workflow.
I wrote another post about it <a href="https://www.alexselimov.com/posts/ai_confession/">here</a>.
This was the first time I was exposed to a serious guy who wasn’t on the AI will replace us hype train.
After this, I started paying attention to a lot more news that was also anti-hype:</p>
<ul>
<li><a href="https://m.youtube.com/@atmoio">Mo Bitar</a>, guy that talks a ton about AI code quality and, more importantly, the impact of AI on our own brains.</li>
<li><a href="https://entropicthoughts.com/no-swe-bench-improvement">Commentary on Metr article</a> suggesting code quality from LLMs isn’t actually getting better.</li>
<li><a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">Metr article</a> suggesting AI doesn’t actually improve productivity.</li>
<li><a href="https://lucumr.pocoo.org/2026/1/18/agent-psychosis/">Armin Ronacher post</a> about comprehension debt and AI psychosis among vibe coders.</li>
</ul>
<p>Those resources, among others, talked me down from the doomer cliff I was on.
I’m a lot more pragmatic now.
Current AI can’t replace a good dev (it’s not a skill issue).
There is no guarantee one way or another that future AI will be able to replace a good dev (I lean towards it won’t be able to).
Regardless, the only thing I can do is continue to keep my coding skills sharp and keep using/exploring Claude code/codex, but without the anxiety.
I don&rsquo;t think it&rsquo;s worth learning the modern advanced agent orchestration techniques since best practices around LLM techniques are constantly changing.
In the last 6 months since I started paying attention, I&rsquo;ve seen a lot of noise with different approaches.
Two major changes I can recall off the top of my head are:</p>
<ol>
<li>Claude.md is important, you can have claude generate it<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> → agent generated Claude.md worsens results. Only good approach is minimal human generated<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></li>
<li>MCP is the best standard for calling external tools → clis are the best standard for calling external tools<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</li>
</ol>
<p>There is no guarantee that the prompting/orchestration skills relevant now will be relevant to a future LLM that can fully autonomously generate robust, secure, and production ready code.
Those skills are also not relevant if LLMs continue to have the same issues they have today.
Either way it&rsquo;s still useful to continue writing code manually.
If LLMs don&rsquo;t get much better than demand for a dev that can actually write robust, secure, and production grade code will be high.
If they do get better, then at least I will have refined my taste.
I can always learn the advanced prompting/orchestrating skill-set later.</p>
<h2 id="the-change"><strong>The change</strong></h2>
<p>Was this roller-coaster of anxiety pointless?
I think the answer goes back to the quote of never letting a good crisis go to waste.
I used the stress and anxiety induced by all of this to develop a habit of daily project work and generated a backlog of projects to explore.
To try and find alternative approaches to surviving the AI apocalypse I decided to try publishing more writings (which I&rsquo;ve been enjoying greatly).
These have replaced the ways I used to waste my time, which I think is a huge net positive.
The biggest change is just genuinely enjoying programming again.
I&rsquo;m no longer spending my cognitive capacity on the soft LLM prompting skills<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>.
Instead, I&rsquo;m working on things I enjoy more like exploring new languages, developing my taste for code architecture, and solving hard technical problems myself.</p>
<p>If you are worried about AI and the links I included above haven&rsquo;t convinced you otherwise, that&rsquo;s okay!
Just don&rsquo;t let a good crisis go to waste.
Use the motivating power of stress and anxiety to drive you instead of letting it stop you.
No matter how things play out, you will be better off!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>This is attributed to Winston Churchill although supposedly this attribution is in question. The source doesn&rsquo;t really matter to me though.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>The /init command generates an overview of the project structure and notes. This is still recommended by Anthropic in their <a href="https://code.claude.com/docs/en/best-practices">best practices</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>From <a href="https://arxiv.org/abs/2602.11988">Evaluating AGENTS.md: Are Repository-Level Context Files Helpful for Coding Agents?</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://blog.cloudflare.com/code-mode/">Cloudflare suggested</a> that having LLMs generate code was a better approach to traditional MCP.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>I became an engineer for the hard technical skills, not to be a manager!&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Upvoters - Small rust back-end for anonymous likes on static blogs</title><link>https://www.alexselimov.com/posts/upvoters/</link><pubDate>Sat, 21 Mar 2026 22:47:50 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/upvoters/</guid><description>&lt;h2 id="long-story-short">Long Story Short&lt;/h2>
&lt;p>I wrote a little system called &lt;a href="https://github.com/aselimov/upvoters">upvoters&lt;/a> in Rust to handle anonymous upvotes, and it&amp;rsquo;s compatible with Hugo!
In fact, you should see a little chevron at the bottom of this post to upvote if you like it.
Check it out if you need something like it!&lt;/p>
&lt;h2 id="motivation">Motivation&lt;/h2>
&lt;p>I&amp;rsquo;ve been working on some website refactors/design changes lately.
My taste has been influenced recently.
I may at some point write something about my taste evolution.
The tl;dr for that article is that I came across an article on &lt;a href="https://lucumr.pocoo.org/about/">Armin Ronacher&amp;rsquo;s blog&lt;/a> and was hugely affected.
I&amp;rsquo;ve been trying to use my little piece of internet land to serve an aesthetic, technical, and minimal blog and his site is what I wish mine was.&lt;/p></description><content:encoded><![CDATA[<h2 id="long-story-short">Long Story Short</h2>
<p>I wrote a little system called <a href="https://github.com/aselimov/upvoters">upvoters</a> in Rust to handle anonymous upvotes, and it&rsquo;s compatible with Hugo!
In fact, you should see a little chevron at the bottom of this post to upvote if you like it.
Check it out if you need something like it!</p>
<h2 id="motivation">Motivation</h2>
<p>I&rsquo;ve been working on some website refactors/design changes lately.
My taste has been influenced recently.
I may at some point write something about my taste evolution.
The tl;dr for that article is that I came across an article on <a href="https://lucumr.pocoo.org/about/">Armin Ronacher&rsquo;s blog</a> and was hugely affected.
I&rsquo;ve been trying to use my little piece of internet land to serve an aesthetic, technical, and minimal blog and his site is what I wish mine was.</p>
<p>While I don&rsquo;t have all of Armin&rsquo;s experience or skills, I thought I could at least try to give off a similar vibe with my own site.
I use Hugo to generate my static blog, so my first try was searching through existing Hugo themes to get a starting point.
The rest of the story I think works better as an enumeration:</p>
<ol>
<li>Came across the <a href="https://github.com/clente/hugo-bearcub">hugo-bearcub theme</a> by clente.</li>
<li>Looked up <a href="https://bearblog.dev/">Bear Blog</a>.</li>
<li>Looked up the creator of Bear Blog, <a href="https://herman.bearblog.dev/">Herman Martinus</a>.</li>
<li>Read through some of his posts and noticed his little anonymous upvote button.</li>
<li>Thought the anonymous upvote button was super cool and wanted my own.</li>
</ol>
<h2 id="upvoters">Upvoters</h2>
<p>I then spent a couple hours putting together <code>upvoters</code>, a little Rust web server to handle this functionality.
I picked postgres for the db because I run this site (and a few other services like email, matrix, <a href="https://forge.alexselimov.com">forgejo</a>, etc&hellip;) using a VPS that already had a postgres setup.
Probably could&rsquo;ve just done SQLite to make it easier on everyone but didn&rsquo;t think about that until later.</p>
<p>This service just tracks votes in a single table with the following important variables in the schema:</p>
<ol>
<li><code>slug</code>: A unique identifier for each post that is just created from the URL.</li>
<li><code>voter_id</code>: A unique identifier for each voter.</li>
</ol>
<p>Since this is just a personal blog, and exact upvote count doesn&rsquo;t matter, the <code>voter_id</code> is a UUID assigned to each user as a cookie upon the first vote.
Obviously all it takes to &ldquo;break&rdquo; the system is clearing your cookies.
This would allow you to upvote the same post multiple times but the only risk there is me getting delusions of grandeur.</p>
<h2 id="getting-started-with-it">Getting started with it</h2>
<p>I wrote some instructions in the <a href="https://github.com/aselimov/upvoters">upvoters</a> readme, but also feel free to email me if you need help setting it up!</p>
]]></content:encoded></item><item><title>Role of AI in my writing</title><link>https://www.alexselimov.com/posts/ai_confession/</link><pubDate>Fri, 13 Mar 2026 12:11:23 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/ai_confession/</guid><description>&lt;p>I have a confession to make to anyone who has stumbled across this blog. Some of the posts I&amp;rsquo;ve previously written had strong AI generated segments. I&amp;rsquo;ve since added a note at the start to mention this. The post ideas were always mine, and I always edited the outputs. However, there were still occasions where AI generated segments made it into my final draft unedited. I&amp;rsquo;m currently rethinking the role of AI in my workflow.&lt;/p></description><content:encoded><![CDATA[<p>I have a confession to make to anyone who has stumbled across this blog. Some of the posts I&rsquo;ve previously written had strong AI generated segments. I&rsquo;ve since added a note at the start to mention this. The post ideas were always mine, and I always edited the outputs. However, there were still occasions where AI generated segments made it into my final draft unedited. I&rsquo;m currently rethinking the role of AI in my workflow.</p>
<h3 id="i-fell-for-the-sirens-song-of-low-effort-output">I fell for the siren&rsquo;s song of low effort output</h3>
<p>I&rsquo;ve been wanting to output more content. Main reason is that a lot of people I respect have blogs that span years. I also wanted to share some perspectives I&rsquo;ve had and issues I&rsquo;ve resolved in case anyone was ever looking/to keep them as a log. <a href="https://www.alexselimov.com/posts/cuda_on_void/">The blog post about CUDA on void linux</a> has been particularly helpful as I&rsquo;ve set up multiple void linux machines that all had the same issues.</p>
<p>The issue for me was that creating content takes away from other things I could&rsquo;ve been working on. I thought that this was the point of AI acceleration so I leveraged ChatGPT to help automate the generation of some posts. In most cases I went in and manually edited for style and formatting, but there are many examples of ChatGPT generated sentences that made it to my blog. This helped me to get useful (at least to me) posts out, but in hindsight I don&rsquo;t think the trade-offs were worth it. What I gained in posting velocity I lost in:</p>
<ul>
<li><strong>Posts are not authentic.</strong> While I always picked the post topics (No &ldquo;what should I post&rdquo; prompts), it&rsquo;s hard to separate what thoughts are genuinely mine versus what is just background noise added by the LLM. The best example of what I mean comes from image generation models. The tree in a human created painting was placed for a reason and has some kind of meaning. The tree in an image generation model created painting was placed there just because and has no meaning. I kind of feel the same way about LLM generated text.</li>
<li><strong>I miss on developing my writing skills.</strong> I personally think this is the most important reason to not rely on LLMs for writing. I&rsquo;ve written a lot of academic/technical documents (<a href="https://alexselimov.com/cv">see publications</a>) but that kind of writing is fake/performative. I&rsquo;ve been trying to embrace Paul Graham&rsquo;s <a href="https://paulgraham.com/talk.html">write like you talk</a>. Outsourcing to LLMs as a first step means adopting the interpolated average writing style instead of finding my own unique voice and style.</li>
</ul>
<h3 id="seeing-the-light-and-fighting-the-slop">Seeing the light and fighting the slop</h3>
<p>What helped me see the light was Mitchell Hashimoto&rsquo;s writings. In particular his article on <a href="https://mitchellh.com/writing/non-trivial-vibing">vibing a ghostty feature</a>. In it, I found a workflow that made more sense to me. I think I&rsquo;ve been on the internet too much and was trying to convince myself Gas Town and endless Ralph Loops were actually the future. I haven&rsquo;t convinced myself yet, and I think I will stop trying to. Instead, I&rsquo;m going to be more intentional about doing things manually for both the love of it and the skill-set growth potential.</p>
<p>This does not mean I will go back to the &ldquo;halcyon&rdquo; pre-AI workflows. LLMs have been transformative for me. I just plan to use them as tools where they belong and not buy the developer &ndash;&gt; agent manager transition that is being sold. The exact role of agents in my work is still something that is evolving.</p>
<h3 id="commitment-to-ensure-all-writings-on-this-blog-are-fully-human-generated">Commitment to ensure all writings on this blog are fully human generated</h3>
<p>Moving forward anything I write on this blog will be fully human generated, with <em>some</em> assistance from LLMs. For writing that means using it as an editor to help with tone, structure, and grammatical errors. In general, I also use it as a sounding board to help me develop ideas. Claude-Code and Codex still have a big role to play in automating certain tasks (tedious edits, research on specific topics, even code changes once I know exactly what I want) but I no longer think they should have a primary role in something as personal as publishing my own thoughts.</p>
<p>Will close with the quote that really hit me from Mitchell Hashimoto:</p>
<blockquote>
<p>I believe good AI drivers are experts in their domains and utilize AI as an assistant, not a replacement.</p></blockquote>
]]></content:encoded></item><item><title>About</title><link>https://www.alexselimov.com/about/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/about/</guid><description>&lt;center>
 &lt;img src="https://www.alexselimov.com/profile.webp"
 
 style=" max-width:250px" 
 >
&lt;/center>

&lt;h2 id="quick-facts">Quick Facts&lt;/h2>
&lt;ul>
&lt;li>Father of two and husband of one&lt;/li>
&lt;li>&lt;strong>Scientific and Backend&lt;/strong> Software Developer&lt;/li>
&lt;li>Computational Materials Science PhD from Georgia Tech&lt;/li>
&lt;li>&lt;strong>Favorite programming language is Rust 🦀&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="technical-knowledge">Technical knowledge&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Programming Languages:&lt;/strong> Rust, Fortran, Python, C++, Java, Typescript&lt;/li>
&lt;li>&lt;strong>Parallel Programming:&lt;/strong> MPI, OpenMP, Rayon, etc&amp;hellip;&lt;/li>
&lt;li>&lt;strong>Good at Algorithm design, performance tuning&lt;/strong>&lt;/li>
&lt;li>&lt;strong>AI:&lt;/strong> Did work with Active Learning and traditional models (small data) before ChatGPT.&lt;/li>
&lt;li>&lt;strong>LLMs:&lt;/strong> Messing around with them, use codex mainly, planning a write up on my thoughts.&lt;/li>
&lt;/ul>
&lt;h2 id="curriculum-vitae">Curriculum Vitae&lt;/h2>
&lt;p>&lt;a href="https://www.alexselimov.com/cv/">Click here for my CV&lt;/a>&lt;/p></description><content:encoded><![CDATA[<center>
    <img  src="/profile.webp"
         
         style=" max-width:250px"  
    >
</center>

<h2 id="quick-facts">Quick Facts</h2>
<ul>
<li>Father of two and husband of one</li>
<li><strong>Scientific and Backend</strong> Software Developer</li>
<li>Computational Materials Science PhD from Georgia Tech</li>
<li><strong>Favorite programming language is Rust 🦀</strong></li>
</ul>
<h2 id="technical-knowledge">Technical knowledge</h2>
<ul>
<li><strong>Programming Languages:</strong> Rust, Fortran, Python, C++, Java, Typescript</li>
<li><strong>Parallel Programming:</strong> MPI, OpenMP, Rayon, etc&hellip;</li>
<li><strong>Good at Algorithm design, performance tuning</strong></li>
<li><strong>AI:</strong> Did work with Active Learning and traditional models (small data) before ChatGPT.</li>
<li><strong>LLMs:</strong> Messing around with them, use codex mainly, planning a write up on my thoughts.</li>
</ul>
<h2 id="curriculum-vitae">Curriculum Vitae</h2>
<p><a href="/cv/">Click here for my CV</a></p>
]]></content:encoded></item><item><title>Pillars, Pipelines, and Vaults System by August Bradley</title><link>https://www.alexselimov.com/posts/ppv/</link><pubDate>Tue, 23 Sep 2025 21:22:45 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/ppv/</guid><description>&lt;div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See &lt;a href="https://www.alexselimov.com/posts/ai_confession/">this link&lt;/a> for more details.&lt;/div>

&lt;h2 id="what-motivated-me-to-try-it">What motivated me to try it&lt;/h2>
&lt;p>I somehow recently accidentally stumbled across the Pillars, Pipelines, and Vaults (PPV) system by August Bradley.
In a nutshell, this system is a way to align your daily efforts to the pursuit of goals that contribute to core areas of your life (the pillars).
As a husband and the father of a toddler and an infant, the free time that I previously had in excess has been scarce.
My routines and schedules were extremely disrupted as I transitioned from my life as a PhD student to working a 9-5 and raising a family (my first child was born exactly one week after my dissertation defense).
These routines never truly recovered.
As a result, when I do come across some free time I find that I often don&amp;rsquo;t know what to do with it.
I also am guilty of jumping from project to project without focus, leaving things half finished or skills incompletely developed.&lt;/p></description><content:encoded><![CDATA[<div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See <a href="/posts/ai_confession/">this link</a> for more details.</div>

<h2 id="what-motivated-me-to-try-it">What motivated me to try it</h2>
<p>I somehow recently accidentally stumbled across the Pillars, Pipelines, and Vaults (PPV) system by August Bradley.
In a nutshell, this system is a way to align your daily efforts to the pursuit of goals that contribute to core areas of your life (the pillars).
As a husband and the father of a toddler and an infant, the free time that I previously had in excess has been scarce.
My routines and schedules were extremely disrupted as I transitioned from my life as a PhD student to working a 9-5 and raising a family (my first child was born exactly one week after my dissertation defense).
These routines never truly recovered.
As a result, when I do come across some free time I find that I often don&rsquo;t know what to do with it.
I also am guilty of jumping from project to project without focus, leaving things half finished or skills incompletely developed.</p>
<h2 id="ive-tried-a-few-different-methods-for-improving-focus-and-alignment-but-nothing-ever-really-stuck">I&rsquo;ve tried a few different methods for improving focus and alignment, but nothing ever really stuck.</h2>
<p>I&rsquo;ve been learning about the PPV system and have noticed some positive effects already.
Primarily around self-reflection, ensuring daily tasks are aligned to what is important, and ensuring that my effort towards things important to me is getting tracked.
I&rsquo;m halfway through the <a href="https://www.youtube.com/playlist?list=PLAl0gPKnL3V8s7dPXoo07mYnuErhWVk8b">PPV playlist</a> and have started building out my personal PPV system.
So far I recommend it.
I definitely think that it needs per-user customization as I am not August Bradley, and his priorities won&rsquo;t directly translate to me.
But some of the overarching concepts I find extremely useful:</p>
<ul>
<li>You should define a small set of &ldquo;pillars&rdquo; that hold up your life (e.g. career, family, learning, personal projects, etc&hellip;)</li>
<li>Ensure that your daily actions and goals are aligned to those pillars</li>
<li>The action zone concept is fairly genius and has certainly led to improved focus for me.</li>
</ul>
<h2 id="i-of-course-am-not-actually-implementing-these-systems-in-notion-directly">I, of course, am not actually implementing these systems in Notion directly</h2>
<p>Instead, I found a FOSS alternative called <a href="https://anytype.io/">anytype</a>.
I tried some other FOSS options like AppFlowy and AFFiNE.
AFFiNE struggled from:</p>
<ul>
<li>UI that was cramming in their AI service everywhere, and it couldn&rsquo;t be disabled.</li>
<li>Some concerns about how their telemetry works, <a href="https://github.com/toeverything/AFFiNE/issues/6920">see this github issue</a></li>
</ul>
<p>AppFlowy was pretty clean but I wasn&rsquo;t able to get the self-hosted AppFlowy-Cloud setup.
I&rsquo;ve yet to self-host a node for anytype.
It uses a P2P protocol to synchronize spaces between devices which seems to make the self-hosting more complex.
I plan to upload an additional guide if I find it difficult to set-up.</p>
<h2 id="conclusion">Conclusion</h2>
<p>If you haven&rsquo;t heard about PPV, definitely check it out <a href="https://www.youtube.com/playlist?list=PLAl0gPKnL3V8s7dPXoo07mYnuErhWVk8b">here</a>!
It isn&rsquo;t for everyone, but I&rsquo;ve seen the benefits already in my limited time using it.
I may do a dive into my personal flavor of PPV and how I deviated from the original once it is fully completed.
Hopefully this is helpful to someone!</p>
]]></content:encoded></item><item><title>Say goodbye to st and say hello to ghostty</title><link>https://www.alexselimov.com/posts/st_to_ghostty/</link><pubDate>Wed, 10 Sep 2025 23:16:26 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/st_to_ghostty/</guid><description>&lt;div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See &lt;a href="https://www.alexselimov.com/posts/ai_confession/">this link&lt;/a> for more details.&lt;/div>

&lt;p>I&amp;rsquo;ve been a suckless software user for a long time because the software was superior to a lot of other options out there.
If you have never experienced the blazing fast speed of &lt;code>st&lt;/code> opening, you are definitely missing out.
Sadly it was time for me to leave &lt;code>st&lt;/code> behind and move on to a new terminal that I think offers a lot of benefits.&lt;/p></description><content:encoded><![CDATA[<div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See <a href="/posts/ai_confession/">this link</a> for more details.</div>

<p>I&rsquo;ve been a suckless software user for a long time because the software was superior to a lot of other options out there.
If you have never experienced the blazing fast speed of <code>st</code> opening, you are definitely missing out.
Sadly it was time for me to leave <code>st</code> behind and move on to a new terminal that I think offers a lot of benefits.</p>
<h2 id="why-i-liked-st">Why I Liked st</h2>
<ul>
<li><strong>Speed.</strong> <code>st</code> launches instantly</li>
<li><strong>Config as code is cool.</strong> That combined with the patching culture really provides some fun puzzles. Who knew reading your terminal source code to fix a broken patch could be so fun.</li>
<li><strong>DWM swallow patch compatibility.</strong> If you use the swallow patch, st works flawlessly.</li>
</ul>
<h2 id="why-i-switched-to-ghostty">Why I Switched to ghostty</h2>
<ul>
<li><strong>Time constraints.</strong> Two kids means no time to debug patches and code when I want modern features like ligatures.</li>
<li><strong>Modern niceties.</strong> Ligatures and images in terminal are supported out of the box. I spent way too long trying to unsuccessfully get sixel support in st.</li>
<li><strong>Cross-platform config.</strong> Same configuration file on both Linux and work Mac. Reduces burden of swapping dev environments.</li>
<li><strong>Swallowing compatibility.</strong> Unlike WezTerm and others, ghostty plays nice with DWM&rsquo;s swallow patch. Since WezTerm uses existing terminals to create new terminals, the process tree for the swallow patch gets messed up. This leads to the wrong terminal windows getting swallowed which is very frustrating.</li>
<li><strong>Fast enough.</strong> Noticeably slower to start than st but faster than everything else I&rsquo;ve tried.</li>
</ul>
<p>I definitely think I&rsquo;m losing cool points by swapping from my handcrafted <code>st</code> build, but priorities change and the <code>ghostty</code> guy is pretty cool.
Hopefully this doesn&rsquo;t commence my slide down the slippery slope straight into an Apple Store <em>shudder</em>.</p>





<pre tabindex="0"><code>                ==**=*x=====================ox*=**==xo                                                  
              ox==**=*x                     ox*=**==xo                                                  
            ++**+=                                =+**++                                                
          ====         ~+%$@@@@@@@@@@@@@@$%+~         ====                                              
        ===+       x%@@@@@$$$$$$$$$$$$$$$$@@@@@%x       +===                                            
      ===+      +@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$@@@@+      +===                                          
    ++=+      %@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@%      +=++                                        
  ox==      %@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@%      ==xx                                      
  ==+x    x@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@x    x+==                                      
xx==     %@$$$$@@@@$$$$$$$$$$$$$$$$$$$$@@@@$$$$$$$$$$$$$$@%     ==xo                                    
++++    %@$$$@@+~o=@@@@$$$$$$$$$$$$$$@@+~o*@@@@$$$$$$$$$$$@%    ++++                                    
==+·   x@$$$$$       ~*@@@@$$$$$$$$$$%       o*@@@@$$$$$$$$@x   ·+==                                    
==     @$$$$$$           ~*@@@$$$$$$$%           o%@@@$$$$$$@     ==                                    
==     $$$$$$$@=·            =$$$$$$$@@=             *$$$$$$$     ==                                    
==    ·@$$$$$$$@@@@+          $$$$$$$$$@@@@x          $$$$$$@·    ==                                    
==    ·@$$$$$$@$x            o$$$$$$$@@$x            x$$$$$$@·    ==                                    
==    ·@$$$$$$            x$@@$$$$$$$$            +$@@$$$$$$@·    ==                                    
==    ·@$$$$@$        x%@@@@$$$$$$$$@%        x$@@@@$$$$$$$$@·    ==                                    
==    ·@$$$$$@$~  x%@@@@$$$$$$$$$$$$$@%·  x%@@@@$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$@@@@@@$$$$$$$$$$$$$$$$$$@@@@@@$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@·    ==                                    
==    ~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$~    ==                                    
==     @@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@     ==                                    
==+·    %@@@$$$$$$$$@@@$$$@@@@$$$$$$$$@@@@$$$@@@$$$$$$$$@@@%    ·+==                                    
x+==      +$@@@@@@@$+       o%@@@@@@@@*~       =$@@@@@@@$+      ==xx                                    
  ===+                                                        +===                                      
    ====              ==%%++            ++%%==              ====                                        
      ++**=***++==%***==++***%**++++*=%**=++==***%==++**%=**++                                          
          x+++==++++        x+++++==++xx        ++++++++++                                              </code></pre>]]></content:encoded></item><item><title>Mac style copy/paste on Void Linux</title><link>https://www.alexselimov.com/posts/mac_style_copy_paste/</link><pubDate>Fri, 05 Sep 2025 23:49:40 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/mac_style_copy_paste/</guid><description>&lt;div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See &lt;a href="https://www.alexselimov.com/posts/ai_confession/">this link&lt;/a> for more details.&lt;/div>

&lt;p>Another quick post that may be useful to somebody else.
I&amp;rsquo;ve been working at UKG for about 4 months now.
In my work I use a Mac laptop.
I&amp;rsquo;ve tried my best to unify my configurations between my personal Linux system and the Mac dev machine provided by UKG to reduce headaches when having to switch from professional to personal projects.
This even went as far as trying to configure OpenBox to be more like the MacOS desktop environment (HA a big failed endeavour).
While I ultimately found peace with differences in desktop environments, there was another thing I found very hard to deal with.&lt;/p></description><content:encoded><![CDATA[<div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See <a href="/posts/ai_confession/">this link</a> for more details.</div>

<p>Another quick post that may be useful to somebody else.
I&rsquo;ve been working at UKG for about 4 months now.
In my work I use a Mac laptop.
I&rsquo;ve tried my best to unify my configurations between my personal Linux system and the Mac dev machine provided by UKG to reduce headaches when having to switch from professional to personal projects.
This even went as far as trying to configure OpenBox to be more like the MacOS desktop environment (HA a big failed endeavour).
While I ultimately found peace with differences in desktop environments, there was another thing I found very hard to deal with.</p>
<h2 id="differences-in-keybindings">Differences in Keybindings!!</h2>
<p>I made a lot of changes and compromises when setting up my Mac system and configuring my personal machine.
One notable change was swapping my main modkey for <code>dwm</code> from <code>Meta</code> to <code>Alt</code> to better mimic the Mac setup.
I tried doing the reverse of swapping <code>Option</code> and <code>Cmd</code> in Mac, but that was a really rough time.
I&rsquo;ve also tried to keep many other keybindings, associated with things like moving windows or changing workspaces, consistent.
One thing that was causing endless headaches was copy and paste.
I don&rsquo;t know the exact count of times I&rsquo;ve pressed <code>Alt+C</code> or <code>Alt+V</code> at home in vain, but it is certainly significant.
As a result I spent some time to figure out how to do this.</p>
<h2 id="final-solution">Final Solution</h2>
<p>I configure my <code>dwm</code> specific keybindings in my <code>config.h</code>, but for everything else I use <code>sxhkd</code>.
This allows me to more easily reload keybindings instead of having to cycle <code>dwm</code> and lose all of my window placements.
I highly recommend this kind of setup.
My final solution, added to my <code>sxhkdrc</code> is:</p>





<pre tabindex="0"><code>
alt + c   
     xclip -selection primary -o | xclip -selection clipboard -i
 alt + v    
     sh -c &#39;xclip -selection clipboard -o | xclip -selection primary -i &amp;&amp; xdotool click 2&#39;</code></pre><p>I tried several other ways, most notable being just trying to send <code>Ctrl+C</code> when I pressed <code>Alt+C</code>, but nothing else worked.</p>
<h2 id="how-it-works">How it works</h2>
<p>A quick description of how it works:</p>
<ul>
<li><code>Alt+C</code> takes the primary selection and copies it to the clipboard</li>
<li><code>Alt+V</code> takes the clipboard and copies it to the primary selection and then emulates a middle mouse button click to paste.</li>
</ul>
<p>I was hoping for a more elegant solution but ¯_(ツ)_/¯</p>
]]></content:encoded></item><item><title>NVIDIA graphics card faulting after sleep/wake cycle on Void Linux</title><link>https://www.alexselimov.com/posts/nvidia_cuda_sleep_issue/</link><pubDate>Thu, 04 Sep 2025 19:44:19 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/nvidia_cuda_sleep_issue/</guid><description>&lt;div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See &lt;a href="https://www.alexselimov.com/posts/ai_confession/">this link&lt;/a> for more details.&lt;/div>

&lt;p>I run Void Linux on a Thinkpad T480 with Integrated Intel graphics and a discrete Nvidia MX150. I&amp;rsquo;ve decided to start working with more CUDA development and was running into an issue where my Nvidia GPU would suddenly stop being detected by CUDA applications. The only way I could figure out to get it back online was by rebooting my computer. Eventually I became so frustrated that I decided to dive in and find a solution.&lt;/p></description><content:encoded><![CDATA[<div style="border: 1px solid var(--color-primary); border-radius: 4px; padding: 0.8rem 1.6rem; margin: 1.6rem 0;">First version of this post was generated with LLMs before manual revision. See <a href="/posts/ai_confession/">this link</a> for more details.</div>

<p>I run Void Linux on a Thinkpad T480 with Integrated Intel graphics and a discrete Nvidia MX150. I&rsquo;ve decided to start working with more CUDA development and was running into an issue where my Nvidia GPU would suddenly stop being detected by CUDA applications. The only way I could figure out to get it back online was by rebooting my computer. Eventually I became so frustrated that I decided to dive in and find a solution.</p>
<h2 id="the-problem">The Problem</h2>
<p>Here&rsquo;s what I was experiencing:</p>
<ul>
<li>GPU appeared normal in <code>nvidia-smi</code></li>
<li>All NVIDIA kernel modules were loaded correctly</li>
<li>Device files in <code>/dev/nvidia*</code> existed with proper permissions</li>
<li>But testing CUDA availability using Pytorch, by running the following command would return FAlSE:</li>
</ul>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"> <span class="n">python</span> <span class="o">-</span><span class="n">c</span> <span class="s2">&#34;import torch; print(torch.cuda.is_available())&#34;</span></span></span></code></pre></div><p>The root cause was eventually found in the kernel logs (<code>dmesg</code>):</p>





<pre tabindex="0"><code>NVRM: Xid (PCI:0000:01:00): 31, pid=1596, name=modprobe, Ch 00000003, 
intr 10000000. MMU Fault: ENGINE HOST6 HUBCLIENT_HOST faulted @ 0x1_01010000. 
Fault is of type FAULT_PDE ACCESS_TYPE_READ

NVRM: Xid (PCI:0000:01:00): 154, GPU recovery action changed from 0x0 (None) 
to 0x2 (Node Reboot Required)</code></pre><h2 id="the-root-cause">The Root Cause</h2>
<p>The issue stems from NVIDIA GPU memory management during sleep/resume cycles. When the system suspends:</p>
<ol>
<li>The GPU&rsquo;s memory mappings and contexts can become corrupted</li>
<li>The GPU&rsquo;s Memory Management Unit (MMU) enters a faulted state</li>
<li>While the driver stack appears to reload correctly, the GPU hardware itself is in an inconsistent state</li>
<li>CUDA runtime fails to initialize because it can&rsquo;t establish proper memory contexts</li>
</ol>
<p>This seems to be common on mobile NVIDIA GPUs (like the MX series) in laptops with hybrid graphics setups running Linux.
At least, I&rsquo;ve seen a few postings about this.</p>
<h2 id="the-solution">The Solution</h2>
<p>The fix is to add these parameters to your kernel command line in <code>/etc/default/grub</code>:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">GRUB_CMDLINE_LINUX_DEFAULT</span><span class="o">=</span><span class="s2">&#34;... nvidia-drm.modeset=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1&#34;</span></span></span></code></pre></div><p>Then update GRUB:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo update-grub</span></span></code></pre></div><p>And reboot to apply the changes.</p>
<h3 id="what-these-parameters-do">What These Parameters Do</h3>
<ul>
<li><strong><code>nvidia-drm.modeset=1</code></strong>: Enables kernel mode setting for the NVIDIA driver, providing better integration with the display subsystem and more robust power management</li>
<li><strong><code>nvidia.NVreg_PreserveVideoMemoryAllocations=1</code></strong>: Tells the NVIDIA driver to preserve GPU memory allocations across suspend/resume cycles, preventing the MMU faults</li>
</ul>
<h2 id="why-this-works">Why This Works</h2>
<p>These parameters ensure that:</p>
<ol>
<li>GPU memory contexts are properly preserved during sleep</li>
<li>The kernel&rsquo;s display management system maintains better control over the GPU state</li>
<li>Memory mappings remain consistent across suspend/resume cycles</li>
<li>The GPU&rsquo;s MMU doesn&rsquo;t enter the faulted state that breaks CUDA</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>Haven&rsquo;t had an issue since making this fix! Hopefully someone else can benefit from this as well!</p>
]]></content:encoded></item><item><title>Misc thoughts on AI</title><link>https://www.alexselimov.com/posts/misc_thoughts_ai/</link><pubDate>Fri, 01 Aug 2025 07:45:26 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/misc_thoughts_ai/</guid><description>&lt;h2 id="ai-has-become-a-very-useful-tool-for-me">AI has become a very useful tool for me&lt;/h2>
&lt;p>If you know me personally, you know that I&amp;rsquo;ve been pretty slow on the LLM/GenAI uptake.
At this point, however, if you are a software developer that isn&amp;rsquo;t integrating GenAI tools into your workflow I think you are probably going to be left behind.
I&amp;rsquo;ve been playing around with these tools a lot more lately, and I&amp;rsquo;ve come to a few conclusions.&lt;/p></description><content:encoded><![CDATA[<h2 id="ai-has-become-a-very-useful-tool-for-me">AI has become a very useful tool for me</h2>
<p>If you know me personally, you know that I&rsquo;ve been pretty slow on the LLM/GenAI uptake.
At this point, however, if you are a software developer that isn&rsquo;t integrating GenAI tools into your workflow I think you are probably going to be left behind.
I&rsquo;ve been playing around with these tools a lot more lately, and I&rsquo;ve come to a few conclusions.</p>
<ol>
<li>Models that can be run locally (I&rsquo;ve used a lot of different Ollama models) are mainly just ok. The best results I&rsquo;ve had is with Gemma3:27b on an m4 macbook. Haven&rsquo;t tried qwen3 coder yet.</li>
<li>The amazing metrics you see referenced require 100b+ models that are not going to be feasible to run locally for most people.</li>
<li>Your application matters a lot. I find that these tools are extremely useful for java spring boot microservices but a lot less useful for scientific projects in Rust.</li>
<li>I really enjoy using the expensive LLM tools provided at work and enjoy using the free version of tools less.</li>
<li>Claude has given me the best performance so far.</li>
</ol>
<p>I&rsquo;m still debating which subscription to get for personal projects.
I know Claude is my favorite, but it&rsquo;s also much more expensive.
I also have a newborn right now and not much time for side projects, so I&rsquo;m delaying the decision.</p>
<h2 id="ai-has-not-become-an-irreplaceable-tool">AI has NOT become an irreplaceable tool</h2>
<p>I am not a vibe coder and don&rsquo;t think I will ever give in to the vibes.
Even when I prompt claude code to make changes, I always know exactly what I want done and how I want it done.
Many times I&rsquo;ll make the changes myself because it&rsquo;s faster than trying to prompt Claude.
LLMs have definitely improved my efficiency, but I would be fine if all the GPUs in the world suddenly melted down.
I&rsquo;m not a viber for a couple reasons:</p>
<ol>
<li>I enjoy coding and problem solving.</li>
<li>I&rsquo;m not convinced models are capable enough to be fully trusted.</li>
<li>I want to keep my own skillset because the future of AI is uncertain to me</li>
</ol>
<h2 id="how-does-the-economics-of-ai-work">How does the economics of AI work?</h2>
<p>From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable.
That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free.
I think the significant portion of cost is due to model training.
It seems like model training costs won&rsquo;t be stopping anytime soon as companies race towards general and then &ldquo;super&rdquo; intelligence.
I&rsquo;m not convinced either of those are a given.
As a result, prices will have to increase or ads will be introduced to recuperate investor money.
I&rsquo;m also not sure how this applies to providers of open weight models.
Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable.
If I recall correctly, Elon Musk is powering some of his datacenters with a constant flow of diesel fuel into generators because he can&rsquo;t get enough power from the power grid.
The scale of everything at the moment seems to border absurdity.
I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out.</p>
<p>Please let me know if I&rsquo;m wrong about anything or with better predictions!</p>
]]></content:encoded></item><item><title>The folly of Debian major version upgrades</title><link>https://www.alexselimov.com/posts/debian_upgrade/</link><pubDate>Sun, 13 Jul 2025 08:35:50 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/debian_upgrade/</guid><description>&lt;p>I recently realized that my web server was still on Debian Buster, &lt;strong>2 whole major versions behind&lt;/strong> the latest Debian version. Normally this kind of thing wouldn&amp;rsquo;t matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward.&lt;/p></description><content:encoded><![CDATA[<p>I recently realized that my web server was still on Debian Buster, <strong>2 whole major versions behind</strong> the latest Debian version. Normally this kind of thing wouldn&rsquo;t matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward.</p>
<p><strong>This is a reminder to backup consistently.</strong></p>
<p>Of course after thinking everything went fine, I tried to install a new package and libcrypt ends up getting removed leaving me unable to login to my server. Luckily I had backed up before this which saved all of my bespoke configurations. I&rsquo;m sure no one noticed the down time but I did use this as an opportunity to make the followjng changes:</p>
<ul>
<li>matrix-synapse upgrade to dendrite for better performance.</li>
<li>Gitea to forgejo just to try something different.</li>
<li>Properly set up actions to auto build and deploy site on push.</li>
<li>Rework website and swap to the <a href="https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme">terminal hugo theme</a></li>
</ul>
<p>So far, I have positive opinions of all of my changes and highly recommend dendrite and forgejo.</p>
<p><strong>Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime</strong></p>
]]></content:encoded></item><item><title>Getting CUDA toolkit installed on Void Linux</title><link>https://www.alexselimov.com/posts/cuda_on_void/</link><pubDate>Tue, 15 Apr 2025 10:45:26 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/cuda_on_void/</guid><description>&lt;p>This is a short post (mainly for myself) to remember how I got CUDA installed on Void Linux.
These steps are as follows:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Download the installation files:&lt;/strong> Go to the CUDA toolkit installation website. Select Linux-&amp;gt;x86_64-&amp;gt;Debian-&amp;gt;11-&amp;gt;runfile (local)&lt;/li>
&lt;li>&lt;strong>Set executable permission:&lt;/strong> &lt;code>chmod +x ./cuda_version.run&lt;/code>&lt;/li>
&lt;li>&lt;strong>Install using the correct flags:&lt;/strong>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">sudo ./cuda_11.8.0_520.61.05_linux.run --silent --override --toolkit --no-opengl-libs --tmpdir&lt;span class="o">=&lt;/span>/home/aselimov/down/tmp&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>Add to path:&lt;/strong> Build should now be installed at /usr/local/cuda-version. Add the following to your bashrc or zshrc:





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$PATH&lt;/span>&lt;span class="s2">:/usr/local/cuda-version/bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">LD_LIBRARY_PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$LD_LIBRARY_PATH&lt;/span>&lt;span class="s2">:/usr/local/cuda-version/lib64&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>The reason I had to add the &lt;code>--tmpdir&lt;/code> command was because I was getting an error message about the default &lt;code>tmp&lt;/code> directory not having enough space.
Hopefully this helps someone else out!&lt;/p></description><content:encoded><![CDATA[<p>This is a short post (mainly for myself) to remember how I got CUDA installed on Void Linux.
These steps are as follows:</p>
<ol>
<li><strong>Download the installation files:</strong> Go to the CUDA toolkit installation website. Select Linux-&gt;x86_64-&gt;Debian-&gt;11-&gt;runfile (local)</li>
<li><strong>Set executable permission:</strong> <code>chmod +x ./cuda_version.run</code></li>
<li><strong>Install using the correct flags:</strong>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo ./cuda_11.8.0_520.61.05_linux.run --silent --override --toolkit --no-opengl-libs --tmpdir<span class="o">=</span>/home/aselimov/down/tmp</span></span></code></pre></div></li>
<li><strong>Add to path:</strong> Build should now be installed at /usr/local/cuda-version. Add the following to your bashrc or zshrc:





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$PATH</span><span class="s2">:/usr/local/cuda-version/bin&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">export</span> <span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$LD_LIBRARY_PATH</span><span class="s2">:/usr/local/cuda-version/lib64&#34;</span></span></span></code></pre></div></li>
</ol>
<p>The reason I had to add the <code>--tmpdir</code> command was because I was getting an error message about the default <code>tmp</code> directory not having enough space.
Hopefully this helps someone else out!</p>
]]></content:encoded></item><item><title>Solutions to problems with Java Development</title><link>https://www.alexselimov.com/posts/java_dev_problems/</link><pubDate>Sun, 12 May 2024 20:03:17 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/java_dev_problems/</guid><description>&lt;p>I recently ran into some problems with java development.
One problem was neovim specific but the other was an issue with gradle.
I wanted to document these in case any one else has similar problems as it took me a little bit of time to figure out.&lt;/p>
&lt;h2 id="problem-1-jdtls-exiting-with-status-code-13">Problem 1: jdtls exiting with status code 13&lt;/h2>
&lt;p>I use jdtls through Mason with the built in nvim LSP and was recently having an issue where jdtls would immediately crash when opening a file.
The solution to this problem was just deleting the cache for jdtls:&lt;/p></description><content:encoded><![CDATA[<p>I recently ran into some problems with java development.
One problem was neovim specific but the other was an issue with gradle.
I wanted to document these in case any one else has similar problems as it took me a little bit of time to figure out.</p>
<h2 id="problem-1-jdtls-exiting-with-status-code-13">Problem 1: jdtls exiting with status code 13</h2>
<p>I use jdtls through Mason with the built in nvim LSP and was recently having an issue where jdtls would immediately crash when opening a file.
The solution to this problem was just deleting the cache for jdtls:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl">rm ~/.cache/jdtls</span></span></code></pre></div><p><strong>Edit 05/14/2024</strong>: This also solves the problem of jdtls not attaching on neovim startup.
May solve other problems as well, so should be first thing to try if jdtls isn&rsquo;t working.</p>
<h2 id="problem-2-could-not-set-executable-permissions-for-gradle">Problem 2: Could not set executable permissions for .gradle</h2>
<p>When attempting to build with a gradlew script I was running into the following error:</p>
<p><em>Could not set executable permissions for: ~/.gradle/wrapper/dists/gradle-7.6-bin/9l9tetv7ltxvx3i8an4pb86ye/gradle-7.6/bin/gradle</em></p>
<p>After spending some time trying to find a solution, I found a suggestion of setting an environment variable:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl"> <span class="nb">export</span> <span class="nv">JAVA_TOOL_OPTIONS</span><span class="o">=</span><span class="s2">&#34;-Djdk.lang.Process.launchMechanism=vfork&#34;</span></span></span></code></pre></div><p>The above environment variable was all I needed and the gradle script was able to assemble the project successfully.
Hopefully this is helpful to someone!</p>
]]></content:encoded></item><item><title>Rust is pretty good (Short thoughts on Rust)</title><link>https://www.alexselimov.com/posts/thoughts_on_rust/</link><pubDate>Tue, 09 Apr 2024 21:31:01 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/thoughts_on_rust/</guid><description>&lt;p>In my current position I&amp;rsquo;ve had to swap to full time Rust development.
After about 2 months of full time Rust development I think I&amp;rsquo;ll likely be developing projects in Rust in the future instead of C++ when performance is important.
My reasons for this are primarily:&lt;/p>
&lt;ol>
&lt;li>Just Works™ build system and crates.io makes drawing in libraries painless&lt;/li>
&lt;li>Guaranteed memory safety is pretty nice&lt;/li>
&lt;li>Syntax is much cleaner and succinct than C++, with lots of nice syntax sugar to sweeten the package&lt;/li>
&lt;li>Easily integrable with C (and therefore C++ with some massaging)&lt;/li>
&lt;li>Proc macros are pretty nice as well&lt;/li>
&lt;li>Built-in test framework&lt;/li>
&lt;/ol>
&lt;p>I think that point 3 is potentially the biggest factor for me as the C++ modern syntax is not what I would consider clean, especially if you are trying to use a more functional programming style.
A simple example highlighting the difference:&lt;/p></description><content:encoded><![CDATA[<p>In my current position I&rsquo;ve had to swap to full time Rust development.
After about 2 months of full time Rust development I think I&rsquo;ll likely be developing projects in Rust in the future instead of C++ when performance is important.
My reasons for this are primarily:</p>
<ol>
<li>Just Works™ build system and crates.io makes drawing in libraries painless</li>
<li>Guaranteed memory safety is pretty nice</li>
<li>Syntax is much cleaner and succinct than C++, with lots of nice syntax sugar to sweeten the package</li>
<li>Easily integrable with C (and therefore C++ with some massaging)</li>
<li>Proc macros are pretty nice as well</li>
<li>Built-in test framework</li>
</ol>
<p>I think that point 3 is potentially the biggest factor for me as the C++ modern syntax is not what I would consider clean, especially if you are trying to use a more functional programming style.
A simple example highlighting the difference:</p>
<p><strong>C++</strong></p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln">1</span><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">cbegin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">cend</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="p">[](</span><span class="kt">int</span> <span class="n">value</span><span class="p">){</span> <span class="n">value</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;})</span></span></span></code></pre></div><p><strong>Rust</strong></p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">vec!</span><span class="p">[</span><span class="mi">1</span><span class="p">;</span><span class="mi">10</span><span class="p">];</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v</span><span class="p">.</span><span class="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">val</span><span class="o">|</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">).</span><span class="n">collect</span><span class="p">()</span></span></span></code></pre></div><p><strong>I think that speaks for itself&hellip;</strong>(Although I prefer the C++ lambdas which don&rsquo;t auto capture)</p>
<p>I&rsquo;m not sure that I consider myself a Rustacean though as some seemingly simple programming tasks can become huge mountains due to the borrow rules Rust enforces.
Once you learn the borrow rules and some of the tricks, the language itself ends up being very clean to write and easy to test.
I probably won&rsquo;t be writing C++ in the future unless I have a very specific/niche reason to.
I recommend checking Rust out if you haven&rsquo;t yet, it may surprise you!</p>
]]></content:encoded></item><item><title>My nvim/tmux workflow</title><link>https://www.alexselimov.com/posts/tmux_and_nvim/</link><pubDate>Mon, 04 Mar 2024 21:44:00 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/tmux_and_nvim/</guid><description>&lt;p>At my previous employment I was forced to use a windows system.
Although not ideal, I was able to continue using my Linux terminal workflows by heavily utilizing Windows Subsystem for Linux.
As part of this I had to get comfortable with integrating tmux into my workflow as I didn&amp;rsquo;t care to learn the Windows Terminal options for terminal multiplexing.
I don&amp;rsquo;t need tmux quite as much anymore since my current employer allows me run Linux on my development machine, but I still use it when remoting into my work desktop via ssh.
Hopefully this can be of use in improving the efficiency of others that depend on terminal based workflows.&lt;/p></description><content:encoded><![CDATA[<p>At my previous employment I was forced to use a windows system.
Although not ideal, I was able to continue using my Linux terminal workflows by heavily utilizing Windows Subsystem for Linux.
As part of this I had to get comfortable with integrating tmux into my workflow as I didn&rsquo;t care to learn the Windows Terminal options for terminal multiplexing.
I don&rsquo;t need tmux quite as much anymore since my current employer allows me run Linux on my development machine, but I still use it when remoting into my work desktop via ssh.
Hopefully this can be of use in improving the efficiency of others that depend on terminal based workflows.</p>
<h2 id="tmux-setup">tmux setup</h2>
<p>As a note, all of the below settings should be added to your <code>~/.tmux.conf</code> if you are interested in using them.</p>
<h3 id="some-nice-settings">Some nice settings</h3>
<p>I wanted to start out with some nice settings for tmux that I generally like.
First and foremost I remap the <code>send-prefix</code> key.</p>





<pre tabindex="0"><code class="language-tmux" data-lang="tmux">unbind C-b
set -g prefix C-p
bind C-p send-prefix</code></pre><p>I also rebind the pane splitting commands:</p>





<pre tabindex="0"><code class="language-tmux" data-lang="tmux">bind | split-window -h -c &#34;#{pane_current_path}&#34;
bind - split-window -v -c &#34;#{pane_current_path}&#34;
unbind &#39;&#34;&#39;
unbind %</code></pre><p>And finally, I enable vim key binds in scrolling mode</p>





<pre tabindex="0"><code class="language-tmux" data-lang="tmux">set-window-option -g mode-keys vi
bind-key -T copy-mode-vi v send -X begin-selection
bind-key -T copy-mode-vi V send -X select-line
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel &#39;xclip -in -selection clipboard&#39;</code></pre><h3 id="integration-with-neovim">Integration with neovim</h3>
<p>Here by integration, I mean seamlessly transitioning between tmux and neovim splits.
To do this we want tmux to figure out if the current tmux split contains a vim process (and potential vim splits).
We then can then bind the same motion keys in tmux and nvim so that we can seamlessly move from a tmux split into a vim split and back all using the same keys!
We can do this with the following code snippet in our <code>~/.tmux.conf</code>.</p>





<pre tabindex="0"><code class="language-tmux" data-lang="tmux">is_vim=&#34;ps -o state= -o comm= -t &#39;#{pane_tty}&#39; \
    | grep -iqE &#39;^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$&#39;&#34;

bind-key -n C-h  if-shell  &#34;$is_vim&#34;  &#34;send-keys C-h&#34;  &#34;select-pane -L&#34;
bind-key -n C-j   if-shell  &#34;$is_vim&#34;  &#34;send-keys C-j&#34;   &#34;select-pane -D&#34;
bind-key -n C-k  if-shell  &#34;$is_vim&#34;  &#34;send-keys C-k&#34;  &#34;select-pane -U&#34;
bind-key -n C-l   if-shell  &#34;$is_vim&#34;  &#34;send-keys C-l&#34;   &#34;select-pane -R&#34;
bind-key -n C-\   if-shell  &#34;$is_vim&#34;  &#34;send-keys C-\\&#34;  &#34;select-pane -l&#34;</code></pre><p><code>is_vim</code> defines a command to determine whether the current pane is running vim.
If so, we send the key codes directly to vim, otherwise process the key binding with tmux.
For this case we utilize <code>&lt;C-{vim_keys}&gt;</code> for motion to make things easy.</p>
<h2 id="neovim-setup">Neovim setup</h2>
<p>Now we need to make sure we can go from a neovim split smoothly to a tmux split.
To do this we utilize the <a href="https://github.com/christoomey/vim-tmux-navigator">christoomey/vim-tmux-navigator</a> plugin.
First add it to your plugin manager,</p>
<p><strong>Lazy.nvim:</strong></p>





<pre tabindex="0"><code>require(&#34;lazy&#34;).setup({
    &#34;christoomey/vim-tmux-navigator&#34;
})</code></pre><p>or <strong>Vim-plug:</strong></p>





<pre tabindex="0"><code>call plug#begin(&#39;~/.vim/plugged&#39;)
    Plug &#39;christoomey/vim-tmux-navigator&#39;
call plug#end()</code></pre><p>and that&rsquo;s it!
It should automatically add the <code>&lt;C-{vim_keys}&gt;</code> for motion and handle moving out of vim splits to tmux panes.
Hopefully this is useful to someone else!</p>
<h2 id="bonus">Bonus</h2>
<p>Gruvbox is everywhere even <a href="https://github.com/egel/tmux-gruvbox">tmux gets a nice theme</a>.</p>
]]></content:encoded></item><item><title>Why I left Artix for Void Linux</title><link>https://www.alexselimov.com/posts/leaving_artix_for_void/</link><pubDate>Fri, 05 Jan 2024 21:46:58 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/leaving_artix_for_void/</guid><description>&lt;p>This is going to be primarily opinion based post but I want to talk about a shakeup that has happened.
I have uninstalled Artix from all of my computers and have instead swapped them to Void Linux.
This is the first time I have changed Linux distros in about 3/4 years and was done with a heavy heart as having to setup a new system is always a pain.
Regardless I have been using void linux for about 2-3 months and I am finding it a much better experience than Artix, and I want to discuss the reasons why below.&lt;/p></description><content:encoded><![CDATA[<p>This is going to be primarily opinion based post but I want to talk about a shakeup that has happened.
I have uninstalled Artix from all of my computers and have instead swapped them to Void Linux.
This is the first time I have changed Linux distros in about 3/4 years and was done with a heavy heart as having to setup a new system is always a pain.
Regardless I have been using void linux for about 2-3 months and I am finding it a much better experience than Artix, and I want to discuss the reasons why below.</p>
<h2 id="problems-with-artix">Problems with Artix</h2>
<p>The biggest reason for me leaving Artix was an issue of stability/compatibility.
I have a <a href="/posts/valgrind-artix-linux/">previous post</a> describing one issue that I ran into regarding incompatibility between the Artix debuginfod server and their shipped glibc version.
In general, after 2/3 years Artix gives me the impression of simply a patched version of Arch linux to remove systemd instead of it&rsquo;s own OS.
Package compatibility sometimes has issues when Arch linux core repositories move slightly ahead of Artix linux core repositories.
For the most part, Artix Linux ran very well but towards the end of my time with it I found significant accumulated debt on my system with mixtures of Artix and Arch packages which lead to annoying configuration problems that took way too much time to fix.
After being unsuccessful in addressing some issues and with fresh installs for some reason having issues on my systems, I decided I need to figure out something new.</p>
<h2 id="void-linux-saves-the-day">Void Linux saves the day</h2>
<p>This is when Void Linux came in to save the day.
I find that void offers a few benefits over Artix Linux:</p>
<ul>
<li><strong>Stability</strong>- VoidLinux in my experience has been much more stable over updates than either Artix or Arch.</li>
<li><strong>Vision</strong> - Not sure if vision is the right word, but void linux is an independent OS not forked from any other. As a result the OS feels more cohesive as it doesn&rsquo;t have to deal with conflicting visions.</li>
<li><strong>Package Manger</strong> -  XBPS is an extremely fast and easy to use package manager.</li>
<li><strong>Init System</strong> - runit was my preferred init system on Artix, and finding an OS which defaults to runit is a positive indication for me.</li>
</ul>
<p>The obvious issues with void are:</p>
<ul>
<li>No AUR</li>
<li>Less documentation, arch linux guide works most but not all of the times</li>
</ul>
<p>I&rsquo;ve found that in practice, I do not significantly miss the AUR as any software I need is packaged in the void repositories.
For the very rare cases that the software I need is not packaged, I can just clone the software repo and build/install from source.
The documentation factor is a little bit of a bigger deal.
There have been a few cases where I&rsquo;ve spent far too much time trying to address some seemingly basic configuration because of lack of documentation.
This doesn&rsquo;t bother me as much as the issues I had with Artix as the time I spent is learning how to use Void Linux, familiarity with your tools, as opposed to trying to bandage broken systems.
If you install a desktop environment such as KDE or Gnome, you probably won&rsquo;t run into this issue as much as I did.</p>
<h2 id="overall-i-find-that-the-following-meme-captures-my-current-feelings-pretty-well">Overall I find that the following meme captures my current feelings pretty well:</h2>
<center>
    <img  src="/img/friendship_meme.webp"
          width="100%"
         style=" max-width:500px"  
    >
</center>

<p><strong>Hopefully this is helpful to someone else as I personally have not regretted my switch for a moment.</strong></p>
]]></content:encoded></item><item><title>Gettting Valgrind working on Artix Linux</title><link>https://www.alexselimov.com/posts/valgrind-artix-linux/</link><pubDate>Tue, 29 Aug 2023 21:38:32 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/valgrind-artix-linux/</guid><description>&lt;p>I&amp;rsquo;m currently working on developing an implementation of the Concurrent Atomistic-Continuum method using C++ and CUDA to accelerate calculations.
A need arose to use &lt;code>valgrind&lt;/code> for debugging some memory issues.
I currently run &lt;a href="https://artixlinux.org">Artix Linux&lt;/a> and it turns out that both Artix Linux and Arch Linux have fully removed all debug packages from their repositories and have swapped over to a &lt;code>debuginfod&lt;/code> style system.
On my system, said &lt;code>debuginfod&lt;/code> was working with &lt;code>gdb&lt;/code> but not with &lt;code>valgrind&lt;/code>.
In particular I was missing the debug symbols for &lt;code>glibc&lt;/code> which prevented &lt;code>valgrind&lt;/code> from working at all.
I had to try a few things before I got it working so I want to share how I did.
I also want to mention an issue I ran into if any guys from Artix Linux ever end up reading this post.&lt;/p></description><content:encoded><![CDATA[<p>I&rsquo;m currently working on developing an implementation of the Concurrent Atomistic-Continuum method using C++ and CUDA to accelerate calculations.
A need arose to use <code>valgrind</code> for debugging some memory issues.
I currently run <a href="https://artixlinux.org">Artix Linux</a> and it turns out that both Artix Linux and Arch Linux have fully removed all debug packages from their repositories and have swapped over to a <code>debuginfod</code> style system.
On my system, said <code>debuginfod</code> was working with <code>gdb</code> but not with <code>valgrind</code>.
In particular I was missing the debug symbols for <code>glibc</code> which prevented <code>valgrind</code> from working at all.
I had to try a few things before I got it working so I want to share how I did.
I also want to mention an issue I ran into if any guys from Artix Linux ever end up reading this post.</p>
<h2 id="what-shouldve-worked-but-didnt">What should&rsquo;ve worked but didn&rsquo;t</h2>
<p>Artix linux is hosting a debuginfod server at <a href="https://debuginfod.artixlinux.org">https://debuginfod.artixlinux.org</a>.
They have this set up so that you can add it to your <code>/etc/pacman.conf</code> as a custom repository.
All you have to do is append:</p>





<pre tabindex="0"><code>[system-debug]
Server = https://debuginfod.artixlinux.org/$repo/os/$arch
[world-debug]
Server = https://debuginfod.artixlinux.org/$repo/os/$arch
[galaxy-debug]
Server = https://debuginfod.artixlinux.org/$repo/os/$arch
[lib32-debug]
Server = https://debuginfod.artixlinux.org/$repo/os/$arch</code></pre><p>to the bottom of the file, run a quick <code>pacman -Syu</code>, and then you should be good to go.
The issue that I ran into was that the debug package for <code>glibc</code> was old compared to the version of <code>glibc</code> I had installed.
This meant that even though I had the <code>glibc-debug</code> package, <code>valgrind</code> still didn&rsquo;t work.
My only gripe with the Artix Linux team is that if you are going to switch to a <code>debuginfod</code> setup and not allow us to install packages from the core repositories that have debug symbols enabled, please at least keep it up to date with the other core repositories.</p>
<h2 id="what-does-work-and-isnt-ideal">What does work and isn&rsquo;t ideal</h2>
<p>Once the Artix specific solution didn&rsquo;t work, I switched over to figuring out the more general Arch Linux solution with the hope that it didn&rsquo;t involve <code>systemd</code>.
It turns out that the Arch Linux team has not exposed their debug repositories the same way that the Artix Linux team has which means you have to dig a little bit more.
I ended up finding in the Arch Linux wiki, that there are Arch Linux sponsored mirrors which contain the debug packages.
To enable these you just add:</p>





<pre tabindex="0"><code>[core-debug]
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
[extra-debug]
Include = https://geo.mirror.pkgbuild.com/$repo/os/$arch

[multilib-debug]
Include = https://geo.mirror.pkgbuild.com/$repo/os/$arch</code></pre><p>to the bottom of your <code>/etc/pacman.conf</code>.
Now you are actually good to update with  <code>pacman -Syu</code> and install debug symbols for glibc, <code>pacman -S glibc-debug</code>.
Just watch out for incompatible versions again.
It may be that on another upgrade, Arch linux will move further ahead on the debug package version number than the Artix Linux version of <code>glibc</code>.
A workaround for this is to just install glibc from the Arch Linux <code>[core]</code> repository from <a href="https://geo.mirror.pkgbuild.com">https://geo.mirror.pkgbuild.com</a> instead of the <code>[system]</code> repository on Artix.
<strong>Be warned</strong> though that this might mess up other Artix programs which depend on the current Artix version of <code>glibc</code>.
For now I&rsquo;ve left it this way so I can get back to figuring out CUDA.
Hopefully this helps someone out, happy valgrinding!</p>
]]></content:encoded></item><item><title>Highlighting the active menu item in Hugo</title><link>https://www.alexselimov.com/posts/highlighedmenu/</link><pubDate>Mon, 03 Jul 2023 22:19:00 -0400</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/highlighedmenu/</guid><description>&lt;p>I&amp;rsquo;ve recently been developing sites for some family/friends.
I had one person request highlighting the currently selected menu item.
I had built a custom theme which used a navbear defined in the site wide &lt;code>hugo.toml&lt;/code>.
There were a few different solutions but I wanted to highlight the solution I ended up using for my use case.
A dummy of my site directory set up is:&lt;/p>





&lt;pre tabindex="0">&lt;code>content
 |-- section1
 |--_index.md
 |--section1Post.md
 |-- section2
 |--_index.md
 |--section2Post.md
 |-- section3
 |--_index.md&lt;/code>&lt;/pre>&lt;p>In my header partial I created a menu by looping over the entries in &lt;code>[[menu.main]]&lt;/code> defined in the &lt;code>hugo.toml&lt;/code>.
It&amp;rsquo;s important here to end the &lt;code>url&lt;/code> with a &lt;code>/&lt;/code>.
Hugo adds an ending &lt;code>/&lt;/code>, to the urls of the pages that it creates.
While this might not be necessary to make the hyperlink work, it will be necessary to get the highlighting correct.
The definition of the menu looks like:&lt;/p></description><content:encoded><![CDATA[<p>I&rsquo;ve recently been developing sites for some family/friends.
I had one person request highlighting the currently selected menu item.
I had built a custom theme which used a navbear defined in the site wide <code>hugo.toml</code>.
There were a few different solutions but I wanted to highlight the solution I ended up using for my use case.
A dummy of my site directory set up is:</p>





<pre tabindex="0"><code>content
    |-- section1
            |--_index.md
            |--section1Post.md
    |-- section2
            |--_index.md
            |--section2Post.md
    |-- section3
            |--_index.md</code></pre><p>In my header partial I created a menu by looping over the entries in <code>[[menu.main]]</code> defined in the <code>hugo.toml</code>.
It&rsquo;s important here to end the <code>url</code> with a <code>/</code>.
Hugo adds an ending <code>/</code>, to the urls of the pages that it creates.
While this might not be necessary to make the hyperlink work, it will be necessary to get the highlighting correct.
The definition of the menu looks like:</p>





<pre tabindex="0"><code>[menu]
  [[menu.main]]
    name= &#34;section1&#34;
    url= &#34;/section1/&#34;
    weight= &#34;1&#34;
  [[menu.main]]
    name= &#34;section2&#34;
    url= &#34;/section2/&#34;
    weight= &#34;2&#34;
  [[menu.main]]
    name= &#34;section3&#34;
    url= &#34;/section3/&#34;
    weight= &#34;3&#34;</code></pre><p>The original header partial is pretty simple.
I just loop over the range <code>.Site.Menus.main</code> and insert a <code>&lt;div class=&quot;item&quot;&gt;</code> which is my div class for a navbar menu item.
I populate the text and link from the variables associated with the main menu item.
This is all wrapped within a <code>&lt;nav&gt;</code> element with other items and stylings that create the overall navigation menu.
The loop for insertion of menu items is below:</p>





<pre tabindex="0"><code>{{ range .Site.Menus.main }} 
    &lt;div class=&#34;item&#34;&gt;
            &lt;a href=&#34;{{ .URL }}&#34;&gt;
                {{ $text := print .Name | safeHTML }}
                {{ $text }}
            &lt;/a&gt;
        &lt;/div&gt;
{{ end }}</code></pre><p>As I mentioned before, there were a few different solutions but the one I went with was to save the menu item url and the current page url into two separate variables.
<strong>I can then compare these to determine whether the current page corresponds to a menu item and if so I change the class of the div from a normal menu item to the activated menu item class.</strong>
This concept can be seen in action in the following code snippet:</p>





<pre tabindex="0"><code>{{ $currentPage := . }}
{{ range .Site.Menus.main }} 
    {{ $menu_item_url := .URL | relLangURL }}
    {{ $page_url:= $currentPage.RelPermalink | relLangURL }}
    &lt;div 
         {{ if eq $menu_item_url $page_url }}
            class=&#34;active-item&#34;
    {{else}}
            class=&#34;item&#34;
    {{ end }}
    &gt;
            &lt;a href=&#34;{{ .URL }}&#34;&gt;
                {{ $text := print .Name | safeHTML }}
                {{ $text }}
            &lt;/a&gt;
        &lt;/div&gt;
{{ end }}</code></pre><p>I hope that this is helpful to somebody else as it took me a decent amount of time to try the different recommended methods before I found this one.
As always shoot me an email if you have any thoughts or comments!</p>
]]></content:encoded></item><item><title>Hosting your own git frontend service using Gitea</title><link>https://www.alexselimov.com/posts/gitea/</link><pubDate>Sat, 25 Feb 2023 10:19:50 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/gitea/</guid><description>&lt;p>I recently had interest in starting to work on the implementation of the &lt;a href="https://doi.org/10.1063/1.5099653">Concurrent Atomistic-Continuum Method&lt;/a> using C++ to take advantage of GPU acceleration.
As a first step, I began thinking about where I wanted to host my project.
I decided to add hosting my own git server to my list of self-hosted services, including &lt;a href="https://github.com/LukeSmithxyz/emailwiz">e-mail&lt;/a> and &lt;a href="https://matrix.org/docs/projects/server/synapse">matrix chat server&lt;/a>.
This is a quick guide on how I set up &lt;a href="https://gitea.io/en-us/">Gitea&lt;/a> and configured it on my website.
&lt;strong>As a note, my web server is a Debian machine using Nginx&lt;/strong>&lt;/p></description><content:encoded><![CDATA[<p>I recently had interest in starting to work on the implementation of the <a href="https://doi.org/10.1063/1.5099653">Concurrent Atomistic-Continuum Method</a> using C++ to take advantage of GPU acceleration.
As a first step, I began thinking about where I wanted to host my project.
I decided to add hosting my own git server to my list of self-hosted services, including <a href="https://github.com/LukeSmithxyz/emailwiz">e-mail</a> and <a href="https://matrix.org/docs/projects/server/synapse">matrix chat server</a>.
This is a quick guide on how I set up <a href="https://gitea.io/en-us/">Gitea</a> and configured it on my website.
<strong>As a note, my web server is a Debian machine using Nginx</strong></p>
<h2 id="setting-up-the-database">Setting up the database</h2>
<p>I already use <a href="https://www.postgresql.org/">PostgreSQL</a> to manage my matrix-synapse database and configured Gitea to use the same.
First, following the <a href="https://docs.gitea.io/en-us/database-prep/#postgresql-1">Gitea documentation</a>, I  set the <code>listen_address</code> and <code>password_encryption</code> in my <code>postgresql.conf</code> at <code>/etc/postgresql/11/main/postgresql.conf</code>:</p>





<pre tabindex="0"><code>listen_addresses = &#39;localhost, 203.0.113.3&#39;
password_encryption = scram-sha-256</code></pre><p>You should then restart PostgreSQL.
Now you can log into the database console:</p>





<pre tabindex="0"><code>su -c &#34;psql&#34; - postgres</code></pre><p>Then create a database user, gitea:</p>





<pre tabindex="0"><code>CREATE ROLE gitea WITH LOGIN PASSWORD &#39;{ReplaceWithStrongPassword}&#39;;</code></pre><p>Then you can actually create your gitea database:</p>





<pre tabindex="0"><code>CREATE DATABASE giteadb WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE &#39;en_US.UTF-8&#39; LC_CTYPE &#39;en_US.UTF-8&#39;;</code></pre><p>The last step is adding authentication rules to your <code>pg_hba.conf</code> at <code>/etc/postgresql/11/main/pg_hba.conf</code>.
<strong>As a note, the following line should be added near the top of this file as authentication rules are evaluated sequentially.
As a result, any generic rule at the top of this file may be used instead of the inserted rule if not inserted first.</strong></p>





<pre tabindex="0"><code>local   giteadb gitea   scram-sha-256</code></pre><h2 id="installing-and-setting-up-gitea">Installing and setting up gitea</h2>
<p>Since my server is on debian, I didn&rsquo;t have access to a gitea package.
Instead, I downloaded the executable:</p>





<pre tabindex="0"><code>wget -O gitea https://dl.gitea.com/gitea/1.18.5/gitea-1.18.5-linux-amd64
chmod +x gitea</code></pre><p>You should then create a git user account on your server:</p>





<pre tabindex="0"><code>adduser \
   --system \
   --shell /bin/bash \
   --gecos &#39;Git Version Control&#39; \
   --group \
   --disabled-password \
   --home /home/git \
   git</code></pre><p>A few directories need to be created for gitea and file permissions set:</p>





<pre tabindex="0"><code>mkdir -p /var/lib/gitea/{custom,data,log}
chown -R git:git /var/lib/gitea/
chmod -R 750 /var/lib/gitea/
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea</code></pre><p>You can then copy gitea to a directory on your path, i.e.:</p>





<pre tabindex="0"><code>cp gitea /usr/local/bin/gitea</code></pre><p>The last step for setting up gitea is downloading the <a href="https://github.com/go-gitea/gitea/blob/main/contrib/systemd/gitea.service">example systemd service file</a> and placing that in <code>/etc/systemd/system</code>.
At this point you should be able to enable and start the service:</p>





<pre tabindex="0"><code>sudo systemctl enable gitea
sudo systemctl start gitea</code></pre><h2 id="gitea-and-nginx-configuration">Gitea and Nginx configuration</h2>
<p>There are a few configurations options you need to set for Gitea and Nginx that I&rsquo;ll outline here.
First as a note, I wanted my git server to be accessible at <a href="alexselimov.com/git">alexselimov.com/git</a>.
It&rsquo;s possible to set gitea up as a subdomain, i.e. <code>git.some.site</code>, but I won&rsquo;t go into that.
First you want to configure nginx so you can access your Gitea instance.
You can also simply go to <code>your.web.site:3000</code> to skip the Nginx configuration.
Adding Gitea at <code>your.web.site/git</code> is extremely simple and if you have SSL certificates with certbot, access to your Gitea instance will also occur over HTTPS.
All you have to do is add:</p>





<pre tabindex="0"><code>location /git/{
        proxy_pass http://localhost:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}</code></pre><p>in your primary server block for your website.
Now if you restart Nginx you should be able to navigate to <code>your.web.site/git</code>.
The first time you access your Gitea instance, it will ask you several configuration questions which then populate the default configuration file for Gitea that you can then adjust.
Answer to the best of your knowledge and then we will go over the most important ones in your configuration file.</p>
<p>Gitea configurations are available in the <code>/etc/gitea/app.ini</code> file.
You want to double check that your <code>[database]</code> section is correct, especially the <code>NAME</code> variable.</p>





<pre tabindex="0"><code>[database]
DB_TYPE  = postgres
HOST     = 127.0.0.1
NAME     = giteadb
USER     = gitea
PASSWD   = &#39;{SOME SECURE PASSWORD}&#39;</code></pre><p>If you want you can set your default branch name in the <code>[repository]</code> section:</p>





<pre tabindex="0"><code>[repository]
DEFAULT_BRANCH = master</code></pre><p>Finally to make sure your site works properly, you want to go to your <code>[server]</code> section and make sure that <code>[SSH_DOMAIN]</code> is set to the domain that you use to ssh into your server.
For example, I ssh into <a href="alexselimov.com">alexselimov.com</a> so my <code>app.ini</code> has:</p>





<pre tabindex="0"><code>[server]
SSH_DOMAIN = alexselimov.com</code></pre><p>Your <code>ROOT_URL</code> should however be set to the url that maps to your Gitea instance, i.e.,</p>





<pre tabindex="0"><code>ROOT_URL = https://alexselimov.com/git</code></pre><p>To finish setting up ssh, you just have to add your public key to your user account in the Gitea under settings-&gt;SSH/GPG keys.
Then as site admin you have to go to the Site Administration menu and run the &ldquo;Update the &lsquo;.ssh/authorized_keys&rsquo; file with Gitea SSH keys.&rdquo; option.
At this point you should be good to go with Gitea and using ssh to access your repositories.
The final option I though was useful was:</p>





<pre tabindex="0"><code>[sevice]
DISABLE_REGISTRATION = true</code></pre><p>I am making this repo for personal use.
Disabling registration still allows people to clone my public repositories, but I want to be sure that I screen potential contributors or other people that can have accounts on my instance.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope these instructions were useful to someone, let me know if I missed a step or got something wrong and I&rsquo;ll be sure to correct it. Thanks for reading!</p>
]]></content:encoded></item><item><title>Separate files from git repo into a submodule</title><link>https://www.alexselimov.com/posts/pull_files_into_submodule/</link><pubDate>Wed, 22 Feb 2023 20:31:34 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/pull_files_into_submodule/</guid><description>&lt;p>I recently had a situation where a library I was working on, originally as part of one project, was going to be needed for another project.
The ideal way to handle this situation, is to have the library files as their own git repo which is then added to the projects as a submodule.
This way any changes required to the submodule for the needs of each project can be shared easily.
It took me much longer than I would&amp;rsquo;ve liked to, but I finally managed to find the solution and wanted to share it with anyone else who might need it.&lt;/p></description><content:encoded><![CDATA[<p>I recently had a situation where a library I was working on, originally as part of one project, was going to be needed for another project.
The ideal way to handle this situation, is to have the library files as their own git repo which is then added to the projects as a submodule.
This way any changes required to the submodule for the needs of each project can be shared easily.
It took me much longer than I would&rsquo;ve liked to, but I finally managed to find the solution and wanted to share it with anyone else who might need it.</p>
<p>Assume I have a git repo as below:</p>





<pre tabindex="0"><code>test
├── README.md
├── main.cpp
├── test.cpp
└── test.h</code></pre><p>If I wanted to pull out the test.cpp and test.h files on their own with all the history for only those commits, the command is:</p>





<pre tabindex="0"><code>$ git filter-branch --force  --prune-empty --index-filter \
 &#39;git rm --cached --ignore-unmatch $(git ls-files | grep -v &#34;test.h\|test.cpp&#34;)&#39;</code></pre><p>A couple notes should be mentioned.
First when you run the git filter-branch command it will give you a message saying that you shouldn&rsquo;t use filter-branch and should instead use filter-repo.
I don&rsquo;t know how to do this with filter-repo and didn&rsquo;t have the time to figure it out.
The <code>--prune-empty</code> flag deletes all the commits that aren&rsquo;t associated with the files of interest so that you don&rsquo;t have to do a rebase.
Finally to specify the files you want, you need to pass them to the grep command as:</p>





<pre tabindex="0"><code>grep -v &#34;file1\|file2\|file3&#34;</code></pre><p>The <code>-v</code> flag inverts the match, returning all files to the <code>git rm</code> command which don&rsquo;t match the files you specify.
The file names must be separated with <code>\|</code> for matching multiple different tokens.
Once this command completes, you should be left with just the files of interest and the associated history.
All that&rsquo;s left is simply setting a new remote url and then push, i.e.</p>





<pre tabindex="0"><code>$ git remote set-url origin submodule.git.url
$ git push</code></pre><p><strong>Final Important Note:</strong> If this goes wrong you may get worried as all of your git history is wiped out.
To fix this you can use <code>git reflog</code>.
If you run <code>git reflog</code> after you mess up the <code>git filter-branch</code> you should see something like this (dummy commits from my fake repo):</p>





<pre tabindex="0"><code>$ git reflog
790c883 (HEAD -&gt; master) HEAD@{0}: filter-branch: rewrite
3b3c8b8 HEAD@{1}: commit: Update test library
93cfbd4 HEAD@{2}: commit: Add main function
18259bc HEAD@{3}: commit: README update
aba8323 HEAD@{4}: commit: init test files</code></pre><p>You can then reset your git repo to a state before your filter branch command by running:</p>





<pre tabindex="0"><code>$ git reset --hard HEAD@{1}</code></pre><p>Hopefully this helps someone out!</p>
]]></content:encoded></item><item><title>Developing a mobile-friendly navigation menu for your website</title><link>https://www.alexselimov.com/posts/mobile_navbar/</link><pubDate>Mon, 13 Feb 2023 11:13:34 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/mobile_navbar/</guid><description>&lt;p>I personally am a big fan of navbars as they are a clean way to navigate any website.
The classic navbar, that you are likely seeing on this site if you are viewing this on a desktop browser, is extremely simple to make and you can easily find guides to develop these.
The one I personally used is &lt;a href="https://www.w3schools.com/howto/howto_css_dropdown_navbar.asp">here&lt;/a>.
What was not as simple for me was creating a decent navbar for mobile.
I had to develop it for a site that I was working on for my church that never concluded development.
I copied it over to my personal site and learned a lot in the process of developing it so all was not wasted.
It did however end up taking me way more time than it should have and in the hopes of saving some other poor soul some time, I decided to write an article about how I did it on my site.&lt;/p></description><content:encoded><![CDATA[<p>I personally am a big fan of navbars as they are a clean way to navigate any website.
The classic navbar, that you are likely seeing on this site if you are viewing this on a desktop browser, is extremely simple to make and you can easily find guides to develop these.
The one I personally used is <a href="https://www.w3schools.com/howto/howto_css_dropdown_navbar.asp">here</a>.
What was not as simple for me was creating a decent navbar for mobile.
I had to develop it for a site that I was working on for my church that never concluded development.
I copied it over to my personal site and learned a lot in the process of developing it so all was not wasted.
It did however end up taking me way more time than it should have and in the hopes of saving some other poor soul some time, I decided to write an article about how I did it on my site.</p>
<p><strong>If you want to check out how it looks like on my site before we get started, just shrink the width of your browser!</strong></p>
<h2 id="fundamental-approach">Fundamental approach</h2>
<p>I decided that the simplest way to do what I wanted, was to design two completely separate navigation bars.
One is used for larger screen widths while the other is used for smaller screen widths.
This might not be the most elegant method but it certainly is simple.
The <code>&lt;nav class=&quot;primary&quot;&gt;</code>, which is the default navigation bar, is therefore styled using the following code (excluding all actual styling code):</p>





<pre tabindex="0"><code>nav.primary{
    display: flex;
}

@media screen and (max-width: 768px){
    nav.primary{
        display: none;
    }
}</code></pre><p>Now that we have briefly touched the primary navigation bar, let&rsquo;s move on to styling the mobile navigation bar.</p>
<h2 id="designing-a-mobile-navigation-bar">Designing a mobile navigation bar</h2>
<p>The mobile navigation menu that I am using is simple.
What I wanted was a menu with items that would reveal itself after the user clicks the hamburger menu icon.
To start, we need to style a menu that is hidden.
The CSS for this menu is:</p>





<pre tabindex="0"><code>nav.mobile{
    transition: left 0.4s ease;
    position: fixed;
    top: 0;
    left: -50%;
    width: 50%;
    height: 100%;
    background: #665c54;
    z-index: 9999;
}</code></pre><p>The <code>z-index</code>, <code>height</code>, <code>top</code>, <code>width</code>, and <code>background</code> properties create a rectangular block that is laid over the site.
The <code>transition</code> property allows for smooth sliding when we move this element around when we open the menu.
The final important property here is that we set <code>left:-50%</code> to hide the menu.
We can then easily add items to this menu using a list, or just an item div (which is what I prefer) i.e.</p>





<pre tabindex="0"><code>nav.mobile .mobile-item{
    margin: 20px 10px;
}</code></pre><h2 id="creating-a-hamburger-menu-icon-to-open-our-menu">Creating a hamburger menu icon to open our menu</h2>
<p>Now we need an icon that we can click to open our menu.
It turns out that it is possible to create a hamburger menu just using html and CSS.
We won&rsquo;t need Font Awesome for this.
The html code for the hamburger menu is:</p>





<pre tabindex="0"><code>&lt;div class=&#34;hamburger&#34; id=&#34;Ham&#34;&gt;
    &lt;div class = &#34;bars&#34; &gt;
        &lt;span class=&#34;bar&#34;&gt;&lt;/span&gt;
        &lt;span class=&#34;bar&#34;&gt;&lt;/span&gt;
        &lt;span class=&#34;bar&#34;&gt;&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre><p>We put our <code>&lt;span class='bar'&gt;</code> inside of a <code>&lt;div class = &quot;hamburger&quot;&gt;</code>.
By default we have <code>&lt;div class=&quot;hamburger&quot;</code> hidden while the <code>&lt;span class=&quot;bar&quot;&gt;</code> is what actually forms the icon.
The CSS code for this is:</p>





<pre tabindex="0"><code>.hamburger {
    display: none;
}

.bar {
    display: block;
    width: 25px;
    height: 3px;
    margin: 5px auto;
    -webkit-transition: all 0.3s ease-in-out;
    transition: all 0.3s ease-in-out;
    background-color: #FFF;
}

.bars{
    display : block;
    position: absolute; 
    top: 20%; 
    left: 20%;
}</code></pre><p>I was not able to create a close symbol that looked nice so I ended up using Font Awesome as shown below:</p>





<pre tabindex="0"><code>html:
&lt;div class = &#34;hamburger&#34;&gt;
    ....
    &lt;div class = &#34;close&#34;&gt;
        &lt;i class=&#34;fa-solid fa-xmark fa-2x&#34;&gt;&lt;/i&gt;
    &lt;/div&gt;
&lt;/div&gt;

CSS:
close{
    display: none;
}</code></pre><p>It should be noted that <code>&lt;div class=&quot;hamburger&quot;&gt;</code>, contains both <code>&lt;div class=&quot;bars&quot;&gt;</code> and <code>&lt;div class=&quot;close&quot;&gt;</code>.
This icon is activated at smaller screen sizes, i.e.</p>





<pre tabindex="0"><code>@media screen and (max-width: 768px) {
    .hamburger{
        display: block;
        margin: 20px 0;
        position: fixed;
        top: 15px;
        left: 45px;
        height: 45px;
        width: 45px;
        text-align: center;
        border-radius: 3px;
        cursor: pointer;
        transition: left 0.4s ease;
        background-color: #696969;
        z-index: 9999;
}</code></pre><h2 id="opening-the-menu-using-javascript">Opening the menu using javascript</h2>
<p>Now that we have a hidden menu and the hamburger icon to open it, we need to add a javascript function that activates on click.
I won&rsquo;t describe how to link .js files, this is a pretty simple thing to look up.
To enable our responsive menu, we need one javascript function described below.</p>





<pre tabindex="0"><code>/* Toggle between adding and removing the &#34;responsive&#34; class to 
the nav when the user clicks on the icon */

function myFunction() {
    var x = document.getElementById(&#34;Nav&#34;);
    if (x.className === &#34;primary&#34;) {
      x.className += &#34; responsive&#34;;
    } else {
      x.className = &#34;primary&#34;;
    }
    var x = document.getElementById(&#34;Ham&#34;);
    if (x.className === &#34;hamburger&#34;) {
      x.className += &#34; responsive&#34;;
    } else {
      x.className = &#34;hamburger&#34;;
    }

    var children = x.children;
     if (children[0].className === &#34;bars&#34;) {
      children[0].className += &#34; responsive&#34;;
    } else {
      children[0].className = &#34;bars&#34;;
    }     
     if (children[1].className === &#34;close&#34;) {
      children[1].className += &#34; responsive&#34;;
    } else {
      children[1].className = &#34;close&#34;;
    }     

    var x = document.getElementById(&#34;Navmobile&#34;);
    if (x.className === &#34;mobile&#34;) {
      x.className += &#34; responsive&#34;;
    } else {
      x.className = &#34;mobile&#34;;
    }

}</code></pre><p>This function simply toggles the class of the divs that comprise our mobile navigation menu.
By default, these divs start out with just a <code>mobile</code> class.
This function then adds the <code>responsive</code> class when called.
If the class already has the <code>responsive</code> class, it removes it.
We can then define additional styling for the <code>responsive</code> elements.
The most obvious step of opening the menu can be done simply by setting the left margin to 0, i.e:</p>





<pre tabindex="0"><code>nav.mobile.responsive {
    left: 0;
}</code></pre><p>As a note we also want to adjust the hamburger menu to a red close symbol by changing the position and color of the menu and also setting display none to the bars which make up the original hamburger menu.</p>





<pre tabindex="0"><code>.hamburger.responsive{
    left: 55%;
    cursor: pointer;
    background-color: #ff6347;
}

.bars.responsive{
    display: none;
}

.close.responsive{
    display: block;
    color: #FFF;
    position: absolute;
    top: 4px;
    left: 10px;
}</code></pre><p>I am certainly not an expert in javascript and am self-taught in html and css so this code might not be optimized, but it gets the job done and makes me happy!</p>
<h2 id="conclusion">Conclusion</h2>
<p>Hopefully this is helpful to someone.
I figure I&rsquo;m probably just tossing this into the void but maybe it will end up being useful to someone.
If you have any comments or find any errors shoot me an email!
Would love to know if anyone actually is using this stuff.</p>
]]></content:encoded></item><item><title>Fighting the web obesity crisis using Hugo and Skeleton CSS</title><link>https://www.alexselimov.com/posts/web_obesity/</link><pubDate>Sun, 12 Feb 2023 12:45:48 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/web_obesity/</guid><description>&lt;p>Now that I&amp;rsquo;ve graduated from my PhD, I find that I have more free time that was previously spent working on my dissertation.
I also have the desire to continue to publish in some manner.
My solution to both of these problems is to revamp my previous website which I only used as a portfolio site for job search purposes into a random blog.&lt;/p>
&lt;p>In my time online I once came across a talk titled &lt;a href="https://webdirections.org/blog/the-website-obesity-crisis/">The Website Obesity Crisis&lt;/a>.
Since I&amp;rsquo;m already obsessed with minimalist systems, obligatory &amp;ldquo;I use &lt;a href="https://artixlinux.org">Artix Linux&lt;/a> and run &lt;a href="https://dwm.suckless.org/">dwm&lt;/a>,&amp;rdquo; I internalized everything immediately and searched for the best way to design a modern and actually minimalist website (both design and size).
I decided to try and serve a website which followed the design paradigm of the web pyramid graphic shown below:&lt;/p></description><content:encoded><![CDATA[<p>Now that I&rsquo;ve graduated from my PhD, I find that I have more free time that was previously spent working on my dissertation.
I also have the desire to continue to publish in some manner.
My solution to both of these problems is to revamp my previous website which I only used as a portfolio site for job search purposes into a random blog.</p>
<p>In my time online I once came across a talk titled <a href="https://webdirections.org/blog/the-website-obesity-crisis/">The Website Obesity Crisis</a>.
Since I&rsquo;m already obsessed with minimalist systems, obligatory &ldquo;I use <a href="https://artixlinux.org">Artix Linux</a> and run <a href="https://dwm.suckless.org/">dwm</a>,&rdquo; I internalized everything immediately and searched for the best way to design a modern and actually minimalist website (both design and size).
I decided to try and serve a website which followed the design paradigm of the web pyramid graphic shown below:</p>
<figure><img src="/img/the_web_pyramid.jpg"
    alt="The ideal design for any website, source" width="100%"><figcaption>
      <p>The ideal design for any website, <a href="https://idlewords.com/talks/website_obesity.htm">source</a></p>
    </figcaption>
</figure>

<p>I found that using <a href="https://gohugo.io">Hugo</a> combined with the <a href="http://getskeleton.com/">Skeleton CSS boilerplate</a> was the solution to a modern, minimalist, and &ldquo;responsive&rdquo; website.
<strong>Read on to learn how I did it!</strong></p>
<h2 id="website-design-paradigm">Website design paradigm</h2>
<p>The rest of this article describes the different components and how I&rsquo;ve adjusted them to suit my purposes.
There exist a <a href="https://themes.gohugo.io/">plethora of themes</a> with complex Hugo shortcodes that allow easy customization from the config files.
My personal site&rsquo;s Hugo theme does not bother with attempting to offer endless customization options.
Instead, if you want to use this theme you should be ready to adjust the CSS files and the Hugo HTML templates.
With that in mind let&rsquo;s get started.</p>
<h2 id="skeleton-css">Skeleton CSS</h2>
<p>The most important component of this site is <a href="http://getskeleton.com">Skeleton CSS</a>, which is a simple CSS boilerplate that serves as the foundation of my site.
Detailed documentation can be found at the link previously mentioned but I&rsquo;ll describe the layout succinctly.
The fundamental container that everything should go into is <code>&lt;div class=container&gt;</code> which responsively scales it&rsquo;s width based on the size of the browser/screen.
The next important div is <code>&lt;div class='row'&gt;</code> which is a row that contains the<code>&lt;div class=&quot;columns&quot;&gt;</code>.
This layout is shown below:</p>





<pre tabindex="0"><code>&lt;div class=&#34;container&#34;&gt;
|   &lt;div class=&#34;row&#34;&gt;
|   |   &lt;div class=&#34;columns&#34;&gt;</code></pre><p>The Skeleton CSS grid has 12 columns, you can specify the number of columns by changing the class, e.g. <code>&lt;div class=&quot;one column&quot;</code>, <code>&lt;div class=&quot;two columns&quot;&gt;</code>, <code>,&lt;div class=&quot;eleven columns&quot;&gt;</code>, etc.
These divs will automatically stack instead of being shown side by side when the browser gets small enough, enabling a nice responsive layout.
I use this whenever I need to place items horizontally.</p>
<p><strong>Note:</strong> You have to add:</p>
<p><code> &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;</code></p>
<p>to get this working properly for mobile devices.</p>
<h2 id="notes-on-some-css-styling-i-use">Notes on some CSS styling I use</h2>
<p>I won&rsquo;t go into too much detail into the styling that I use, but I do want to mention a few things.
First, if you want to learn how I wrote the responsive, navigation menu that I use for mobile, <a href="/posts/mobile_navbar/">see my other post</a>.
The colors for my website are selected from the <a href="https://github.com/morhetz/gruvbox">Gruvbox color scheme</a>, shown below:</p>
<figure><img src="/img/gruvbox_scheme.png"
    alt="Gruvbox dark color scheme (I use it on everything), source" width="100%"><figcaption>
      <p>Gruvbox dark color scheme (I use it on everything), <a href="https://github.com/morhetz/gruvbox">source</a></p>
    </figcaption>
</figure>

<p>Since I probably am the only person that will actually be browsing my website, I want some sort of consistency between my terminal and my site.
For fonts, I decided to copy <a href="https://github.com/oxalorg/sakura">Sakura CSS</a> since those fonts looked very nice.
If you have any questions about how I style a specific element shoot me an email or just read through the css stylesheet!</p>
<h2 id="using-hugo-to-fill-in-content">Using Hugo to fill in content</h2>
<p>Now here comes the final step, which is utilizing Hugo.
I again won&rsquo;t write the full guide on how to use Hugo.
You can check out the <a href="https://gohugo.io/getting-started/">official Hugo guide</a> for how to setup Hugo and some basic concepts.
You can also check out the intro to Hugo by <a href="https://videos.lukesmith.xyz/w/oz4VV8SrnTEACCndxMASZH">Luke Smith</a>.
I didn&rsquo;t actually use this video to learn Hugo, but his stuff is usually pretty good so if video format works better for you maybe you can try that.
The primary uses I have for Hugo are:</p>
<ol>
<li>Listing posts</li>
<li>Tagging</li>
<li>Table of Contents</li>
</ol>
<p>To me these three topics are the biggest strengths of Hugo and justify the hours spent learning this new technology.
So lets address each of these in order:</p>
<h3 id="1-listing-posts">1. Listing posts</h3>
<p>By default, for each of the directories containing .md files (such as content/posts) Hugo will create a list page containing all posts within that directory.
If you click on either the &ldquo;Posts&rdquo; or &ldquo;Recipes&rdquo; link at the top of this website you will see what such a page looks like.
The one thing that wasn&rsquo;t as clear was how to include something like your five most recent posts on the front page.
I had the additional requirement that I only wanted posts from the actual &ldquo;Posts&rdquo; directory and not all posts from my site.
Specifically I didn&rsquo;t want my homepage including my latest recipes.
The solution is pretty simple, is shown below, and should be included in your base <code>index.html</code> at <code>/path/to/site/themes/{theme}/layout/index.html</code>:</p>





<pre tabindex="0"><code>{{ range ( where .Site.RegularPages &#34;Type&#34; &#34;posts&#34; | first 5 ) }}
       &lt;a href=&#34;{{ .Permalink }}&#34;&gt;
           &lt;h4&gt;{{ .Params.title }}&lt;/h4&gt;
           &lt;p style=&#34;font-size:1.6rem&#34;&gt;{{ dateFormat &#34;Jan 2, 2006&#34; .Date }} &lt;/p&gt;
           &lt;p style=&#34;font-size:1.8rem&#34;&gt;{{.Summary }}&lt;/p&gt;
       &lt;/a&gt;
{{end}}</code></pre><p>You will notice that the important part is the range statement which selects only pages with <code>Type &quot;posts&quot;</code> and selects the first five of them.
The rest of the code pulls out the various frontmatter of the post being display.
I like to show the date of the post as well as a brief summary.</p>
<h3 id="2-tagging">2. Tagging</h3>
<p>The full guide to taxonomies is <a href="https://gohugo.io/templates/taxonomy-templates/">on the Hugo site</a>.
I use two types of taxonomies that I define in my config.yaml:</p>





<pre tabindex="0"><code>taxonomies:
  tag: &#34;tags&#34;
  topic: &#34;topics&#34;</code></pre><p>The format for a taxonomy is that you have to specify the taxonomy as the key and the plural of the taxonomy as the value.
I use the <code>tags</code> taxonomy for organizing my recipes and the <code>topics</code> taxonomy to organize my posts.
You can list all values for a specific taxonomy in the list page by including the following code in your <code>list.html</code> for the specific topic.
Each value for the taxonomy will link to a page that lists all post with that specific value.
The example below lists the <code>topics</code> taxonomy for my posts, so this is included in <code>list.html</code> at <code>themes/personal/layout/posts/list.html</code>:</p>





<pre tabindex="0"><code>{{ range .Site.Taxonomies.topics }}
    &lt;a href=&#34;{{ .Page.Permalink }}&#34;&gt;{{ .Page.Title }}&lt;/a&gt; {{ .Count }} ·
{{ end }}</code></pre><h3 id="3-table-of-contents">3. Table of Contents</h3>
<p>This is another neat little feature that I really enjoy from Hugo.
First, I always use <code>##</code> to denote section headings while <code>#</code> is used only for the page title.
To ensure the Hugo table of contents captures the hierarchy correctly, I set the following code in my <code>config.yaml</code>:</p>





<pre tabindex="0"><code>markup: 
tableOfContents:
  startLevel: 2</code></pre><p>The table of contents command creates a <code>&lt;nav Id=&quot;TableOfContents&quot;&gt;</code> element which you can then style.
I also want the table of contents to show only when I have <code>toc: true</code> in the pages frontmatter.
This can be done pretty simply by adding the following code to your <code>single.html</code>:</p>





<pre tabindex="0"><code>{{ if .Params.toc }}
    {{ .TableOfContents }}
{{ end }}</code></pre><h2 id="conclusions">Conclusions</h2>
<p>I hope that this provides a decent enough introduction into what I&rsquo;m using to keep my site looking modern while remaining minimal with regards to size.
If you haven&rsquo;t heard of Skeleton CSS before, you should definitely check it out in more detail, especially if you are linking to create a simple and responsive site that isn&rsquo;t full of endless bloat like some of these bigger CSS frameworks.
I also highly recommend Hugo to generate static sites as it has a lot of useful functionality.
As always, shoot me an email with any thoughts, comments, or to point out my mistakes.
Thanks for reading!</p>
]]></content:encoded></item><item><title>Work featured on San Diego Supercomputer Center website</title><link>https://www.alexselimov.com/posts/xsede_post/</link><pubDate>Mon, 14 Nov 2022 23:24:18 -0500</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/posts/xsede_post/</guid><description>&lt;p>&lt;a href="https://www.sdsc.edu/News%20Items/PR20221010_nanolayer_materials.html">My work has been featured on the San Diego Supercomputer Center website!&lt;/a> This post highlights my work published with title:&lt;/p>
&lt;p>&lt;a href="https://www.alexselimov.com/publications/interdiffusion">&amp;ldquo;Effects of interdiffusion on shear response of semi-coherent {111} interfaces in Ni/Cu&amp;rdquo;&lt;/a>&lt;/p>
&lt;p>which was conducted using XSEDE allocation TG-MSS150010. XSEDE resources were critical for running these simulations as it required significant computational resources.&lt;/p></description><content:encoded><![CDATA[<p><a href="https://www.sdsc.edu/News%20Items/PR20221010_nanolayer_materials.html">My work has been featured on the San Diego Supercomputer Center website!</a> This post highlights my work published with title:</p>
<p><a href="/publications/interdiffusion">&ldquo;Effects of interdiffusion on shear response of semi-coherent {111} interfaces in Ni/Cu&rdquo;</a></p>
<p>which was conducted using XSEDE allocation TG-MSS150010. XSEDE resources were critical for running these simulations as it required significant computational resources.</p>
]]></content:encoded></item><item><title>Showcase</title><link>https://www.alexselimov.com/showcase/</link><pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/showcase/</guid><description>&lt;p>This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.&lt;/p></description><content:encoded><![CDATA[<p>This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.</p>
<h2 id="headings">Headings</h2>
<p>The following HTML <code>&lt;h1&gt;</code>—<code>&lt;h6&gt;</code> elements represent six levels of section headings. <code>&lt;h1&gt;</code> is the highest section level while <code>&lt;h6&gt;</code> is the lowest.</p>
<h1 id="h1">H1</h1>
<h2 id="h2">H2</h2>
<h3 id="h3">H3</h3>
<h3 id="h4">H4</h3>
<h4 id="h5">H5</h4>
<h5 id="h6">H6</h5>
<h2 id="paragraph">Paragraph</h2>
<p>Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.</p>
<p>Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.</p>
<h2 id="images">Images</h2>
<p><img src="/img/terminal-theme.png" alt="Terminal Theme Preview"></p>
<h3 id="figure-with-a-caption">Figure with a caption</h3>
<figure><img src="/img/terminal-theme.png"
    alt="Terminal Theme Preview"><figcaption>
      <p>Terminal Theme Preview</p>
    </figcaption>
</figure>

<h2 id="blockquotes">Blockquotes</h2>
<p>The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a <code>footer</code> or <code>cite</code> element, and optionally with in-line changes such as annotations and abbreviations.</p>
<h3 id="blockquote-without-attribution">Blockquote without attribution</h3>
<blockquote>
<p>Tiam, ad mint andaepu dandae nostion secatur sequo quae.
<strong>Note</strong> that you can use <em>Markdown syntax</em> within a blockquote.</p></blockquote>
<h3 id="blockquote-with-attribution">Blockquote with attribution</h3>
<blockquote>
<p>Don&rsquo;t communicate by sharing memory, share memory by communicating.<br>
— <cite>Rob Pike<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></cite></p></blockquote>
<h2 id="buttons-and-links">Buttons and links</h2>
<p><button>Button</button>
<a href="">Link</a>
<a href="" class="button inline">Link</a></p>
<h2 id="tables">Tables</h2>
<p>Tables aren&rsquo;t part of the core Markdown spec, but Hugo supports supports them out-of-the-box.</p>
<table>
  <thead>
      <tr>
          <th>Name</th>
          <th>Age</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bob</td>
          <td>27</td>
      </tr>
      <tr>
          <td>Alice</td>
          <td>23</td>
      </tr>
  </tbody>
</table>
<h3 id="inline-markdown-within-tables">Inline Markdown within tables</h3>
<table>
  <thead>
      <tr>
          <th>Italics</th>
          <th>Bold</th>
          <th>Code</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><em>italics</em></td>
          <td><strong>bold</strong></td>
          <td><code>code</code></td>
      </tr>
  </tbody>
</table>
<h2 id="forms">Forms</h2>
<fieldset>
  <input type="text" placeholder="Type something" /><br />
  <input type="number" placeholder="Insert number" /><br />
  <input type="text" value="Input value" /><br />
  <select>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
    <option value="3">Option 3</option>
  </select><br />
  <textarea placeholder="Insert a comment..."></textarea><br />
  <input type="checkbox" /> I understand<br />
  <button type="submi">Submit</button>
</fieldset>
<h2 id="code-blocks">Code Blocks</h2>
<h3 id="code-block-with-backticks">Code block with backticks</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">&lt;!doctype html&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;utf-8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Example HTML5 Document<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Test<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></div><h3 id="code-block-indented-with-four-spaces">Code block indented with four spaces</h3>
<pre><code>&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;title&gt;Example HTML5 Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;p&gt;Test&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h3 id="code-block-with-hugos-internal-highlight-shortcode">Code block with Hugo&rsquo;s internal highlight shortcode</h3>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">&lt;!doctype html&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;utf-8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Example HTML5 Document<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Test<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></div>
<h3 id="code-block-with-custom-built-in---code---shortcode">Code block with custom built-in <code>{{ &lt; code &gt; }}</code> shortcode</h3>



<p><strong>Hey, this is a code block title</strong></p>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nt">pre</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="mh">#1a1a1d</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="k">padding</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="k">border-radius</span><span class="p">:</span> <span class="mi">8</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="k">font-size</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="k">overflow</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="err">@media</span> <span class="err">(--phone)</span> <span class="err">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">white-space</span><span class="p">:</span> <span class="kc">pre-wrap</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="k">word-wrap</span><span class="p">:</span> <span class="kc">break-word</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nt">code</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">background</span><span class="p">:</span> <span class="kc">none</span> <span class="cp">!important</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="k">color</span><span class="p">:</span> <span class="mh">#ccc</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="k">font-size</span><span class="p">:</span> <span class="kc">inherit</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="err">}</span></span></span></code></pre></div>

<h2 id="list-types">List Types</h2>
<h3 id="ordered-list">Ordered List</h3>
<ol>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ol>
<h3 id="unordered-list">Unordered List</h3>
<ul>
<li>List item</li>
<li>Another item</li>
<li>And another item</li>
</ul>
<h3 id="nested-list">Nested list</h3>
<ul>
<li>Fruit
<ul>
<li>Apple</li>
<li>Orange</li>
<li>Banana</li>
</ul>
</li>
<li>Dairy
<ul>
<li>Milk</li>
<li>Cheese</li>
</ul>
</li>
</ul>
<h2 id="other-elements--abbr-sub-sup-kbd-mark">Other Elements — abbr, sub, sup, kbd, mark</h2>
<p><abbr title="Graphics Interchange Format">GIF</abbr> is a bitmap image format.</p>
<p>H<sub>2</sub>O</p>
<p>X<sup>n</sup> + Y<sup>n</sup> = Z<sup>n</sup></p>
<p>Press <kbd>CTRL</kbd>+<kbd>ALT</kbd>+<kbd>Delete</kbd> to end the session.</p>
<p>Most <mark>salamanders</mark> are nocturnal, and hunt for insects, worms, and other small creatures.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>The above quote is excerpted from Rob Pike&rsquo;s <a href="https://www.youtube.com/watch?v=PAAkCSZUG1c">talk</a> during Gopherfest, November 18, 2015.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded></item><item><title/><link>https://www.alexselimov.com/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/cv/</guid><description>&lt;h1 id="alex-selimov">Alex Selimov&lt;/h1>
&lt;p>&lt;strong>&lt;a href="mailto:alex@alexselimov.com">alex@alexselimov.com&lt;/a> · &lt;a href="https://alexselimov.com">https://alexselimov.com&lt;/a>&lt;/strong>&lt;/p>
&lt;h2 id="skills">Skills&lt;/h2>
&lt;ul>
&lt;li>Programming Languages: Python, C++, Rust, Java, Fortran, Bash&lt;/li>
&lt;li>Algorithm design, data structure design, runtime complexity analysis&lt;/li>
&lt;li>High Performance Computing: Message Passing Interface (MPI), OpenMP, C++17 parallelism, Rayon, Python multithreading&lt;/li>
&lt;li>Proficient in Linux environments on desktop, personal server, and computing cluster architectures.&lt;/li>
&lt;li>Knowledge of product development tools such as git, Docker, CI/CD pipelines, JIRA, and Agile workflow.&lt;/li>
&lt;li>Expertise with development and profiling tools: Valgrind, gdb, gprof, Intel VTune profiler, tau profiler.&lt;/li>
&lt;li>Technical writing abilities which resulted in 8 published journal articles and creation of software specifications/documentation.&lt;/li>
&lt;/ul>
&lt;h2 id="experience">Experience&lt;/h2>
&lt;p>&lt;strong>UKG&lt;/strong>, Atlanta&lt;br>
&lt;em>Software Engineer (May 2025 &amp;ndash; Present)&lt;/em>&lt;/p></description><content:encoded><![CDATA[<h1 id="alex-selimov">Alex Selimov</h1>
<p><strong><a href="mailto:alex@alexselimov.com">alex@alexselimov.com</a> · <a href="https://alexselimov.com">https://alexselimov.com</a></strong></p>
<h2 id="skills">Skills</h2>
<ul>
<li>Programming Languages: Python, C++, Rust, Java, Fortran, Bash</li>
<li>Algorithm design, data structure design, runtime complexity analysis</li>
<li>High Performance Computing: Message Passing Interface (MPI), OpenMP, C++17 parallelism, Rayon, Python multithreading</li>
<li>Proficient in Linux environments on desktop, personal server, and computing cluster architectures.</li>
<li>Knowledge of product development tools such as git, Docker, CI/CD pipelines, JIRA, and Agile workflow.</li>
<li>Expertise with development and profiling tools: Valgrind, gdb, gprof, Intel VTune profiler, tau profiler.</li>
<li>Technical writing abilities which resulted in 8 published journal articles and creation of software specifications/documentation.</li>
</ul>
<h2 id="experience">Experience</h2>
<p><strong>UKG</strong>, Atlanta<br>
<em>Software Engineer (May 2025 &ndash; Present)</em></p>
<ul>
<li>Worked as backend engineer on notifications as a service using a microservice architecture built on top Java, SpringBoot, Kafka, RabbitMQ, MongoDB, Splunk, and Grafana technologies.</li>
<li>Implemented improved observability for services to reduce service downtime.</li>
<li>Acted as a Security Champion and addressed security vulnerabilities in existing code based on SAST and SCA scans performed using CXOne Checkmarx.</li>
<li>Led implementation of testing services for web push notification services.</li>
<li>Assisted in development of MCP server and LLM chatbot proof-of-concept to act as an internal assistant for providing support to other UKG teams.</li>
</ul>
<p><strong>SpaceWorks Enterprises</strong>, Atlanta<br>
<em>Senior Software Developer (January 2024 &ndash; April 2025)</em></p>
<ul>
<li>Lead development and maintainer role for commercial off-the-shelf (COTS) software products as well as NASA and NAVAIR programs in Rust and Python.</li>
<li>Led development of modular and extensible simulation libraries for modeling applications including multi-body six-degree-of-freedom simulations, state-space linear simulations for control system design, differential evolution optimization, among others.</li>
<li>Improved mesh based calculations from <strong>~1 hour to ~1 minute</strong> per analysis through improved data structure and algorithm design.</li>
<li>Implemented multi-threading for accelerating simulation analysis and for asynchronous execution.</li>
<li>Developed equilibrium gas composition solver for different stages of a rocket engine cycle with <strong>order-of-magnitude improved speed compared to legacy approach</strong>.</li>
<li>Product owner for COTS product including final approval of merge requests, interfacing with customers for sales and technical support, and helping to develop software roadmaps.</li>
<li>Developed and maintained CI/CD pipelines for COTS products using Gitlab runners and docker containers.</li>
<li>Mentored junior developers in idiomatic Rust and software architecture.</li>
</ul>
<p><strong>Third Wave Systems</strong>, Minnesota<br>
<em>Computational Mechanics Engineer (December 2022 &ndash; January 2024)</em></p>
<ul>
<li>Worked in an Agile team on a variety of projects requiring fast context switching to implement cutting edge functionality in C++, Fortran, and Python.</li>
<li>Worked on large legacy C++ FEA code bases to add new functionality as well as address subtle legacy bugs resulting from race conditions, invalid memory access, and incorrect usage of programming language built-ins.</li>
<li>Refactored core solvers utilizing an Octree data structure for adaptive mesh refinement, utilizing OpenMP and C++17 built in multi-threading, resulting in <strong>90% reduction in simulation time</strong>.</li>
<li>Implemented improved force models for drilling through addition of analytical equations for elastic indentation, <strong>which reduced error by 10% relative to experiments</strong>.</li>
<li>Led team members in implementation of machine learning analysis in Python requiring accurate effort estimation and selection of functionality based on effort/risk to reward.</li>
<li>Mentored junior developers in idiomatic Python and machine learning concepts.</li>
<li>Automated manual simulation creation and analysis workflows using Python, leveraging active learning based adaptive sampling, to reduce manual effort by engineers and <strong>reduce usage of compute resources by ~80%</strong>.</li>
</ul>
<p><strong>McDowell Research Group</strong>, Dr. David McDowell, Georgia Tech<br>
<em>Graduate Research Assistant (August 2017 &ndash; December 2022)</em></p>
<ul>
<li>Developed and extended Concurrent Atomistic-Continuum (CAC) simulation toolkit involving the development of a coupled finite element method and classical many-body molecular dynamics simulation tool in C++ and Fortran.</li>
<li>Developed a series of Python pipelines for analyzing simulations and visualization of simulation results.</li>
<li>Refactored significant portions of the code to <strong>reduce simulation run times by 60%</strong> through design of new algorithms and improved implementation of communication subroutines utilizing MPI.</li>
<li>Profiled and tuned software performance for high performance computing clusters including implementing code structure changes enabling improved compiler optimizations and addressing MPI communication bottlenecks.</li>
<li>Worked independently on self-guided research topics while also collaborating with external sources such as Sandia National Lab and University of Florida.</li>
<li><strong>Authored three published journal articles and four conference presentations</strong>.</li>
</ul>
<p><strong>Mechanics of Materials Organization</strong>, Dr. Xiaowang Zhou., Sandia National Lab<br>
<em>Intern - Engineering Sciences Summer institute (May 2021 &ndash; August 2021)</em></p>
<ul>
<li>Restructured simulation toolkit codebase to abide by an object-oriented programming paradigm to ease addition of functionality.</li>
<li>Worked on the development of finite temperature CAC simulations through design of novel finite elements.</li>
<li>Developed methods for pressure controlled CAC simulations.</li>
</ul>
<h2 id="education">Education</h2>
<ul>
<li><strong>Georgia Institute of Technology</strong> (North Avenue, Atlanta, GA 30332)<br>
PhD in Materials Science and Engineering (August 2017 - December 2022)</li>
<li><strong>University of Central Florida</strong> (4000 Central Florida Blvd, Orlando, FL 32816)<br>
B.S. in Mechanical Engineering (August 2013 - December 2016)<br>
Bachelor&rsquo;s Thesis: Characterization of Dispersion and Residual Stress in Nanoparticle Reinforced Hybrid Carbon Fiber Composites</li>
</ul>
<h2 id="publications">Publications:</h2>
<ul>
   
   <li>Selimov, A., Chu, K., &amp; McDowell, D. (2022). Effects of interdiffusion on shear response of semi-coherent {111} interfaces in Ni/Cu. <em>International Journal of Plasticity</em> 157, 103393  <a href=https://www.alexselimov.com/manuscripts/selimov_interdiffusion.pdf>[Link]</a></li>

   <li>Selimov, A., Chu, K., &amp; McDowell, D. L. (2022). Coarse-grained atomistic modeling of dislocations and generalized crystal plasticity. <em>Journal of Micromechanics and Molecular Physics</em> 7(02), 103-125.  <a href=https://www.worldscientific.com/doi/abs/10.1142/S2424913021420133>[Link]</a></li>

   <li>Selimov, A., Xu, S., Chen, Y., &amp; McDowell, D. (2021). Lattice dislocation induced misfit dislocation evolution in semi-coherent {111} bimetal interfaces. <em>Journal of Materials Research</em> 36, 2763-2778.  <a href=https://www.alexselimov.com/manuscripts/JMRS-D-21-00017_R1.pdf>[Link]</a></li>

   <li>Selimov, A., Jahan, S. A., Barker, E., Dackus, P., Carolan, D., Taylor, A., Raghavan, S. (2018). Silane functionalization effects on dispersion of alumina nanoparticles in hybrid carbon fiber composites. <em>Applied optics</em> 57(23), 6671-6678.  <a href=https://opg.optica.org/ao/abstract.cfm?uri&#61;ao-57-23-6671>[Link]</a></li>

   <li>Imad Hanhan, Alex P Selimov, Declan Carolan, Ambrose Taylor, Seetha Raghavan (2017). Quantifying alumina nanoparticle dispersion in hybrid carbon fiber composites using photoluminescent spectroscopy. <em>Applied Spectroscopy</em> 71(2), 258-266  <a href=https://arc.aiaa.org/doi/pdf/10.2514/6.2016-1413>[Link]</a></li>

   <li>Selimov, A. P., Hoover, R., Fouliard, Q., Manero, A. C., Dackus, P., Carolan, D., … Raghavan, S. (2017). Characterization of hybrid carbon fiber composites using photoluminescence spectroscopy. <em>58th AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference</em> , 83  <a href=https://arc.aiaa.org/doi/pdf/10.2514/6.2017-0123>[Link]</a></li>

   <li>Manero II, A., Selimov, A., Fouliard, Q., Knipe, K., Wischek, J., Meid, C., … Raghavan, S. (2017). Piezospectroscopic evaluation and damage identification for thermal barrier coatings subjected to simulated engine environments. <em>Surface and Coatings Technology</em> 323, 30-38.  <a href=https://www.sciencedirect.com/science/article/abs/pii/S0257897216309410>[Link]</a></li>

   <li>Hanhan, I., Selimov, A. P., Carolan, D., Taylor, A., &amp; Raghavan, S (2016). Characterizing Mechanical Properties of Hybrid Alumina Carbon Fiber Composites with Piezospectroscopy. <em>57th AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference</em> , 258-266 </li>

</ul>

<h2 id="presentations">Presentations</h2>
<ul>
    
    <li>Selimov, A., Chen, Y., McDowell, D. L. (2022-10-11) Concurrent Atomistic-Continuum studies of confined layer slip in Cu/Ni nanolaminates. The 10th International Conference on Multiscale Materials Modeling  
        <a href=https://www.alexselimov.com/presentations/MMM_2022_AlexSelimov.pptx>[Link]</a></li>
    
    <li>Selimov, A., Chu, K., Chen, Y., McDowell, D. L. (2022-10-06) Effects of interdiffusion on Cu/Ni semi-coherent interface properties. In Grain Boundaries, Interfaces, and Surfaces: Fundamental Structure-Property-Performance Relationships. MS&amp;T22: Materials Science &amp; Technology  
        <a href=https://www.alexselimov.com/presentations/MSNT_2022_AlexSelimov.pptx>[Link]</a></li>
    
    <li>Selimov, A., Xu, S., Chen, Y., McDowell, D. (2020-12-10) Concurrent Atomistic-Continuum Framework for Slip Transfer Across Phase Interfaces In Nanoscale Metallic Multilayer Composites. International Conference on Plasticity, Damage, and Fracture 2020  
        <a href=https://www.alexselimov.com/presentations/IPCDF2019.pptx>[Link]</a></li>
    
    <li>Selimov, A., Chen, Y., McDowell, D. (2019-04-01) Collective Dislocation-Interface Interactions using the Concurrent Atomistic-Continuum Method. International Mechanical Engineering Congress Exposition </li>
    
    <li>Selimov, A. P., Hoover, R., Fouliard, Q., Manero, A. C., Dackus, P., Carolan, D., … Raghavan, S. (2017-01-15) Characterization of hybrid carbon fiber composites using photoluminescence spectroscopy. In 58th AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference </li>
    
</ul>

<h2 id="grants">Grants</h2>
<ul>
<li>Role: Co-PI (PI. David McDowell), Amount: 1,997,041 Service Units <br>
Funding Source: Extreme Science and Engineering Discovery Environment (XSEDE)<br>
Project Title: Concurrent atomistic-continuum simulations of extended scale defect interactions in heterogeneous microstructures (TG-MSS150010)<br>
Funding Period: Jan 1, 2019 - June 30, 2022</li>
</ul>
]]></content:encoded></item><item><title>Projects</title><link>https://www.alexselimov.com/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>alex@alexselimov.com (Alex Selimov)</author><guid>https://www.alexselimov.com/projects/</guid><description>&lt;p>Here are some of the projects I am working or have worked on:&lt;/p>
&lt;p>&lt;strong>Scientific&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://forge.alexselimov.com/aselimov/CAC">CAC ← Implementation of the Concurrent Atomistic Continuum method&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://forge.alexselimov.com/aselimov/CACmb">CACmb ← Model builder for CAC (inspired by atomsk)&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Random&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://forge.alexselimov.com/aselimov/neovim">neovim configs&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/aselimov/PaperPicker.git">PaperPicker ← Use local llms to find relevant arxiv papers&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://forge.alexselimov.com/aselimov/upvoters">upvoters ← Rust backend with postgres to handle anonymous upvotes on this blog&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Here are some of the projects I am working or have worked on:</p>
<p><strong>Scientific</strong></p>
<ul>
<li><a href="https://forge.alexselimov.com/aselimov/CAC">CAC ← Implementation of the Concurrent Atomistic Continuum method</a></li>
<li><a href="https://forge.alexselimov.com/aselimov/CACmb">CACmb ← Model builder for CAC (inspired by atomsk)</a></li>
</ul>
<p><strong>Random</strong></p>
<ul>
<li><a href="https://forge.alexselimov.com/aselimov/neovim">neovim configs</a></li>
<li><a href="https://github.com/aselimov/PaperPicker.git">PaperPicker ← Use local llms to find relevant arxiv papers</a></li>
<li><a href="https://forge.alexselimov.com/aselimov/upvoters">upvoters ← Rust backend with postgres to handle anonymous upvotes on this blog</a></li>
</ul>
]]></content:encoded></item></channel></rss>