<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on cephei8's site</title><link>https://cephei8.dev/blog/</link><description>Recent content in Blog on cephei8's site</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cephei8.dev/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Neovim setup for Odin</title><link>https://cephei8.dev/blog/neovim-odin/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/neovim-odin/</guid><description>&lt;p&gt;Recently I have been experimenting with Neovim.&lt;br /&gt;
This post is about how to set it up for Odin programming.&lt;/p&gt;
&lt;p&gt;I will cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;syntax highlighting&lt;/li&gt;
&lt;li&gt;building/testing/formatting Odin code from Neovim&lt;/li&gt;
&lt;li&gt;LSP&lt;/li&gt;
&lt;li&gt;autocomplete&lt;/li&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;a href="https://odin-lang.org"&gt;Odin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://github.com/DanielGavin/ols"&gt;ols and odinfmt&lt;/a&gt; (LSP + formatting)&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;tree-sitter-cli&lt;/code&gt; (for installing Odin Tree-sitter grammar)&lt;/li&gt;
&lt;li&gt;Install latest llvm and make sure lldb-dap is accessible (for debugging)&lt;/li&gt;
&lt;li&gt;Set up &lt;a href="https://github.com/folke/lazy.nvim"&gt;lazy.nvim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="syntax-highlighting"&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;I recommend using Tree-sitter for syntax highlighting.&lt;/p&gt;</description></item><item><title>My Large Array of Things in Odin</title><link>https://cephei8.dev/blog/large-array-odin/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/large-array-odin/</guid><description>&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;If you are not familiar with the concept of Large Array of Things, I highly recommend watching &lt;a href="https://youtu.be/ShSGHb65f3M?si=yp0go2e1-pHUlJCY"&gt;Avoiding Modern C++ | Anton Mikhailov&lt;/a&gt; on Wookash Podcast, both for educational purposes and for inspiration.&lt;br /&gt;
In two words - it&amp;rsquo;s an array of fat structs, with intrusive data structures to implement hierarchies.&lt;/p&gt;
&lt;p&gt;In this post I will show my implementation of the concept in Odin, demonstrating some nice features that Odin has to offer.
Particularly:&lt;/p&gt;</description></item><item><title>Doom Emacs setup for Odin</title><link>https://cephei8.dev/blog/doom-emacs-odin/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/doom-emacs-odin/</guid><description>&lt;p&gt;Doom Emacs, as expected, can be made into great &amp;ldquo;IDE&amp;rdquo; for Odin.&lt;/p&gt;
&lt;p&gt;This post will cover setting up syntax highlighting, LSP, build command, and debugger.&lt;/p&gt;
&lt;h2 id="syntax-highlighting"&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;Odin Tree-sitter mode provides a nice syntax highlighting.&lt;/p&gt;
&lt;p&gt;Add the following to &lt;code&gt;packages.el&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; packages.el&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(package! odin-ts-mode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :recipe (:host github :repo &lt;span style="color:#e6db74"&gt;&amp;#34;Sampie159/odin-ts-mode&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And &lt;code&gt;config.el&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; config.el&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(use-package! odin-ts-mode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :mode &lt;span style="color:#e6db74"&gt;&amp;#34;\\.odin\\&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Odin Tree-sitter grammar needs to be installed separately.&lt;/p&gt;
&lt;p&gt;Add the following to &lt;code&gt;config.el&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Making user-facing DSL with goyacc</title><link>https://cephei8.dev/blog/dsl-goyacc/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/dsl-goyacc/</guid><description>&lt;p&gt;One of the core features of my &lt;a href="https://github.com/cephei8/greener"&gt;Greener&lt;/a&gt; project is user-facing DSL for querying database with test results.&lt;br /&gt;
For example, &lt;code&gt;status = &amp;quot;fail&amp;quot; AND name = &amp;quot;login_test&amp;quot;&lt;/code&gt; fetches results of the &amp;ldquo;login_test&amp;rdquo; test that failed.&lt;/p&gt;
&lt;p&gt;Surprisingly, Go&amp;rsquo;s port of classic YACC parser generator was a relatively simple and straightforward way to parse user queries to further convert them in SQL queries.&lt;/p&gt;
&lt;p&gt;Note: this post covers a very simplified approach for educational purposes.&lt;/p&gt;</description></item><item><title>Go's Bun ORM - alternative to Python's SQLAlchemy</title><link>https://cephei8.dev/blog/bun-sqlalchemy-alternative/</link><pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/bun-sqlalchemy-alternative/</guid><description>&lt;p&gt;Initially, my &lt;a href="https://github.com/cephei8/greener"&gt;Greener&lt;/a&gt; project was implemented in Python.&lt;br /&gt;
When I decided to switch to Go, I started looking for Go ORM library.
In Python the de facto standard is &lt;a href="https://www.sqlalchemy.org"&gt;SQLAlchemy&lt;/a&gt;.
I liked SQLAlchemy and was hoping to find something similar for Go.&lt;/p&gt;
&lt;p&gt;Specifically, I was looking for the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Actively maintained&lt;/li&gt;
&lt;li&gt;Support for different databases (in the sense that same code works with different databases)&lt;/li&gt;
&lt;li&gt;ORM layer (for simple queries)&lt;/li&gt;
&lt;li&gt;SQL eDSL (for complex queries)&lt;/li&gt;
&lt;li&gt;Support for dynamic queries (e.g. variable set of query conditions etc.)&lt;/li&gt;
&lt;li&gt;Migration system&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I settled on &lt;a href="https://bun.uptrace.dev"&gt;Bun&lt;/a&gt; - while not being as ergonomic as SQLAlchemy
(not Bun&amp;rsquo;s fault, I think it&amp;rsquo;s done a great job given the programming language)
and not ticking all the boxes, it still covered the most important parts.&lt;/p&gt;</description></item><item><title>Greener: lean and mean test result explorer</title><link>https://cephei8.dev/blog/introducing-greener/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate><guid>https://cephei8.dev/blog/introducing-greener/</guid><description>&lt;p&gt;Test frameworks usually produce custom test output by default (along with exit code).&lt;br /&gt;
For example, pytest (test framework for Python) gives something like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;tests/test_apikey_controller.py::test_create[db_sqlite] PASSED [ 25%]
tests/test_apikey_controller.py::test_get[db_sqlite] PASSED [ 50%]
tests/test_apikey_controller.py::test_list[db_sqlite] PASSED [ 75%]
tests/test_apikey_controller.py::test_delete[db_sqlite] PASSED [100%]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is fine if a number of tests is small, or we mostly care about overall test result - if all the tests in the test session passed.&lt;/p&gt;
&lt;p&gt;However, once we need to investigate test failure, especially for larger/longer test sessions (e.g. end-to-end tests), often the following questions need answers:&lt;/p&gt;</description></item></channel></rss>