diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-12-18 22:22:54 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-12-18 22:22:54 +0800 |
| commit | 4edf733b7bf460d1c27c9e6529b8d39cf5bb5e56 (patch) | |
| tree | 1f7bd09dbd1ae913d92a8f4eed75efae395dc7f0 | |
| parent | 8f96339b62d54479e0e712975276c05e907979fd (diff) | |
| download | www-4edf733b7bf460d1c27c9e6529b8d39cf5bb5e56.tar.gz | |
Bumblebee post.
| -rw-r--r-- | _projects/bumblebee.md | 32 | ||||
| -rw-r--r-- | _projects/matrix-digital-rain.md | 47 | ||||
| -rw-r--r-- | _site/about/index.html | 2 | ||||
| -rw-r--r-- | _site/feed.xml | 2 | ||||
| -rw-r--r-- | _site/posts.xml | 2 | ||||
| -rw-r--r-- | _site/projects/bumblebee/index.html | 30 | ||||
| -rw-r--r-- | _site/projects/matrix-digital-rain/index.html | 47 | ||||
| -rw-r--r-- | _site/robots.txt | 2 | ||||
| -rw-r--r-- | _site/sitemap.xml | 30 | ||||
| -rw-r--r-- | about.html | 2 |
10 files changed, 95 insertions, 101 deletions
diff --git a/_projects/bumblebee.md b/_projects/bumblebee.md index b3dd686..cb0441d 100644 --- a/_projects/bumblebee.md +++ b/_projects/bumblebee.md @@ -16,37 +16,35 @@ In 2024, we were tasked with collecting market data using various methods, including scraping data from authorized websites for traders' use. Manual authoring of such scripts took time. The scripts were often brittle due -to the complex nature of modern websites, and they lacked optimizations such as +to the complexity of the modern web, and they lacked optimizations such as bypassing the UI and retrieving the data files directly when possible, which would have significantly reduced our compute costs. To alleviate these challenges, I, with the help of a colleague, Andy Zhang, -built Bumblebee: a C# Windows Forms desktop application that uses Microsoft -Edge <a src="https://developer.microsoft.com/en-us/microsoft-edge/webview2" -class="external" target="_blank" rel="noopener noreferrer">WebView2</a> for -rendering web content. +built Bumblebee: a web browser powered by C# Windows Forms, Microsoft Edge <a +src="https://developer.microsoft.com/en-us/microsoft-edge/webview2" +class="external" target="_blank" rel="noopener noreferrer">WebView2</a>, and +the <a src="https://github.com/desjarlais/Scintilla.NET" class="external" +toarget="_blank" rel="noopener noreferrer">Scintilla.NET</a> text editor. Bumblebee works by injecting a custom JavaScript program that intercepts client-side events and sends them to Bumblebee for analysis. In addition to front-end events, Bumblebee also captures internal browser events, which it then interprets to generate code in real time. Note that we developed Bumblebee -before the advent of now-popular LLMs. Bumblebee reliably handles dynamic -websites and pop-ups. The user can access developer tools, override any part of -the script at any point during the session (using the embedded <a -src="https://github.com/desjarlais/Scintilla.NET" class="external" -target="_blank" rel="noopener noreferrer">Scintilla.NET</a> editor), debounce -events, and block hidden elements and scripts. +before the advent of now-popular LLMs. Bumblebee supports dynamic websites, +pop-ups, developer tools, live manual override, event debouncing, and filtering +hidden elements and scripts. Before settling on a desktop application, we contemplated designing Bumblebee as a browser extension. We chose the desktop app because extensions don't offer the deep, event-based control we needed. Besides, the company's security policy, which prohibited browser extensions, would have complicated the -deployment of an extension-based solution. The initial prototype used a C# -wrapper of the Chromium project instead of WebView. WebView's more intuitive -API and its seamless integration with Windows Forms led us to choose it over -the Chromium wrapper. +deployment of an extension-based solution. My first prototype used a C# binding +of the Chromium project. WebView's more intuitive API and its seamless +integration with Windows Forms led us to choose it over the Chromium wrapper. +What began as a personal side project to improve my own workflow enabled us to +collectively improve the quality of our web scripts at a much larger scale. Bumblebee predictably reduced the time we spent on authoring scripts from hours -to a few minutes. Since the code generation rules were written and optimized by -experts in web technologies, the quality of the scripts improved as well. +to a few minutes. diff --git a/_projects/matrix-digital-rain.md b/_projects/matrix-digital-rain.md index bca5c38..6d15008 100644 --- a/_projects/matrix-digital-rain.md +++ b/_projects/matrix-digital-rain.md @@ -16,14 +16,14 @@ Matrix in C, with zero dependencies—not even ncurses. This is my fork of Domsson's beautiful <a href="https://github.com/domsson/fakesteak" class="external" target="_blank" -rel="noopener noreferrer">Fakesteak</a>. While studying the code, I wondered -what it would take to faithfully recreate the original Matrix from the first -movie without sacrificing the program's minimalism and elegance. +rel="noopener noreferrer">Fakesteak</a>. While going through his code, I +wondered what it would take to faithfully recreate the original Matrix from the +first movie without sacrificing its minimalism. -My version adds: +My implementation supports: - - Unicode character support. - - Fully customizable 24-bit RGB (truecolor) colors. + - Unicode characters. + - 24-bit RGB colors (truecolor). - Glitches in the matrix. - Ghosting effect of old monochrome CRT displays. - Closely resembles the Matrix seen in the background during Neo and Cypher's @@ -38,10 +38,10 @@ $ ./matrix ## How does it work? -The program tracks the state of the terminal - characters, background and -foreground colors, shading levels, cursor position - using multiple internal -data buffers. On each frame, it updates these buffers and repaints the screen -using ANSI escape codes: +The program tracks the state of the terminal, such as code points, background +and foreground colors, and cursor position, using multiple internal data +buffers. On each frame, it updates these buffers and repaints the screen using +ANSI escape codes: ``` static void term_print(const matrix *mat, size_t row, size_t col) @@ -57,8 +57,8 @@ static void term_print(const matrix *mat, size_t row, size_t col) } ``` -The ghosting effect, the signature feature of this implementation, works by -scaling and mixing the RGB channels: +The ghosting effect is achieved by carefully scaling the RGB +channels before mixing them: ``` static void mat_shade(matrix *mat, size_t row, size_t col) @@ -71,25 +71,24 @@ static void mat_shade(matrix *mat, size_t row, size_t col) } ``` -The ghosting function emulates the screen decay by gradually transitioning each -raindrop's color towards the background color. This approach provides two key -benefits: straightforward color configuration that integrates naturally with -Unix ricing (desktop customization) and high-fidelity recreation of the Matrix -aesthetic. +The ghosting function emulates the dim after glow by gradually transitioning +each raindrop's color towards the background color. This approach provides two +key benefits: straightforward color configuration that integrates naturally +with (Unix) ricing and high-fidelity recreation of the Matrix aesthetic. ## Customization -While you can adjust almost every aspect, including its speed, glitch -frequency, and rain density, the most useful settings for customization are the -color scheme and character set. +While you can alter almost every aspect, including speed, glitch frequency, and +rain density, the most common customizations are the color scheme and character +set. There are three color settings: head, tail, and background. You can configure -them by setting the `COLOR_*_RED`, `COLOR_*_GRN`, and `COLOR_*_BLU` definitions -in main.c. +them using `COLOR_*_RED`, `COLOR_*_GRN`, and `COLOR_*_BLU` definitions found in +main.c. The `UNICODE_MIN` and `UNICODE_MAX` values control the Unicode block used. For -example, setting them to `0x30A1` and `0x30F6` rains Katakana (if a font that -supports Katakana is present on the system): +example, setting them to `0x30A1` and `0x30F6` rains Katakana, if a font that +supports Katakana is present on the system: <img style="width: 100%;" src="katakana.png" /> diff --git a/_site/about/index.html b/_site/about/index.html index 3888060..2964950 100644 --- a/_site/about/index.html +++ b/_site/about/index.html @@ -53,7 +53,7 @@ <li>blg: Notes and tutorials about software and embedded systems.</li> <li>poc: Projects, prototypes, and experiments.</li> <li>abt: Site information.</li> - <li>rss: RSS (atom) feed.</li> + <li>rss: RSS (Atom) feed.</li> </ul> <h4>Site credits</h4> diff --git a/_site/feed.xml b/_site/feed.xml index 0b8599d..0309c54 100644 --- a/_site/feed.xml +++ b/_site/feed.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2025-12-18T21:05:53+08:00</updated><id>http://localhost:4000/feed.xml</id><title type="html">ASCIIMX | Blog</title><author><name>W. D. Sadeep Madurange</name></author><entry><title type="html">How I manage Suckless software installations</title><link href="http://localhost:4000/blog/suckless-software/" rel="alternate" type="text/html" title="How I manage Suckless software installations" /><published>2025-11-30T00:00:00+08:00</published><updated>2025-11-30T00:00:00+08:00</updated><id>http://localhost:4000/blog/suckless-software</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Since suckless software requires users to modify the source code and recompile to customize, I need a way to maintain patches over the long term while retaining the ability to upgrade the software as new versions are released.]]></summary></entry><entry><title type="html">Neo4J A* search</title><link href="http://localhost:4000/blog/neo4j-a-star-search/" rel="alternate" type="text/html" title="Neo4J A* search" /><published>2025-09-14T00:00:00+08:00</published><updated>2025-09-14T00:00:00+08:00</updated><id>http://localhost:4000/blog/neo4j-a-star-search</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Back in 2018, we used Neo4J graph database to track the movement of marine vessels. We were interested in the shortest path a ship could take through a network of about 13,000 route points. Algorithms based on graph theory, such as A* search, provide optimal solutions to such problems. In other words, the set of route points lends itself well to a model based on graphs.]]></summary></entry><entry><title type="html">MOSFETs as electronic switches</title><link href="http://localhost:4000/blog/mosfet-switches/" rel="alternate" type="text/html" title="MOSFETs as electronic switches" /><published>2025-06-22T00:00:00+08:00</published><updated>2025-06-22T00:00:00+08:00</updated><id>http://localhost:4000/blog/mosfet-switches</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Recently, I needed a low-power circuit for one of my battery-operated projects. Much of the system’s power savings depended on its ability to electronically switch off components, such as servos, that draw high levels of quiescent currents. My search for a solution led me to MOSFETs, transistors capable of controlling circuits operating at voltages far above their own.]]></summary></entry><entry><title type="html">How to configure ATmega328P microcontrollers to run at 3.3V and 5V</title><link href="http://localhost:4000/blog/arduino-uno/" rel="alternate" type="text/html" title="How to configure ATmega328P microcontrollers to run at 3.3V and 5V" /><published>2025-04-10T00:00:00+08:00</published><updated>2025-04-10T00:00:00+08:00</updated><id>http://localhost:4000/blog/arduino-uno</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This is a quick reference for wiring up ATmega328P ICs to run at 5V and 3.3V. While the 5V configuration is common, the 3.3V configuration can be useful in low-power applications and when interfacing with parts that themselves run at 3.3V. In this guide, the 5V setup is configured with a 16MHz crystal oscillator, while the 3.3V configuration makes use of an 8MHz crystal oscillator.]]></summary></entry><entry><title type="html">How to set up ATSAM3X8E microcontrollers for bare-metal programming in C</title><link href="http://localhost:4000/blog/arduino-due/" rel="alternate" type="text/html" title="How to set up ATSAM3X8E microcontrollers for bare-metal programming in C" /><published>2024-10-05T00:00:00+08:00</published><updated>2024-10-05T00:00:00+08:00</updated><id>http://localhost:4000/blog/arduino-due</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This article is a step-by-step guide for programming bare-metal ATSAM3X8E chips found on Arduino Due boards. It also includes notes on the chip’s memory layout relevant for writing linker scripts. The steps described in this article were tested on an OpenBSD workstation.]]></summary></entry></feed>
\ No newline at end of file +<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-18T22:22:36+08:00</updated><id>/feed.xml</id><title type="html">ASCIIMX | Blog</title><author><name>W. D. Sadeep Madurange</name></author><entry><title type="html">How I manage Suckless software installations</title><link href="/blog/suckless-software/" rel="alternate" type="text/html" title="How I manage Suckless software installations" /><published>2025-11-30T00:00:00+08:00</published><updated>2025-11-30T00:00:00+08:00</updated><id>/blog/suckless-software</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Since suckless software requires users to modify the source code and recompile to customize, I need a way to maintain patches over the long term while retaining the ability to upgrade the software as new versions are released.]]></summary></entry><entry><title type="html">Neo4J A* search</title><link href="/blog/neo4j-a-star-search/" rel="alternate" type="text/html" title="Neo4J A* search" /><published>2025-09-14T00:00:00+08:00</published><updated>2025-09-14T00:00:00+08:00</updated><id>/blog/neo4j-a-star-search</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Back in 2018, we used Neo4J graph database to track the movement of marine vessels. We were interested in the shortest path a ship could take through a network of about 13,000 route points. Algorithms based on graph theory, such as A* search, provide optimal solutions to such problems. In other words, the set of route points lends itself well to a model based on graphs.]]></summary></entry><entry><title type="html">MOSFETs as electronic switches</title><link href="/blog/mosfet-switches/" rel="alternate" type="text/html" title="MOSFETs as electronic switches" /><published>2025-06-22T00:00:00+08:00</published><updated>2025-06-22T00:00:00+08:00</updated><id>/blog/mosfet-switches</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Recently, I needed a low-power circuit for one of my battery-operated projects. Much of the system’s power savings depended on its ability to electronically switch off components, such as servos, that draw high levels of quiescent currents. My search for a solution led me to MOSFETs, transistors capable of controlling circuits operating at voltages far above their own.]]></summary></entry><entry><title type="html">How to configure ATmega328P microcontrollers to run at 3.3V and 5V</title><link href="/blog/arduino-uno/" rel="alternate" type="text/html" title="How to configure ATmega328P microcontrollers to run at 3.3V and 5V" /><published>2025-04-10T00:00:00+08:00</published><updated>2025-04-10T00:00:00+08:00</updated><id>/blog/arduino-uno</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This is a quick reference for wiring up ATmega328P ICs to run at 5V and 3.3V. While the 5V configuration is common, the 3.3V configuration can be useful in low-power applications and when interfacing with parts that themselves run at 3.3V. In this guide, the 5V setup is configured with a 16MHz crystal oscillator, while the 3.3V configuration makes use of an 8MHz crystal oscillator.]]></summary></entry><entry><title type="html">How to set up ATSAM3X8E microcontrollers for bare-metal programming in C</title><link href="/blog/arduino-due/" rel="alternate" type="text/html" title="How to set up ATSAM3X8E microcontrollers for bare-metal programming in C" /><published>2024-10-05T00:00:00+08:00</published><updated>2024-10-05T00:00:00+08:00</updated><id>/blog/arduino-due</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This article is a step-by-step guide for programming bare-metal ATSAM3X8E chips found on Arduino Due boards. It also includes notes on the chip’s memory layout relevant for writing linker scripts. The steps described in this article were tested on an OpenBSD workstation.]]></summary></entry></feed>
\ No newline at end of file diff --git a/_site/posts.xml b/_site/posts.xml index a9c2ffe..3aed0d0 100644 --- a/_site/posts.xml +++ b/_site/posts.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="http://localhost:4000/posts.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2025-12-18T21:05:53+08:00</updated><id>http://localhost:4000/posts.xml</id><title type="html">ASCIIMX</title><author><name>W. D. Sadeep Madurange</name></author></feed>
\ No newline at end of file +<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/posts.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-18T22:22:36+08:00</updated><id>/posts.xml</id><title type="html">ASCIIMX</title><author><name>W. D. Sadeep Madurange</name></author></feed>
\ No newline at end of file diff --git a/_site/projects/bumblebee/index.html b/_site/projects/bumblebee/index.html index d414b1a..a07dd5f 100644 --- a/_site/projects/bumblebee/index.html +++ b/_site/projects/bumblebee/index.html @@ -55,36 +55,34 @@ of web scraping scripts.</p> including scraping data from authorized websites for traders’ use.</p> <p>Manual authoring of such scripts took time. The scripts were often brittle due -to the complex nature of modern websites, and they lacked optimizations such as +to the complexity of the modern web, and they lacked optimizations such as bypassing the UI and retrieving the data files directly when possible, which would have significantly reduced our compute costs.</p> <p>To alleviate these challenges, I, with the help of a colleague, Andy Zhang, -built Bumblebee: a C# Windows Forms desktop application that uses Microsoft -Edge <a src="https://developer.microsoft.com/en-us/microsoft-edge/webview2" class="external" target="_blank" rel="noopener noreferrer">WebView2</a> for -rendering web content.</p> +built Bumblebee: a web browser powered by C# Windows Forms, Microsoft Edge <a src="https://developer.microsoft.com/en-us/microsoft-edge/webview2" class="external" target="_blank" rel="noopener noreferrer">WebView2</a>, and +the <a src="https://github.com/desjarlais/Scintilla.NET" class="external" toarget="_blank" rel="noopener noreferrer">Scintilla.NET</a> text editor.</p> <p>Bumblebee works by injecting a custom JavaScript program that intercepts client-side events and sends them to Bumblebee for analysis. In addition to front-end events, Bumblebee also captures internal browser events, which it then interprets to generate code in real time. Note that we developed Bumblebee -before the advent of now-popular LLMs. Bumblebee reliably handles dynamic -websites and pop-ups. The user can access developer tools, override any part of -the script at any point during the session (using the embedded <a src="https://github.com/desjarlais/Scintilla.NET" class="external" target="_blank" rel="noopener noreferrer">Scintilla.NET</a> editor), debounce -events, and block hidden elements and scripts.</p> +before the advent of now-popular LLMs. Bumblebee supports dynamic websites, +pop-ups, developer tools, live manual override, event debouncing, and filtering +hidden elements and scripts.</p> <p>Before settling on a desktop application, we contemplated designing Bumblebee as a browser extension. We chose the desktop app because extensions don’t offer the deep, event-based control we needed. Besides, the company’s security policy, which prohibited browser extensions, would have complicated the -deployment of an extension-based solution. The initial prototype used a C# -wrapper of the Chromium project instead of WebView. WebView’s more intuitive -API and its seamless integration with Windows Forms led us to choose it over -the Chromium wrapper.</p> - -<p>Bumblebee predictably reduced the time we spent on authoring scripts from hours -to a few minutes. Since the code generation rules were written and optimized by -experts in web technologies, the quality of the scripts improved as well.</p> +deployment of an extension-based solution. My first prototype used a C# binding +of the Chromium project. WebView’s more intuitive API and its seamless +integration with Windows Forms led us to choose it over the Chromium wrapper.</p> + +<p>What began as a personal side project to improve my own workflow enabled us to +collectively improve the quality of our web scripts at a much larger scale. +Bumblebee predictably reduced the time we spent on authoring scripts from hours +to a few minutes.</p> </div> <p class="post-author right">by W. D. Sadeep Madurange</p> diff --git a/_site/projects/matrix-digital-rain/index.html b/_site/projects/matrix-digital-rain/index.html index 3c441d4..5218c10 100644 --- a/_site/projects/matrix-digital-rain/index.html +++ b/_site/projects/matrix-digital-rain/index.html @@ -53,15 +53,15 @@ Matrix in C, with zero dependencies—not even ncurses.</p> <h2 id="overview">Overview</h2> -<p>This is my fork of Domsson’s beautiful <a href="https://github.com/domsson/fakesteak" class="external" target="_blank" rel="noopener noreferrer">Fakesteak</a>. While studying the code, I wondered -what it would take to faithfully recreate the original Matrix from the first -movie without sacrificing the program’s minimalism and elegance.</p> +<p>This is my fork of Domsson’s beautiful <a href="https://github.com/domsson/fakesteak" class="external" target="_blank" rel="noopener noreferrer">Fakesteak</a>. While going through his code, I +wondered what it would take to faithfully recreate the original Matrix from the +first movie without sacrificing its minimalism.</p> -<p>My version adds:</p> +<p>My implementation supports:</p> <ul> - <li>Unicode character support.</li> - <li>Fully customizable 24-bit RGB (truecolor) colors.</li> + <li>Unicode characters.</li> + <li>24-bit RGB colors (truecolor).</li> <li>Glitches in the matrix.</li> <li>Ghosting effect of old monochrome CRT displays.</li> <li>Closely resembles the Matrix seen in the background during Neo and Cypher’s @@ -76,10 +76,10 @@ $ ./matrix <h2 id="how-does-it-work">How does it work?</h2> -<p>The program tracks the state of the terminal - characters, background and -foreground colors, shading levels, cursor position - using multiple internal -data buffers. On each frame, it updates these buffers and repaints the screen -using ANSI escape codes:</p> +<p>The program tracks the state of the terminal, such as code points, background +and foreground colors, and cursor position, using multiple internal data +buffers. On each frame, it updates these buffers and repaints the screen using +ANSI escape codes:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void term_print(const matrix *mat, size_t row, size_t col) { @@ -94,8 +94,8 @@ using ANSI escape codes:</p> } </code></pre></div></div> -<p>The ghosting effect, the signature feature of this implementation, works by -scaling and mixing the RGB channels:</p> +<p>The ghosting effect is achieved by carefully scaling the RGB +channels before mixing them:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>static void mat_shade(matrix *mat, size_t row, size_t col) { @@ -107,25 +107,24 @@ scaling and mixing the RGB channels:</p> } </code></pre></div></div> -<p>The ghosting function emulates the screen decay by gradually transitioning each -raindrop’s color towards the background color. This approach provides two key -benefits: straightforward color configuration that integrates naturally with -Unix ricing (desktop customization) and high-fidelity recreation of the Matrix -aesthetic.</p> +<p>The ghosting function emulates the dim after glow by gradually transitioning +each raindrop’s color towards the background color. This approach provides two +key benefits: straightforward color configuration that integrates naturally +with (Unix) ricing and high-fidelity recreation of the Matrix aesthetic.</p> <h2 id="customization">Customization</h2> -<p>While you can adjust almost every aspect, including its speed, glitch -frequency, and rain density, the most useful settings for customization are the -color scheme and character set.</p> +<p>While you can alter almost every aspect, including speed, glitch frequency, and +rain density, the most common customizations are the color scheme and character +set.</p> <p>There are three color settings: head, tail, and background. You can configure -them by setting the <code class="language-plaintext highlighter-rouge">COLOR_*_RED</code>, <code class="language-plaintext highlighter-rouge">COLOR_*_GRN</code>, and <code class="language-plaintext highlighter-rouge">COLOR_*_BLU</code> definitions -in main.c.</p> +them using <code class="language-plaintext highlighter-rouge">COLOR_*_RED</code>, <code class="language-plaintext highlighter-rouge">COLOR_*_GRN</code>, and <code class="language-plaintext highlighter-rouge">COLOR_*_BLU</code> definitions found in +main.c.</p> <p>The <code class="language-plaintext highlighter-rouge">UNICODE_MIN</code> and <code class="language-plaintext highlighter-rouge">UNICODE_MAX</code> values control the Unicode block used. For -example, setting them to <code class="language-plaintext highlighter-rouge">0x30A1</code> and <code class="language-plaintext highlighter-rouge">0x30F6</code> rains Katakana (if a font that -supports Katakana is present on the system):</p> +example, setting them to <code class="language-plaintext highlighter-rouge">0x30A1</code> and <code class="language-plaintext highlighter-rouge">0x30F6</code> rains Katakana, if a font that +supports Katakana is present on the system:</p> <p><img style="width: 100%;" src="katakana.png" /></p> diff --git a/_site/robots.txt b/_site/robots.txt index d297064..e087884 100644 --- a/_site/robots.txt +++ b/_site/robots.txt @@ -1 +1 @@ -Sitemap: http://localhost:4000/sitemap.xml +Sitemap: /sitemap.xml diff --git a/_site/sitemap.xml b/_site/sitemap.xml index 5130d9f..1b23cd3 100644 --- a/_site/sitemap.xml +++ b/_site/sitemap.xml @@ -1,59 +1,59 @@ <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> -<loc>http://localhost:4000/blog/arduino-due/</loc> +<loc>/blog/arduino-due/</loc> <lastmod>2024-10-05T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/blog/arduino-uno/</loc> +<loc>/blog/arduino-uno/</loc> <lastmod>2025-04-10T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/blog/mosfet-switches/</loc> +<loc>/blog/mosfet-switches/</loc> <lastmod>2025-06-22T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/blog/neo4j-a-star-search/</loc> +<loc>/blog/neo4j-a-star-search/</loc> <lastmod>2025-09-14T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/blog/suckless-software/</loc> +<loc>/blog/suckless-software/</loc> <lastmod>2025-11-30T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/e-reader/</loc> +<loc>/projects/e-reader/</loc> <lastmod>2023-10-24T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/matrix-digital-rain/</loc> +<loc>/projects/matrix-digital-rain/</loc> <lastmod>2024-01-12T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/etlas/</loc> +<loc>/projects/etlas/</loc> <lastmod>2024-09-05T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/bumblebee/</loc> +<loc>/projects/bumblebee/</loc> <lastmod>2025-04-02T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/my-first-pcb/</loc> +<loc>/projects/my-first-pcb/</loc> <lastmod>2025-07-14T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/projects/fpm-door-lock/</loc> +<loc>/projects/fpm-door-lock/</loc> <lastmod>2025-10-03T00:00:00+08:00</lastmod> </url> <url> -<loc>http://localhost:4000/about/</loc> +<loc>/about/</loc> </url> <url> -<loc>http://localhost:4000/blog/</loc> +<loc>/blog/</loc> </url> <url> -<loc>http://localhost:4000/</loc> +<loc>/</loc> </url> <url> -<loc>http://localhost:4000/projects/</loc> +<loc>/projects/</loc> </url> </urlset> @@ -22,7 +22,7 @@ title: About <li>blg: Notes and tutorials about software and embedded systems.</li> <li>poc: Projects, prototypes, and experiments.</li> <li>abt: Site information.</li> - <li>rss: RSS (atom) feed.</li> + <li>rss: RSS (Atom) feed.</li> </ul> <h4>Site credits</h4> |
