<?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>Posts on Engineering Journal</title><link>https://wal8800.github.io/posts/</link><description>Recent content in Posts on Engineering Journal</description><generator>Hugo -- 0.154.5</generator><language>en-us</language><lastBuildDate>Sat, 11 Oct 2025 06:00:48 +1300</lastBuildDate><atom:link href="https://wal8800.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Using Claude Code in Kaggle competition</title><link>https://wal8800.github.io/posts/claude-code-kaggle/</link><pubDate>Sat, 11 Oct 2025 06:00:48 +1300</pubDate><guid>https://wal8800.github.io/posts/claude-code-kaggle/</guid><description>&lt;p&gt;I used Claude Code to compete in a &lt;a href="https://www.kaggle.com/competitions/neurips-open-polymer-prediction-2025"&gt;Kaggle Competition&lt;/a&gt; (From Jun 17, 2025 to Sep 16, 2025).&lt;/p&gt;
&lt;p&gt;My setup was running python scripts on my local machine.
At the time, I found Claude Code produces relatively fewer errors creating and editing python scripts compared to python notebooks. It struggled to correctly edit the python content inside the ipynb file format, which led to more syntax errors and malformed code.&lt;/p&gt;
&lt;p&gt;Using Opus plan mode, this means Opus 4.1 during planning, Sonnet for the actual coding to save Opus storage for the more complicated scenarios.&lt;/p&gt;</description></item><item><title>The Design of Everyday Things in Software Development</title><link>https://wal8800.github.io/posts/the-design-of-everyday-things/</link><pubDate>Sun, 04 May 2025 17:00:48 +1300</pubDate><guid>https://wal8800.github.io/posts/the-design-of-everyday-things/</guid><description>&lt;p&gt;&lt;em&gt;The Design of Everyday Things&lt;/em&gt; is a book about how humans interact with products, offering principles and frameworks that help improve user experience.
What has stuck with me the most is how these principles appear not just in the end-user experience of a software product, like a web or mobile app, but throughout broader system design and the entire development life cycle. It is fascinating to see how software systems apply these ideas to improve usability for everyone involved, including developers, operators, and users. Here are some of the principles:&lt;/p&gt;</description></item><item><title>Running LLM locally</title><link>https://wal8800.github.io/posts/llm-20-questions/</link><pubDate>Wed, 09 Oct 2024 17:00:48 +1300</pubDate><guid>https://wal8800.github.io/posts/llm-20-questions/</guid><description>&lt;p&gt;I was looking to run LLM locally to develop a bot to compete in &lt;a href="https://www.kaggle.com/competitions/llm-20-questions"&gt;a 20 questions competition.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Found &lt;a href="https://github.com/abetlen/llama-cpp-python"&gt;llama-cpp-python&lt;/a&gt; (a python binding on top of &lt;a href="https://github.com/ggerganov/llama.cpp"&gt;llama-cpp&lt;/a&gt;) which enables us to run LLM with variety of hardwares. This is useful since I only have an old gaming GPU with little memory (8GB).&lt;/p&gt;
&lt;p&gt;First, we need to download a LLM model. There are huge selection of LLM models that fine tuned and quantised in &lt;a href="https://huggingface.co/models"&gt;hugging face model hub&lt;/a&gt; to run locally. The &lt;a href="https://www.reddit.com/r/LocalLLaMA"&gt;LocalLLaMa subreddit&lt;/a&gt; is also a great resource about the latest LLM models, their performance benchmark and actual user experience.&lt;/p&gt;</description></item><item><title>Graph attention network</title><link>https://wal8800.github.io/posts/graph-attention-network/</link><pubDate>Sun, 10 Mar 2024 17:47:48 +1300</pubDate><guid>https://wal8800.github.io/posts/graph-attention-network/</guid><description>&lt;p&gt;&lt;em&gt;Paper&lt;/em&gt;: &lt;a href="https://arxiv.org/pdf/1710.10903.pdf"&gt;https://arxiv.org/pdf/1710.10903.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Graph attention network (GAT) is a type of graph neural network with a self attention layer during the graph updates. The attention layer learns relative importance between the incoming source nodes for the target node. As a result, when updating the target node’s value during training, the source nodes with higher importance have a bigger impact on the target node’s updated value.&lt;/p&gt;
&lt;br&gt;
&lt;figure&gt;
&lt;svg style="width: 100%; height: 100px;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="241px" height="81px" viewBox="-0.5 -0.5 241 81"&gt;&lt;defs/&gt;&lt;g&gt;&lt;g&gt;&lt;path d="M 80 40 Q 80 40 152.13 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/&gt;&lt;path d="M 158.88 40 L 149.88 44.5 L 152.13 40 L 149.88 35.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/&gt;&lt;/g&gt;&lt;g&gt;&lt;ellipse cx="40" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;/g&gt;&lt;g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 1px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Source&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="40" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Source&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;ellipse cx="200" cy="40" rx="40" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/&gt;&lt;/g&gt;&lt;g&gt;&lt;g transform="translate(-0.5 -0.5)"&gt;&lt;switch&gt;&lt;foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 40px; margin-left: 161px;"&gt;&lt;div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"&gt;&lt;div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"&gt;Target&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;text x="200" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle"&gt;Target&lt;/text&gt;&lt;/switch&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;figcaption style="text-align: center; font-style: italic;"&gt;source node is the node where the edge is pointing from and target node is the edge is pointing to&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br&gt;
&lt;p&gt;So how does it work? Let&amp;rsquo;s go through the equations in the paper with code.&lt;/p&gt;</description></item><item><title>Running Big Two in the browser</title><link>https://wal8800.github.io/posts/running-card-game-browser/</link><pubDate>Fri, 25 Aug 2023 17:47:48 +1300</pubDate><guid>https://wal8800.github.io/posts/running-card-game-browser/</guid><description>&lt;p&gt;For a while, I have been wanting to create a web app client for the Big Two bot I have trained. However, I didn&amp;rsquo;t want to rewrite the Big Two game logic from python to javascript. Then I heard about Pyodide, it&amp;rsquo;s a python distribution that runs on the browser. This means we can run python code in the web browser!&lt;/p&gt;
&lt;p&gt;So I hacked together a small react app that uses the existing python logic and tensorflow model. With minimal experience with web frontend, I used react-create app to quickly get started. The app also uses react pixi.js library to render some simple graphics for the card game. Here are the interesting bits found while putting together the web app.&lt;/p&gt;</description></item><item><title>Writing plain code</title><link>https://wal8800.github.io/posts/how-to-write-plain-code/</link><pubDate>Sat, 27 May 2023 17:47:48 +1300</pubDate><guid>https://wal8800.github.io/posts/how-to-write-plain-code/</guid><description>&lt;p&gt;Looking to improve the clarity of my technical writing, I read &amp;ldquo;Oxford Guide to Plain English&amp;rdquo;. The book provides different guidelines to help people to write in Plain English. It uses the definition of Plain English from &lt;a href="https://plainlanguagenetwork.org/plain-language/plain-language-around-the-world/"&gt;Plain Language Association International&lt;/a&gt;. Plain English is defined as &amp;ldquo;A communication is in plain language if its wording, structure, and design are so clear that the intended audience can easily find what they need, understand what they find, and use that information.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Ray RLlib and OpenTelemetry</title><link>https://wal8800.github.io/posts/ray-rllib-opentelemetry/</link><pubDate>Sat, 08 Oct 2022 17:00:48 +1300</pubDate><guid>https://wal8800.github.io/posts/ray-rllib-opentelemetry/</guid><description>&lt;p&gt;&lt;em&gt;This blog post assumes the reader have basic understanding of reinforcement learning and PPO algorithm. Recommended to read: &lt;a href="https://spinningup.openai.com/en/latest/algorithms/ppo.html"&gt;https://spinningup.openai.com/en/latest/algorithms/ppo.html&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href="https://docs.ray.io/en/latest/rllib/index.html"&gt;Ray RLlib&lt;/a&gt; to train an agent to play a card game. The time to train with RLlib&amp;rsquo;s PPO was taking longer compared to the &lt;a href="https://github.com/Wal8800/card-games/blob/main/algorithm/agent.py#L249"&gt;self implemented PPO training&lt;/a&gt; when using the same number of epoch.
My hunch was that there are some configuration and implementation differences between RLlib PPO training and my own implementation. &lt;strong&gt;I need to be able to accurately measure the time taken as I change the configuration on RLlib PPO training runs to improve the training time.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Application Indicator in Ubuntu 20.04</title><link>https://wal8800.github.io/posts/application-indicator-ubuntu/</link><pubDate>Sat, 04 Jun 2022 17:47:48 +1300</pubDate><guid>https://wal8800.github.io/posts/application-indicator-ubuntu/</guid><description>&lt;p&gt;At my previous job, I was using &lt;a href="http://ptsochantaris.github.io/trailer/"&gt;this trailer app&lt;/a&gt; to access and manage my github pull requests. The trailer app provides an app indicator on top of the menu bar. Clicking on the icon shows a list of pull requests along their status and the list gets automatically updated. This app is only available on MacOS.&lt;/p&gt;
&lt;p&gt;After switching to my new job, I started using Ubuntu 20.04 and I couldn&amp;rsquo;t find an equivalent application. I wanted to see what it takes to create an app indicator application on Ubuntu and maybe create one myself if it&amp;rsquo;s easy.&lt;/p&gt;</description></item><item><title>Mac address spoofing in LineageOS 17.1 on Raspberry Pi 3</title><link>https://wal8800.github.io/posts/mac-address-spoofing-lineage-os/</link><pubDate>Mon, 28 Feb 2022 20:15:48 +1300</pubDate><guid>https://wal8800.github.io/posts/mac-address-spoofing-lineage-os/</guid><description>&lt;p&gt;I wanted to change the mac address on the Raspberry Pi. After a bit of googling, I was able to change the mac address using &lt;code&gt;ip link&lt;/code&gt; however
when the device is rebooted, the changes are reverted. It appears there isn&amp;rsquo;t an easy way to change the mac address permanently so I decided to create
a script to apply the changes on start up.&lt;/p&gt;
&lt;p&gt;Fortunately, the LineageOS raspberry build already came with support for running start up scripts from &lt;code&gt;/system/etc/init.d/&lt;/code&gt;. This means I just needed to add script in there.&lt;/p&gt;</description></item></channel></rss>