<?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>Blog Posts on Loki Astari</title><link>https://lokiastari.com/posts/</link><description>Recent content in Blog Posts on Loki Astari</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 16 May 2026 00:00:00 -0800</lastBuildDate><atom:link href="https://lokiastari.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>SlackView: Slack Bot opening Modals</title><link>https://lokiastari.com/posts/SlackView/</link><pubDate>Sat, 16 May 2026 00:00:00 -0800</pubDate><guid>https://lokiastari.com/posts/SlackView/</guid><description>Opening modal dialogs from a Slack Bot</description></item><item><title>SlackActions: Slack Bot handling Slash commands</title><link>https://lokiastari.com/posts/SlackAction/</link><pubDate>Wed, 06 May 2026 00:00:00 -0800</pubDate><guid>https://lokiastari.com/posts/SlackAction/</guid><description>Handling Slack slash commands</description></item><item><title>SlackHandlers: Slack Bot handling events</title><link>https://lokiastari.com/posts/SlackHandlers/</link><pubDate>Sat, 02 May 2026 00:00:00 -0800</pubDate><guid>https://lokiastari.com/posts/SlackHandlers/</guid><description>Handling events in the Slack Bot</description></item><item><title>SlackMug: A Mug plugin for a Slack bot</title><link>https://lokiastari.com/posts/SlackMug/</link><pubDate>Tue, 21 Apr 2026 12:00:00 -0800</pubDate><guid>https://lokiastari.com/posts/SlackMug/</guid><description>Creating a Slack bot using the Mug plugin architecture.</description></item><item><title>Mug: A C++ server with hot-reloadable plugins</title><link>https://lokiastari.com/posts/Mug/</link><pubDate>Wed, 04 Mar 2026 12:00:00 -0800</pubDate><guid>https://lokiastari.com/posts/Mug/</guid><description>Mug is a small HTTP server executable that loads REST endpoints from shared libraries and hot-reloads them when rebuilt. It’s aimed at making the edit/build/test loop feel closer to Python Bottle, while keeping the core server fast and C++-native.</description></item><item><title>NeoVim Config on Apple Silicon</title><link>https://lokiastari.com/posts/NeoVim/</link><pubDate>Wed, 05 Mar 2025 02:48:30 -0800</pubDate><guid>https://lokiastari.com/posts/NeoVim/</guid><description>NeoVim Config on Apple Silicon</description></item><item><title>Multi Threading</title><link>https://lokiastari.com/posts/NisseV4/</link><pubDate>Tue, 12 Nov 2024 07:48:30 -0800</pubDate><guid>https://lokiastari.com/posts/NisseV4/</guid><description>Nisse. The step by step creation of a C++ Server architecture.</description></item><item><title>SSL Certificates</title><link>https://lokiastari.com/posts/NisseV3/</link><pubDate>Sun, 10 Nov 2024 12:48:30 -0800</pubDate><guid>https://lokiastari.com/posts/NisseV3/</guid><description>Nisse. The step by step creation of a C++ Server architecture.</description></item><item><title>C++ Sockets</title><link>https://lokiastari.com/posts/NisseV2/</link><pubDate>Fri, 08 Nov 2024 18:48:31 -0800</pubDate><guid>https://lokiastari.com/posts/NisseV2/</guid><description>Nisse. The step by step creation of a C++ Server architecture.</description></item><item><title>A Web Server</title><link>https://lokiastari.com/posts/NisseV1/</link><pubDate>Wed, 06 Nov 2024 12:48:31 -0800</pubDate><guid>https://lokiastari.com/posts/NisseV1/</guid><description>Nisse. The step by step creation of a C++ Server architecture.</description></item><item><title>Nisse - Origins of a Server Library</title><link>https://lokiastari.com/posts/NisseOrigins/</link><pubDate>Mon, 04 Nov 2024 12:50:31 -0800</pubDate><guid>https://lokiastari.com/posts/NisseOrigins/</guid><description>Nisse. The step by step creation of a C++ Server architecture.</description></item><item><title>Socket Protocols</title><link>https://lokiastari.com/posts/SocketProtocols/</link><pubDate>Sun, 29 May 2016 21:13:39 -0700</pubDate><guid>https://lokiastari.com/posts/SocketProtocols/</guid><description>A very cursory look at protocols and why they are needed</description></item><item><title>C++ Wrapper for Socket</title><link>https://lokiastari.com/posts/C++WrapperforSocket/</link><pubDate>Thu, 26 May 2016 21:13:39 -0700</pubDate><guid>https://lokiastari.com/posts/C++WrapperforSocket/</guid><description>Socket wrappers in C++</description></item><item><title>Socket Read/Write</title><link>https://lokiastari.com/posts/SocketRead_Write/</link><pubDate>Sat, 09 Apr 2016 21:11:25 -0700</pubDate><guid>https://lokiastari.com/posts/SocketRead_Write/</guid><description>Socket wrappers in C++</description></item><item><title>Socket Programming in C</title><link>https://lokiastari.com/posts/SocketProgramminginC/</link><pubDate>Fri, 08 Apr 2016 09:47:01 -0700</pubDate><guid>https://lokiastari.com/posts/SocketProgramminginC/</guid><description>Socket wrappers in C++</description></item><item><title>Memory Resizing</title><link>https://lokiastari.com/posts/MemoryResizing/</link><pubDate>Fri, 25 Mar 2016 05:53:07 -0700</pubDate><guid>https://lokiastari.com/posts/MemoryResizing/</guid><description>So why is the constant resize factor of the array 1.5 or 2?</description></item><item><title>Vector - The Other Stuff</title><link>https://lokiastari.com/posts/Vector-TheOtherStuff/</link><pubDate>Sun, 20 Mar 2016 22:26:43 -0700</pubDate><guid>https://lokiastari.com/posts/Vector-TheOtherStuff/</guid><description>C++ By Example. The Vector Part 5. So, the C++ standard specifies a set of requirements for containers. Very few requirements are specified in terms of containers, so adhering to these exactly is not required (unless you want to be considered for the standard). But they provide an insight into what can be done with them, and if you support them, it will allow your container to be more easily used with some features of the language and standard library. I am not going to go over all of them here (that is left as an exercise for the reader), but I will go over the ones I would expect to see in a simple implementation (the kind you would see in a university project).</description></item><item><title>Vector - Simple Optimizations</title><link>https://lokiastari.com/posts/Vector-SimpleOptimizations/</link><pubDate>Sat, 19 Mar 2016 15:06:40 -0700</pubDate><guid>https://lokiastari.com/posts/Vector-SimpleOptimizations/</guid><description>C++ By Example. The Vector Part 4. We look at a couple of other types available in the template utility library that allow optimization via SFINAE.</description></item><item><title>Vector - Resize</title><link>https://lokiastari.com/posts/Vector-Resize/</link><pubDate>Sat, 12 Mar 2016 05:53:07 -0700</pubDate><guid>https://lokiastari.com/posts/Vector-Resize/</guid><description>C++ By Example. The Vector Part 3. Because resizing a vector is expensive, the standard vector class uses exponential growth to minimize the number of times that the vector is resized, a technique we replicate in this version. But every now and then, you still need to resize the internal buffer.</description></item><item><title>Vector - Resource Management Copy Swap</title><link>https://lokiastari.com/posts/Vector-ResourceManagementCopySwap/</link><pubDate>Mon, 29 Feb 2016 12:29:20 -0800</pubDate><guid>https://lokiastari.com/posts/Vector-ResourceManagementCopySwap/</guid><description>C++ By Example. The Vector Part 2. In the previous article, I went over basic allocation for a `Vector` like class. In this article, I want to put some detail around the copy assignment operator and resizing the underlying `Vector`. Unlike the other methods previously discussed, these methods have to deal with both construction and destruction of elements and the potential of exceptions interrupting the processes. The goal is to provide exception safe methods that provide the strong exception guarantee for the object and do not leak resources.</description></item><item><title>Vector - Resource Management Allocation</title><link>https://lokiastari.com/posts/Vector-ResourceManagementAllocation/</link><pubDate>Sat, 27 Feb 2016 12:00:31 -0800</pubDate><guid>https://lokiastari.com/posts/Vector-ResourceManagementAllocation/</guid><description>C++ By Example. The Vector - Part 1. Many new developers of C++ attempt to build a `Vector&amp;#39;- like container as a learning process. Getting a simple version of this working for POD types (like int) is not that complicated. The next step in getting this working for arbitrary data types takes a significant leap forward in thinking in C++, especially when you start looking at efficiency and exception safety. This set of five articles looks at building an efficient `Vector` implementation. I show some common mistakes and explain why and how to resolve the problems.</description></item><item><title>Smart-Pointer - Constructors</title><link>https://lokiastari.com/posts/Smart-Pointer-Constructors/</link><pubDate>Fri, 23 Jan 2015 16:33:14 -0800</pubDate><guid>https://lokiastari.com/posts/Smart-Pointer-Constructors/</guid><description>C++ By Example. Part 3 Smart Pointer Constructors. In this article, we examine constructors that are often missed or overlooked. This article looks at the use cases for these constructors and explains why the added functionality provides a meaningful addition to smart pointers.</description></item><item><title>Smart-Pointer - Shared Pointer</title><link>https://lokiastari.com/posts/Smart-Pointer-SharedPointer/</link><pubDate>Thu, 15 Jan 2015 08:13:47 -0800</pubDate><guid>https://lokiastari.com/posts/Smart-Pointer-SharedPointer/</guid><description>C++ By Example. Part 2 Shared Pointer. This article covers some of the common implementation techniques used for a smart pointer that provides shared ownership of a resource.</description></item><item><title>Smart-Pointer - Unique Pointer</title><link>https://lokiastari.com/posts/Smart-Pointer-UniquePointer/</link><pubDate>Tue, 30 Dec 2014 18:41:42 -0800</pubDate><guid>https://lokiastari.com/posts/Smart-Pointer-UniquePointer/</guid><description>C++ By Example. Part 1 Unique Pointer. It seems it is a write of passage to implement your own version of a smart pointer. This article examines some common mistakes developers make when developing their own smart pointers.</description></item><item><title>Nearly New Year/New Resolution</title><link>https://lokiastari.com/posts/NearlyNewYear_NewResolution/</link><pubDate>Sat, 06 Dec 2014 11:44:00 -0800</pubDate><guid>https://lokiastari.com/posts/NearlyNewYear_NewResolution/</guid><description>New Year&amp;#39;s resolution</description></item><item><title>Control Flow</title><link>https://lokiastari.com/posts/ControlFlow/</link><pubDate>Mon, 02 Dec 2013 12:00:11 -0800</pubDate><guid>https://lokiastari.com/posts/ControlFlow/</guid><description>C++ for beginners. Part 5 Control Flow. So far, we have demonstrated basic programs that do a single task without making any decisions. Most (all but the most trivial) programming languages provide decision-making constructs (Conditional Branching).</description></item><item><title>Switching to OctoPress and GitHub</title><link>https://lokiastari.com/posts/SwitchingtoOctoPress/</link><pubDate>Sat, 30 Nov 2013 15:37:34 -0800</pubDate><guid>https://lokiastari.com/posts/SwitchingtoOctoPress/</guid><description>Switching the blog to octopress.</description></item><item><title>Functions</title><link>https://lokiastari.com/posts/Functions/</link><pubDate>Sun, 24 Nov 2013 09:22:04 -0800</pubDate><guid>https://lokiastari.com/posts/Functions/</guid><description>C++ for beginners. Part 4 Functions. All C++ applications must have at least one function called `main()`. Additionally, you can have user-defined functions that encapsulate individual tasks, thus making the code cleaner and easier to read. Therefore, this is a helpful feature if you repeat the same task repeatedly with only slight variations.</description></item><item><title>Variables</title><link>https://lokiastari.com/posts/Variables/</link><pubDate>Tue, 19 Nov 2013 09:15:16 -0800</pubDate><guid>https://lokiastari.com/posts/Variables/</guid><description>C++ for beginners. Part 3 Variables. In most programming languages, you have the concept of variables. These are named objects that hold a value (more formerly referred to as state). By manipulating a variable, you manipulate the state of the object the variable refers to.</description></item><item><title>Common Mistakes</title><link>https://lokiastari.com/posts/CommonMistakes/</link><pubDate>Mon, 18 Nov 2013 08:58:28 -0800</pubDate><guid>https://lokiastari.com/posts/CommonMistakes/</guid><description>C++ for beginners. Part 2 Common Mistakes</description></item><item><title>Want to set up WordPress to write about Programming</title><link>https://lokiastari.com/posts/WanttosetupWordPresstowriteaboutProgramming/</link><pubDate>Tue, 12 Nov 2013 11:43:06 -0800</pubDate><guid>https://lokiastari.com/posts/WanttosetupWordPresstowriteaboutProgramming/</guid><description>Setting up WordPress to display syntax highlighted code was a struggle due to different plugins that don’t all seem to work together, the different types of editor, etc. I don’t want to learn all about WordPress. I just want to write some simple articles.</description></item><item><title>Hello World</title><link>https://lokiastari.com/posts/HelloWorld/</link><pubDate>Tue, 12 Nov 2013 07:59:11 -0800</pubDate><guid>https://lokiastari.com/posts/HelloWorld/</guid><description>C++ for beginners. Part 1 Hello World. I keep trying to think about something big and interesting to write about. But that is just not working. All my time is spent trying to think of the blockbuster idea; which just gets in the way of writing. So, let&amp;#39;s start with the small things. If I can get into the habit of writing something a couple of times a week. Then maybe we can work up to interesting stuff.</description></item><item><title>Interviews Processes</title><link>https://lokiastari.com/posts/InterviewsProcesses/</link><pubDate>Fri, 21 Oct 2011 20:01:23 -0800</pubDate><guid>https://lokiastari.com/posts/InterviewsProcesses/</guid><description>One of the things the most non-programmers are surprised about is the severity of programming interviews. So why are they so intense?</description></item><item><title/><link>https://lokiastari.com/posts/MissingFunctionality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lokiastari.com/posts/MissingFunctionality/</guid><description>&lt;h1 id="nissebolt-app-missing-functionality-vs-slack-bolt-python"&gt;NisseBolt App: Missing Functionality vs Slack Bolt Python&lt;/h1&gt;
&lt;p&gt;This document compares the NisseBolt &lt;code&gt;App&lt;/code&gt; class (the Mug plugin interface) against the Slack Bolt Python API and identifies functionality that is missing or incomplete.&lt;/p&gt;
&lt;p&gt;Note: some of this functionality already exists in the newer &lt;code&gt;NBServer&lt;/code&gt; class (&lt;code&gt;NB/NBServer.h&lt;/code&gt;), which is a standalone server rather than a Mug plugin. Where applicable, this is noted below.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-shortcuts-shortcut"&gt;3. Shortcuts (&lt;code&gt;shortcut()&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bolt Python:&lt;/strong&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@app.shortcut&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;open_modal&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handle_shortcut&lt;/span&gt;(ack, shortcut, client):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ack()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client&lt;span style="color:#f92672"&gt;.&lt;/span&gt;views_open(trigger_id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;shortcut[&lt;span style="color:#e6db74"&gt;&amp;#34;trigger_id&amp;#34;&lt;/span&gt;], view&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#f92672"&gt;...&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NisseBolt App:&lt;/strong&gt; Not supported.&lt;/p&gt;</description></item></channel></rss>