<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>The Negation</title><link>https://www.thenegation.com/</link><description>Recent content on The Negation</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 31 May 2025 22:06:31 +0000</lastBuildDate><atom:link href="https://www.thenegation.com/index.xml" rel="self" type="application/rss+xml"/><item><title>I Blogged Every Day for a Month – Again</title><link>https://www.thenegation.com/posts/blog-challenge-take-two/</link><pubDate>Sat, 31 May 2025 22:06:31 +0000</pubDate><guid>https://www.thenegation.com/posts/blog-challenge-take-two/</guid><description>&lt;p&gt;Today marks the final day of my second month-long blogging challenge. The first
was in &lt;a href="https://www.thenegation.com/posts/blogging-challenge/"&gt;August&lt;/a&gt; last year. This one, in May, felt different &amp;ndash; but just as
transformative.&lt;/p&gt;</description></item><item><title>Daily Z Reports and Weekly Reviews</title><link>https://www.thenegation.com/posts/daily-z-report-weekly-review/</link><pubDate>Fri, 30 May 2025 23:30:13 +0000</pubDate><guid>https://www.thenegation.com/posts/daily-z-report-weekly-review/</guid><description>&lt;p&gt;This is not about improving productivity, but rather a simple but bottom-up hack
to improve personal awareness and accountability and extend it to the team.
Productivity should be a natural byproduct of that.&lt;/p&gt;</description></item><item><title>Cross-Compiling Haskell under NixOS with Docker</title><link>https://www.thenegation.com/posts/cross-compile-haskell/</link><pubDate>Thu, 29 May 2025 23:55:54 +0000</pubDate><guid>https://www.thenegation.com/posts/cross-compile-haskell/</guid><description>&lt;p&gt;I learned how to cross-compile Haskell projects under NixOS using Docker images
for ARM architectures, and how to run them under emulation on &lt;code&gt;x86_64&lt;/code&gt; hosts.&lt;/p&gt;</description></item><item><title>The Terminal State of Mind</title><link>https://www.thenegation.com/posts/the-terminal-state-of-mind/</link><pubDate>Wed, 28 May 2025 21:24:28 +0000</pubDate><guid>https://www.thenegation.com/posts/the-terminal-state-of-mind/</guid><description>&lt;p&gt;I use the terminal. Not because I am a command-line wizard or particularly
efficient with it, but because the GUI has never given me the rhythm and flow I
need.&lt;/p&gt;</description></item><item><title>NixOS Rebuilds, Upgrades and Generation Diffs</title><link>https://www.thenegation.com/posts/nixos-rebuilds-and-upgrades/</link><pubDate>Tue, 27 May 2025 21:20:42 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-rebuilds-and-upgrades/</guid><description>&lt;p&gt;Today, I upgraded my NixOS system to the latest version, v25.05. It went
smoothly. I just want to report my experience here.&lt;/p&gt;</description></item><item><title>Boring on Purpose: Bold Moves in Internal Tooling</title><link>https://www.thenegation.com/posts/boring-and-bold/</link><pubDate>Mon, 26 May 2025 23:56:04 +0000</pubDate><guid>https://www.thenegation.com/posts/boring-and-bold/</guid><description>&lt;p&gt;Boring work is often the most effective work. It is the kind of work that might
lead us to understand patterns and solve problems that we did not even know we
had.&lt;/p&gt;</description></item><item><title>A Glimpse into My Shell</title><link>https://www.thenegation.com/posts/shell-history/</link><pubDate>Sun, 25 May 2025 23:20:42 +0000</pubDate><guid>https://www.thenegation.com/posts/shell-history/</guid><description>&lt;p&gt;A glimpse into my shell history reveals the tools I rely on daily. These are not
curated &amp;ndash; just raw, frequent commands logged over time.&lt;/p&gt;</description></item><item><title>Data Definitions, Not Flowcharts</title><link>https://www.thenegation.com/posts/flowcharts-vs-tables/</link><pubDate>Sat, 24 May 2025 23:43:58 +0000</pubDate><guid>https://www.thenegation.com/posts/flowcharts-vs-tables/</guid><description>&lt;p&gt;Computer programs are best understood in terms of the data they consume, process
and produce. Flowcharts are useful for visualizing control flow, but not for
understanding complexity.&lt;/p&gt;</description></item><item><title>Magic JSON in Haskell</title><link>https://www.thenegation.com/posts/magic-json-haskell/</link><pubDate>Fri, 23 May 2025 21:19:46 +0000</pubDate><guid>https://www.thenegation.com/posts/magic-json-haskell/</guid><description>&lt;p&gt;Among all Haskell libraries I have used, the one I reach for the most is
&lt;a href="https://hackage.haskell.org/package/autodocodec"&gt;autodocodec&lt;/a&gt;. I will explain what it is and what freebies it gives you.&lt;/p&gt;</description></item><item><title>Hacking Haskell with Nix: Two Tricks</title><link>https://www.thenegation.com/posts/quick-haskell-dev-setup/</link><pubDate>Thu, 22 May 2025 22:10:37 +0000</pubDate><guid>https://www.thenegation.com/posts/quick-haskell-dev-setup/</guid><description>&lt;p&gt;I have mentioned a few times in my posts that &lt;a href="https://www.haskell.org/"&gt;Haskell&lt;/a&gt; is my go-to language.
This is true even for small applications which go beyond a simple shell script.&lt;/p&gt;
&lt;p&gt;Hacking Haskell with Nix is an easy and fun way to quickly prototype. I want to
share two tricks that I use.&lt;/p&gt;</description></item><item><title>Hacking with mdBook</title><link>https://www.thenegation.com/posts/mdbook-preprocessing/</link><pubDate>Wed, 21 May 2025 20:35:08 +0000</pubDate><guid>https://www.thenegation.com/posts/mdbook-preprocessing/</guid><description>&lt;p&gt;This post explores how to hack an &lt;a href="https://rust-lang.github.io/mdBook/"&gt;mdBook&lt;/a&gt; project with scripts.&lt;/p&gt;</description></item><item><title>Haskell Project Template with Nix Flakes</title><link>https://www.thenegation.com/posts/haskell-template-flakes/</link><pubDate>Tue, 20 May 2025 21:43:46 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-template-flakes/</guid><description>&lt;p&gt;This post introduces my Haskell project template powered by Nix Flakes &amp;ndash; a
simple setup I use to quickly spin up new Haskell applications.&lt;/p&gt;</description></item><item><title>Deadman Checks in Grafana</title><link>https://www.thenegation.com/posts/grafana-deadman-checks/</link><pubDate>Mon, 19 May 2025 22:17:05 +0000</pubDate><guid>https://www.thenegation.com/posts/grafana-deadman-checks/</guid><description>&lt;p&gt;This post is a quick, technical note on how to set up deadman checks in Grafana
with InfluxDB as the data source, and how to deal with a peculiar case when the
host is not reporting and the alert enters the &lt;em&gt;resolved&lt;/em&gt; state.&lt;/p&gt;</description></item><item><title>Stop Feeling Intimidated by Complexity</title><link>https://www.thenegation.com/posts/embrace-complexity/</link><pubDate>Sun, 18 May 2025 21:19:54 +0000</pubDate><guid>https://www.thenegation.com/posts/embrace-complexity/</guid><description>&lt;p&gt;Let me tell you the conclusion up-front: &lt;em&gt;Complexity is not inherently bad. The
complications are the real enemy.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Choosing A Template Engine: The More Powerful Problem</title><link>https://www.thenegation.com/posts/choosing-template-engine/</link><pubDate>Sat, 17 May 2025 21:49:05 +0000</pubDate><guid>https://www.thenegation.com/posts/choosing-template-engine/</guid><description>&lt;p&gt;Continuing on the topic of template engines, I would like to share my thoughts
on the &lt;em&gt;power&lt;/em&gt; of template engines, and how it relates to the &lt;em&gt;power&lt;/em&gt; of
abstractions in programming.&lt;/p&gt;</description></item><item><title>Thinking in Templates</title><link>https://www.thenegation.com/posts/thinking-in-templates/</link><pubDate>Fri, 16 May 2025 22:30:13 +0000</pubDate><guid>https://www.thenegation.com/posts/thinking-in-templates/</guid><description>&lt;p&gt;I believe that there is value in thinking in templates when it comes to
programming. I will try to explore the concept of templating in general, how it
reveals important patterns in programming, and how it appears in the wild often
in the form of &lt;em&gt;template engines&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>SDK-Driven Development: A Litmus Test for Good Software Design</title><link>https://www.thenegation.com/posts/sdk-driven-development/</link><pubDate>Thu, 15 May 2025 18:23:55 +0000</pubDate><guid>https://www.thenegation.com/posts/sdk-driven-development/</guid><description>&lt;p&gt;This-driven development, that-driven development, and now you should bother with
this other thing?&lt;/p&gt;</description></item><item><title>Why I am Migrating From Zola Back to Hugo</title><link>https://www.thenegation.com/posts/migrate-from-zola-to-hugo/</link><pubDate>Wed, 14 May 2025 23:45:57 +0000</pubDate><guid>https://www.thenegation.com/posts/migrate-from-zola-to-hugo/</guid><description>&lt;p&gt;This post is a summary of my recent decision to go back to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; after using
&lt;a href="https://www.getzola.org/"&gt;Zola&lt;/a&gt;. I also report on how LLM assistants with Web access can aid in such
decisions, not as an authority but as a research assistant.&lt;/p&gt;</description></item><item><title>Code is Liability</title><link>https://www.thenegation.com/posts/code-is-liability/</link><pubDate>Tue, 13 May 2025 23:55:27 +0000</pubDate><guid>https://www.thenegation.com/posts/code-is-liability/</guid><description>&lt;p&gt;While programming, we often aim to avoid repetition. Repetition is boring, and
ironically, much of programming exists to automate boring tasks in the first
place. But repetition is just one symptom of a much deeper problem: Code itself
is a liability.&lt;/p&gt;</description></item><item><title>Build a CLI Emoji Picker with fzf and Nix</title><link>https://www.thenegation.com/posts/nix-fzf-script-tutorial/</link><pubDate>Mon, 12 May 2025 21:10:27 +0000</pubDate><guid>https://www.thenegation.com/posts/nix-fzf-script-tutorial/</guid><description>&lt;p&gt;In my blog post &lt;a href="https://www.thenegation.com/posts/wayland-app-launchers-rofi/"&gt;yesterday&lt;/a&gt;, I mentioned &lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt;. Its simplicity and power make it
a good tool for many scripting tasks. In this post, we will see a practical
example of how to use it in a CLI program and package it with Nix.&lt;/p&gt;</description></item><item><title>Wayland Application Launchers: Stick with Rofi</title><link>https://www.thenegation.com/posts/wayland-app-launchers-rofi/</link><pubDate>Sun, 11 May 2025 23:55:27 +0000</pubDate><guid>https://www.thenegation.com/posts/wayland-app-launchers-rofi/</guid><description>&lt;p&gt;Today is a lazy Sunday, and I did what nobody should do on a Sunday: Spend time
trying to replace something that already works. This time, my victim was &lt;a href="https://github.com/davatorium/rofi"&gt;rofi&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>GitHub Projects My Way</title><link>https://www.thenegation.com/posts/github-projects-my-way/</link><pubDate>Sat, 10 May 2025 22:33:27 +0000</pubDate><guid>https://www.thenegation.com/posts/github-projects-my-way/</guid><description>&lt;p&gt;This post explains why and how I use GitHub for nearly everything. I will also
explain how I use GitHub Actions to automate the creation of issues in my GitHub
Projects.&lt;/p&gt;</description></item><item><title>Time and Truth: Lessons from Tracking My Work with Watson</title><link>https://www.thenegation.com/posts/watson-via-gh/</link><pubDate>Fri, 09 May 2025 23:15:40 +0000</pubDate><guid>https://www.thenegation.com/posts/watson-via-gh/</guid><description>&lt;p&gt;I started using Watson with low expectations. Two and a half years later, it is
still one of the few tools I have not quit. And it taught me a little bit about
how I really spend my time.&lt;/p&gt;</description></item><item><title>Why and How to Patch a Python Package in Nix</title><link>https://www.thenegation.com/posts/patch-python-package-on-nix/</link><pubDate>Thu, 08 May 2025 17:24:26 +0000</pubDate><guid>https://www.thenegation.com/posts/patch-python-package-on-nix/</guid><description>&lt;p&gt;I bumped into an annoying issue today while upgrading my Python dependencies in
a codebase. And I thought it would be a good idea to share the solution with
you. Thanks to &lt;a href="https://nixos.org/"&gt;Nix&lt;/a&gt; for making this kind of fix so straightforward.&lt;/p&gt;</description></item><item><title>Nix-Powered Python Development</title><link>https://www.thenegation.com/posts/nix-powered-python-dev/</link><pubDate>Wed, 07 May 2025 19:11:06 +0000</pubDate><guid>https://www.thenegation.com/posts/nix-powered-python-dev/</guid><description>&lt;p&gt;After a few years of floating from one hack to another, this is my practical
guide to setting up a reasonable Python development environment using Nix flakes
with support for testing, linting, formatting, and LSP-based editor integration.&lt;/p&gt;</description></item><item><title>Nix Flake Templates</title><link>https://www.thenegation.com/posts/nix-flake-templates/</link><pubDate>Tue, 06 May 2025 11:36:39 +0000</pubDate><guid>https://www.thenegation.com/posts/nix-flake-templates/</guid><description>&lt;p&gt;Nix is now central to how I structure my workstation setups and manage
development and production environments across my projects. Over time, I found
myself repeating certain setups. This post is a short note on how I started
working with Nix Flake templates to avoid or reduce this repetition.&lt;/p&gt;</description></item><item><title>Working with OpenTelemetry Metrics</title><link>https://www.thenegation.com/posts/opentelemetry-metrics/</link><pubDate>Mon, 05 May 2025 21:17:22 +0000</pubDate><guid>https://www.thenegation.com/posts/opentelemetry-metrics/</guid><description>&lt;p&gt;I have started adopting &lt;a href="https://opentelemetry.io/"&gt;OpenTelemetry&lt;/a&gt; in my workshop to unify metrics, logs,
and traces. This post explains why &amp;ndash;and how&amp;ndash; I took the first step.&lt;/p&gt;</description></item><item><title>Hold My Data</title><link>https://www.thenegation.com/posts/hold-my-data/</link><pubDate>Sun, 04 May 2025 20:20:29 +0000</pubDate><guid>https://www.thenegation.com/posts/hold-my-data/</guid><description>&lt;p&gt;This post is about data snapshots, backups and archives, why we create and keep
them, and how this entire exercise can be seen from top-down and bottom-up in a
business setting.&lt;/p&gt;</description></item><item><title>Vectorized Data Pipelines</title><link>https://www.thenegation.com/posts/vectorized/</link><pubDate>Sat, 03 May 2025 23:04:29 +0000</pubDate><guid>https://www.thenegation.com/posts/vectorized/</guid><description>&lt;p&gt;This post shows how to use Vector to capture and persist webhook events &amp;ndash; like
those from SendGrid &amp;ndash; into a PostgreSQL database with minimal setup.&lt;/p&gt;</description></item><item><title>Ruff and Ready: Linting Before the Party</title><link>https://www.thenegation.com/posts/migrate-to-ruff/</link><pubDate>Fri, 02 May 2025 14:32:07 +0000</pubDate><guid>https://www.thenegation.com/posts/migrate-to-ruff/</guid><description>&lt;p&gt;In this post, I share why I value linters and formatters, and how I migrate from
traditional Python tools to &lt;a href="https://docs.astral.sh/ruff/"&gt;ruff&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Grafana Webhook Integration with ntfy</title><link>https://www.thenegation.com/posts/grafana-ntfy/</link><pubDate>Thu, 01 May 2025 11:16:05 +0000</pubDate><guid>https://www.thenegation.com/posts/grafana-ntfy/</guid><description>&lt;p&gt;This post explains how to integrate Grafana alerts with the &lt;code&gt;ntfy&lt;/code&gt; notification
service using Grafana&amp;rsquo;s Webhook integration, notification templates, and
&lt;code&gt;ntfy&lt;/code&gt;&amp;rsquo;s templating capabilities.&lt;/p&gt;</description></item><item><title>Completed My Blogging Challenge</title><link>https://www.thenegation.com/posts/blogging-challenge/</link><pubDate>Sat, 31 Aug 2024 17:16:54 +0000</pubDate><guid>https://www.thenegation.com/posts/blogging-challenge/</guid><description>&lt;p&gt;Today marks the end of my monthly blogging challenge. I wrote a blog post every
day for a month. Here is how it went and what I learned.&lt;/p&gt;</description></item><item><title>More Haskell Diagrams: Contribution Graph</title><link>https://www.thenegation.com/posts/haskell-diagrams-plot-calendar/</link><pubDate>Fri, 30 Aug 2024 22:39:46 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-plot-calendar/</guid><description/></item><item><title>Shell Cacophony</title><link>https://www.thenegation.com/posts/shell-cacophony/</link><pubDate>Thu, 29 Aug 2024 20:05:47 +0000</pubDate><guid>https://www.thenegation.com/posts/shell-cacophony/</guid><description>&lt;p&gt;I am using &lt;a href="https://stedolan.github.io/jq/"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/jqnatividad/qsv"&gt;&lt;code&gt;qsv&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/red-data-tools/YouPlot"&gt;&lt;code&gt;uplot&lt;/code&gt;&lt;/a&gt; quite often. This post is
to make sure that you know and use them, too. I hope you will waste as much time
as I do, especially with &lt;a href="https://github.com/red-data-tools/YouPlot"&gt;&lt;code&gt;uplot&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Web Browser Extension Workshop - Part 5</title><link>https://www.thenegation.com/posts/browser-wext-5/</link><pubDate>Wed, 28 Aug 2024 22:12:02 +0000</pubDate><guid>https://www.thenegation.com/posts/browser-wext-5/</guid><description>&lt;p&gt;This is the last post in the series of the Web Browser Extension Workshop. In
this post, we will populate our popup using the service we created in the
previous post.&lt;/p&gt;</description></item><item><title>Web Browser Extension Workshop - Part 4</title><link>https://www.thenegation.com/posts/browser-wext-4/</link><pubDate>Tue, 27 Aug 2024 21:53:14 +0000</pubDate><guid>https://www.thenegation.com/posts/browser-wext-4/</guid><description>&lt;p&gt;This is the fourth part of the Web Browser Extension Workshop series. In this
part, we will populate a database with the OpenGraph information parsed from the
Webpage on active tabs. For this, we will implement a service that we can use
later to query the OpenGraph information as well.&lt;/p&gt;</description></item><item><title>Web Browser Extension Workshop - Part 3</title><link>https://www.thenegation.com/posts/browser-wext-3/</link><pubDate>Mon, 26 Aug 2024 21:53:14 +0000</pubDate><guid>https://www.thenegation.com/posts/browser-wext-3/</guid><description>&lt;p&gt;This is the third part of the series of blog posts about creating a Web browser.
In this part, we will change the extension icon based on the OpenGraph
information parsed from the Webpage on the active tab. We will also refactor the
code by encoding parse results in a better type.&lt;/p&gt;</description></item><item><title>Web Browser Extension Workshop - Part 2</title><link>https://www.thenegation.com/posts/browser-wext-2/</link><pubDate>Sun, 25 Aug 2024 15:42:40 +0000</pubDate><guid>https://www.thenegation.com/posts/browser-wext-2/</guid><description>&lt;p&gt;This is the second part of the series of blog posts about creating a Web browser
extension using &lt;a href="https://wxt.dev"&gt;WXT&lt;/a&gt;. In this part, we will try to read the OpenGraph tags of
the Webpage that is rendered on the active tab.&lt;/p&gt;</description></item><item><title>Web Browser Extension Workshop - Part 1</title><link>https://www.thenegation.com/posts/browser-wext-1/</link><pubDate>Sat, 24 Aug 2024 22:31:40 +0000</pubDate><guid>https://www.thenegation.com/posts/browser-wext-1/</guid><description>&lt;p&gt;I am starting a short series of blog posts about creating a Web browser
extension using &lt;a href="https://wxt.dev"&gt;WXT&lt;/a&gt;. In this first part, we will set up the development
environment and try to read the content of the navigated Webpage or Webpage on
the active tab.&lt;/p&gt;</description></item><item><title>Managing NixOS on DigitalOcean with Colmena</title><link>https://www.thenegation.com/posts/nixos-do-colmena/</link><pubDate>Fri, 23 Aug 2024 21:14:29 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-do-colmena/</guid><description>&lt;p&gt;In this post, we will prepare a &lt;a href="https://www.digitalocean.com"&gt;DigitalOcean&lt;/a&gt; image for &lt;a href="https://nixos.org"&gt;NixOS&lt;/a&gt;, launch a
droplet with it and manage it using &lt;a href="https://colmena.cli.rs"&gt;Colmena&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Plot GeoJSON on Your Blog Posts</title><link>https://www.thenegation.com/posts/cloud-map/</link><pubDate>Thu, 22 Aug 2024 21:50:38 +0000</pubDate><guid>https://www.thenegation.com/posts/cloud-map/</guid><description>&lt;p&gt;If you wonder how to plot GeoJSON data on your blog posts, here is a simple
example. In this blog post, I will show how to plot Microsoft Azure regions on a
map using the Leaflet.js JavaScript library.&lt;/p&gt;</description></item><item><title>Cross-Posting to Hashnode with API</title><link>https://www.thenegation.com/posts/crosspost-api-hashnode/</link><pubDate>Wed, 21 Aug 2024 17:42:49 +0000</pubDate><guid>https://www.thenegation.com/posts/crosspost-api-hashnode/</guid><description>&lt;p&gt;In my previous post, I showed how to cross-post to &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; using its API. In
this post, I will show how to cross-post to &lt;a href="https://hashnode.com"&gt;Hashnode&lt;/a&gt; using its API.&lt;/p&gt;</description></item><item><title>Cross-Posting to Dev.to with API</title><link>https://www.thenegation.com/posts/crosspost-api-devto/</link><pubDate>Tue, 20 Aug 2024 22:54:52 +0000</pubDate><guid>https://www.thenegation.com/posts/crosspost-api-devto/</guid><description>&lt;p&gt;Let&amp;rsquo;s cross-post this blog post to &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; using its API.&lt;/p&gt;</description></item><item><title>Easy GitHub CLI Extensions with Nix</title><link>https://www.thenegation.com/posts/custom-gh-ext/</link><pubDate>Mon, 19 Aug 2024 20:35:24 +0000</pubDate><guid>https://www.thenegation.com/posts/custom-gh-ext/</guid><description>&lt;p&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;) is one of my favourite tools. In addition to its built-in
commands, it allows you to write your own extensions. In this post, I will show
you how to write a simple GitHub CLI extension and how to package it with Nix,
in particular under Nix Home Manager.&lt;/p&gt;</description></item><item><title>Learning to Like Neovim</title><link>https://www.thenegation.com/posts/liking-neovim/</link><pubDate>Sun, 18 Aug 2024 21:43:13 +0000</pubDate><guid>https://www.thenegation.com/posts/liking-neovim/</guid><description>&lt;p&gt;After using Emacs for almost 20 years, usually day-in and day-out, I decided to
give Neovim a try. I have been using Neovim for two months now, and I can say
that I am starting to like it. In this article, I will share my experience of
switching from Emacs to Neovim, highlighting the differences, challenges, and
benefits I encountered along the way.&lt;/p&gt;</description></item><item><title>Hacking Watson with Haskell - Part 3</title><link>https://www.thenegation.com/posts/hacking-watson-part-3/</link><pubDate>Sat, 17 Aug 2024 21:02:23 +0000</pubDate><guid>https://www.thenegation.com/posts/hacking-watson-part-3/</guid><description>&lt;p&gt;In the previous blog posts (&lt;a href="https://www.thenegation.com/posts/hacking-watson-with-haskell-part-1/"&gt;part 1&lt;/a&gt;, &lt;a href="https://www.thenegation.com/posts/hacking-watson-with-haskell-part-2/"&gt;part 2&lt;/a&gt;), we managed to read &lt;a href="http://tailordev.github.io/Watson/"&gt;Watson&lt;/a&gt;
frames and state from its JSON files. In this blog post, we will do something
more useful: start and stop timer.&lt;/p&gt;</description></item><item><title>Hacking Watson with Haskell - Part 2</title><link>https://www.thenegation.com/posts/hacking-watson-part-2/</link><pubDate>Fri, 16 Aug 2024 22:50:46 +0000</pubDate><guid>https://www.thenegation.com/posts/hacking-watson-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://www.thenegation.com/posts/hacking-watson-with-haskell-part-1/"&gt;previous blog post&lt;/a&gt;, we read the &lt;a href="http://tailordev.github.io/Watson/"&gt;Watson&lt;/a&gt; frames from a JSON file. In
this blog post, we will read the &lt;a href="http://tailordev.github.io/Watson/"&gt;Watson&lt;/a&gt; state file and print it to the
standard output.&lt;/p&gt;</description></item><item><title>Hacking Watson with Haskell - Part 1</title><link>https://www.thenegation.com/posts/hacking-watson-part-1/</link><pubDate>Thu, 15 Aug 2024 21:33:55 +0000</pubDate><guid>https://www.thenegation.com/posts/hacking-watson-part-1/</guid><description>&lt;p&gt;&lt;a href="http://tailordev.github.io/Watson/"&gt;Watson&lt;/a&gt; is a command-line tool that helps you to track your time. It is simple
and powerful, yet it lacks some features that I would like to have. In this blog
post, I will start hacking &lt;a href="http://tailordev.github.io/Watson/"&gt;Watson&lt;/a&gt; with Haskell.&lt;/p&gt;</description></item><item><title>More Haskell Diagrams: Dynamic OpenGraph Images</title><link>https://www.thenegation.com/posts/haskell-diagrams-dynamic-og/</link><pubDate>Wed, 14 Aug 2024 20:29:55 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-dynamic-og/</guid><description>&lt;p&gt;This blog post is a Literate Haskell program that produces its own OpenGraph
image using the infamous Haskell &lt;a href="https://diagrams.github.io"&gt;diagrams&lt;/a&gt; library.&lt;/p&gt;</description></item><item><title>More Haskell Diagrams: Wrapping Text</title><link>https://www.thenegation.com/posts/haskell-diagrams-text/</link><pubDate>Tue, 13 Aug 2024 19:14:35 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-text/</guid><description>&lt;p&gt;Working with text, especially wrapping it, can be tricky when generating images
with Haskell&amp;rsquo;s &lt;a href="https://diagrams.github.io"&gt;diagrams&lt;/a&gt; library. In this blog post, we will write a literate
Haskell program to generate an image with text that fits in a box and wraps if
we want so.&lt;/p&gt;</description></item><item><title>More Haskell Diagrams: OpenGraph Images</title><link>https://www.thenegation.com/posts/haskell-diagrams-og/</link><pubDate>Mon, 12 Aug 2024 21:15:53 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-og/</guid><description>&lt;p&gt;In this blog post, we are continuing to play with Haskell&amp;rsquo;s &lt;a href="https://diagrams.github.io"&gt;diagrams&lt;/a&gt; library.
We will write a literate Haskell program to generate an &lt;a href="https://ogp.me"&gt;OpenGraph&lt;/a&gt; image.&lt;/p&gt;</description></item><item><title>Executable Blog Posts: Second Take</title><link>https://www.thenegation.com/posts/executable-blog-post-pandoc-filters/</link><pubDate>Sun, 11 Aug 2024 22:35:12 +0000</pubDate><guid>https://www.thenegation.com/posts/executable-blog-post-pandoc-filters/</guid><description>&lt;p&gt;This is a second take for my previous blog post &lt;a href="https://www.thenegation.com/posts/abuse-haskell/"&gt;Abusing Haskell: Executable
Blog Posts&lt;/a&gt;. This time, I am going to improve the solution with a &lt;a href="https://www.lua.org"&gt;Lua&lt;/a&gt; filter
for &lt;a href="https://pandoc.org"&gt;pandoc&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>More Haskell Diagrams: Images</title><link>https://www.thenegation.com/posts/haskell-diagrams-images/</link><pubDate>Sat, 10 Aug 2024 11:03:50 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-images/</guid><description>&lt;p&gt;Let&amp;rsquo;s continue exploring the Haskell &lt;a href="https://diagrams.github.io"&gt;diagrams&lt;/a&gt; library. In this post, we will
embed external images in our diagrams.&lt;/p&gt;</description></item><item><title>Introduction to Haskell Diagrams</title><link>https://www.thenegation.com/posts/haskell-diagrams-intro/</link><pubDate>Fri, 09 Aug 2024 23:20:10 +0000</pubDate><guid>https://www.thenegation.com/posts/haskell-diagrams-intro/</guid><description>&lt;p&gt;I need a solid declarative diagramming library or tool that I can invest time
in. I always wanted to learn Haskell&amp;rsquo;s &lt;code&gt;diagrams&lt;/code&gt; library. In this post, I will
give it a try.&lt;/p&gt;</description></item><item><title>Pomodoro Timer: Waybar and uair</title><link>https://www.thenegation.com/posts/pomodoro-waybar-uair/</link><pubDate>Thu, 08 Aug 2024 21:02:30 +0000</pubDate><guid>https://www.thenegation.com/posts/pomodoro-waybar-uair/</guid><description>&lt;p&gt;Most life hackers know about the &lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Pomodoro_Technique"&gt;Pomodoro Technique&lt;/a&gt;&lt;/em&gt;. I tried it, and saw its
merits in the past, but I never adopted it as a habit. I decided to fully invest
in it this time, starting with my &lt;em&gt;Pomodoro Timer&lt;/em&gt; on my desktop.&lt;/p&gt;</description></item><item><title>Hasura CLI on NixOS: A Working Solution</title><link>https://www.thenegation.com/posts/hasura-cli-on-nixos/</link><pubDate>Wed, 07 Aug 2024 22:02:10 +0000</pubDate><guid>https://www.thenegation.com/posts/hasura-cli-on-nixos/</guid><description>&lt;p&gt;This post comes after an exciting discovery of a solution to a problem I and my
team have been facing for a while: Getting Hasura CLI work on NixOS like any
other program.&lt;/p&gt;</description></item><item><title>Using niv to Manage Haskell Dependencies</title><link>https://www.thenegation.com/posts/using-niv-with-hackage/</link><pubDate>Tue, 06 Aug 2024 20:31:10 +0000</pubDate><guid>https://www.thenegation.com/posts/using-niv-with-hackage/</guid><description>&lt;p&gt;Using Nix to manage project dependencies and development environments is a great
way to keep your projects reproducible and isolated. &lt;a href="https://github.com/nmattia/niv"&gt;niv&lt;/a&gt; can help you further
in this by pinning the versions of your dependencies outside of your Nix code as
JSON data.&lt;/p&gt;
&lt;p&gt;In this post, I will show you what using &lt;a href="https://github.com/nmattia/niv"&gt;niv&lt;/a&gt; looks like and how to override
Haskell dependencies. I will also demo a small script I wrote to add Hackage
packages to the &lt;code&gt;sources.json&lt;/code&gt; file.&lt;/p&gt;</description></item><item><title>Backup GitHub Repositories with gidek</title><link>https://www.thenegation.com/posts/backup-github-repos/</link><pubDate>Mon, 05 Aug 2024 21:24:10 +0000</pubDate><guid>https://www.thenegation.com/posts/backup-github-repos/</guid><description>&lt;p&gt;Do you backup your Git repositories? If not, you should consider doing so. I
might even have a solution for you if you are using GitHub: &lt;a href="https://github.com/vst/gidek"&gt;gidek&lt;/a&gt;. It even has
some NixOS goodies packed with it.&lt;/p&gt;</description></item><item><title>Abusing Haskell: Executable Blog Posts</title><link>https://www.thenegation.com/posts/abuse-haskell/</link><pubDate>Sun, 04 Aug 2024 12:21:10 +0000</pubDate><guid>https://www.thenegation.com/posts/abuse-haskell/</guid><description>&lt;p&gt;Why? Because I can, and it is a rainy Sunday.&lt;/p&gt;
&lt;p&gt;I post my notes on &lt;a href="https://www.thenegation.com"&gt;my blog&lt;/a&gt;, &lt;a href="https://thenegation.hashnode.dev"&gt;Hashnode&lt;/a&gt; and &lt;a href="https://dev.to/vst"&gt;dev.to&lt;/a&gt;, which require slightly
different markdown formats. I have been doing the sane thing to fix formats so
far. But it is a rainy Sunday and I am bored, so I decided to make this blog
post an executable Haskell program to do the same.&lt;/p&gt;</description></item><item><title>Managing NixOS Secrets via SOPS, sops-nix and opsops</title><link>https://www.thenegation.com/posts/sops/</link><pubDate>Sat, 03 Aug 2024 18:29:25 +0000</pubDate><guid>https://www.thenegation.com/posts/sops/</guid><description>&lt;p&gt;Secret provisioning is a critical operation during the deployment and management
of a software system. The way it is done can have significant impact on both
security and operational efficiency.&lt;/p&gt;
&lt;p&gt;In this post, I am going to discuss &lt;a href="https://getsops.io"&gt;SOPS&lt;/a&gt;, &lt;a href="https://github.com/Mic92/sops-nix"&gt;sops-nix&lt;/a&gt; and &lt;a href="https://github.com/vst/opsops"&gt;opsops&lt;/a&gt; tools for
managing secrets and how I and my team use it.&lt;/p&gt;</description></item><item><title>Your package.json as a Credit Account</title><link>https://www.thenegation.com/posts/packages-credit-account/</link><pubDate>Fri, 02 Aug 2024 21:54:10 +0000</pubDate><guid>https://www.thenegation.com/posts/packages-credit-account/</guid><description>&lt;p&gt;It is quite easy to install a new &lt;code&gt;npm&lt;/code&gt; package into your project. I go one step
further, and insist on that actually it is &lt;em&gt;too&lt;/em&gt; easy.&lt;/p&gt;
&lt;p&gt;Every dependency in your project is like an expense on your credit account. And
that is &lt;a href="https://youtube.com/shorts/eIKqfujuxIQ?si=nEiLZG3siiZXKlQ6"&gt;not good&lt;/a&gt; if this credit account is not managed properly.&lt;/p&gt;</description></item><item><title>OpenResty on NixOS for an API Gateway</title><link>https://www.thenegation.com/posts/nixos-openresty-api-gateway/</link><pubDate>Thu, 01 Aug 2024 11:45:40 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-openresty-api-gateway/</guid><description>&lt;p&gt;Are you using an API gateway? Do you really need one? If you are using &lt;a href="https://nixos.org"&gt;NixOS&lt;/a&gt;
and feel comfortable with some &lt;a href="https://www.lua.org"&gt;Lua&lt;/a&gt;, you may want to consider &lt;a href="https://openresty.org"&gt;OpenResty&lt;/a&gt; on
NixOS as an API gateway.&lt;/p&gt;</description></item><item><title>Running NixOS Guests on QEMU</title><link>https://www.thenegation.com/posts/nixos-on-qemu/</link><pubDate>Wed, 31 Jul 2024 14:41:19 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-on-qemu/</guid><description>&lt;p&gt;Once in a while, I want to test some NixOS configuration without affecting my
main system or launching new hosts on the cloud.&lt;/p&gt;
&lt;p&gt;Running NixOS on a virtual machine (VM) is a safe and reproducible way to test
such configurations. As for VMs, I have used &lt;a href="https://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt;, &lt;a href="https://www.vagrantup.com"&gt;Vagrant&lt;/a&gt; and &lt;a href="https://canonical.com/lxd"&gt;lxd&lt;/a&gt;
in the past. However, I have found QEMU to be the simplest and most flexible
solution for my needs.&lt;/p&gt;
&lt;p&gt;This guide is a quick reference to create and run NixOS guests on QEMU.&lt;/p&gt;</description></item><item><title>Archiving PostgreSQL Backups on NixOS</title><link>https://www.thenegation.com/posts/nixos-pg-archives/</link><pubDate>Tue, 30 Jul 2024 09:18:10 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-pg-archives/</guid><description>&lt;p&gt;This is a technical note on how to archive PostgreSQL backups on &lt;a href="https://nixos.org"&gt;NixOS&lt;/a&gt; to one
or more targets using &lt;a href="https://rclone.org"&gt;rclone&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Develop R Packages under Nix Shell</title><link>https://www.thenegation.com/posts/nix-r-package-guide/</link><pubDate>Fri, 05 Jan 2024 08:22:10 +0000</pubDate><guid>https://www.thenegation.com/posts/nix-r-package-guide/</guid><description>&lt;p&gt;This is a guide for creating, developing and testing &lt;a href="https://www.r-project.org"&gt;R&lt;/a&gt; packages under a &lt;a href="https://en.wikipedia.org/wiki/Nix_package_manager"&gt;Nix&lt;/a&gt;
Shell using R tools such as &lt;a href="https://devtools.r-lib.org"&gt;devtools&lt;/a&gt;, &lt;a href="https://testthat.r-lib.org"&gt;testthat&lt;/a&gt; and &lt;a href="https://usethis.r-lib.org"&gt;usethis&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>NixOS on Raspberry Pi 4 with Encrypted Filesystem</title><link>https://www.thenegation.com/posts/nixos-rpi4-luks/</link><pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate><guid>https://www.thenegation.com/posts/nixos-rpi4-luks/</guid><description>&lt;p&gt;This guide documents how to install NixOS on Raspberry Pi 4 with an encrypted
root filesystem.&lt;/p&gt;</description></item><item><title>Literate Haskell with Markdown</title><link>https://www.thenegation.com/posts/literate-haskell-markdown/</link><pubDate>Sat, 16 Oct 2021 00:00:00 +0000</pubDate><guid>https://www.thenegation.com/posts/literate-haskell-markdown/</guid><description>&lt;p&gt;This is a short guide to writing &lt;em&gt;&lt;a href="https://wiki.haskell.org/Literate_programming"&gt;Literate Haskell&lt;/a&gt;&lt;/em&gt; programs using Markdown.&lt;/p&gt;</description></item><item><title>Modern Web-based APIs: What to Expect?</title><link>https://www.thenegation.com/posts/modern-web-based-apis/</link><pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate><guid>https://www.thenegation.com/posts/modern-web-based-apis/</guid><description>&lt;p&gt;Here are some quick notes for mysels on what to expect from a modern, Web-based
API that facilitates data query and manipulation (and possibly remote procedure
calls).&lt;/p&gt;</description></item><item><title>Unreasonable Revolutionary</title><link>https://www.thenegation.com/posts/unreasonable-revolutionary/</link><pubDate>Sun, 10 Jun 2012 23:10:00 +0000</pubDate><guid>https://www.thenegation.com/posts/unreasonable-revolutionary/</guid><description>&lt;p&gt;&lt;em&gt;&lt;a href="http://www.goodreads.com/book/show/192221.How_to_Solve_It"&gt;How to Solve It: A New Aspect of Mathematical Method&lt;/a&gt;&lt;/em&gt; by &lt;a href="http://en.wikipedia.org/wiki/George_P%C3%B3lya"&gt;George Pólya&lt;/a&gt;
provides a detailed and entertaining survey of general methods for problem
solving, namely &lt;em&gt;heuristics&lt;/em&gt;. I guess that most people dealing with mathematics
in daily life have read this book.&lt;/p&gt;</description></item><item><title>Abstraction as Bread and Butter</title><link>https://www.thenegation.com/posts/abstraction-as-bread-and-butter/</link><pubDate>Sat, 19 May 2012 14:09:23 +0000</pubDate><guid>https://www.thenegation.com/posts/abstraction-as-bread-and-butter/</guid><description>&lt;p&gt;I find the first pages of a book to be the most instructive ones for many
reasons. When I look at a good book that I read many years ago, I still find
those first pages more interesting and inspiring.&lt;/p&gt;</description></item><item><title>Redefining the Ontology of Accounting</title><link>https://www.thenegation.com/posts/redefining-the-ontology-of-accounting/</link><pubDate>Sun, 15 Jan 2012 08:03:01 +0000</pubDate><guid>https://www.thenegation.com/posts/redefining-the-ontology-of-accounting/</guid><description>&lt;p&gt;&lt;em&gt;Accounting&lt;/em&gt; is more than 7,000 years old. This discipline helps us to plan,
execute and assess business transactions. It is also the universal language of
business.&lt;/p&gt;
&lt;p&gt;In particular, &lt;em&gt;double-entry accounting&lt;/em&gt; (also known as &lt;em&gt;double-entry
bookkeeping&lt;/em&gt;) system has been used for about the last five centuries as a
framework to record business transactions. We can then consolidate these
transactions and report summaries through standardized documents such as
ledgers, balance sheets, income statements, etc.&lt;/p&gt;
&lt;p&gt;However, we are living in the age of information technology. And the way we
perform accounting still looks like it is pre-computer age.&lt;/p&gt;
&lt;p&gt;Can we do any better now?&lt;/p&gt;
&lt;p&gt;In the following, I will briefly explain my concerns. Then, a relatively recent
and exciting ontological approach to accounting follows.&lt;/p&gt;</description></item><item><title>About</title><link>https://www.thenegation.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.thenegation.com/about/</guid><description>&lt;p&gt;My name is Sinan.&lt;/p&gt;
&lt;p&gt;I am a computer programmer and a lifestyle entrepreneur. You can find more
information about me on my &lt;a href="https://www.linkedin.com/in/vehbisinan"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://github.com/vst"&gt;GitHub&lt;/a&gt; profiles, or contact me at
&lt;a href="mailto:vst@vsthost.com"&gt;vst@vsthost.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This Website hosts my blog posts, and its &lt;a href="https://github.com/vst/www.thenegation.com"&gt;source code&lt;/a&gt; is available on GitHub.&lt;/p&gt;
&lt;p&gt;Unless otherwise noted, this Website and its content are licensed under &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC
BY-SA 4.0&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>