Skip to main content

Posts

AI coding tools fragmentation

Executive Summary The discussion centers on a tweet by DHH (David Heinemeier Hansson) from January 10, 2026 , arguing against the fragmentation of AI coding tools. DHH contends that developers do not want a separate CLI for every model provider (e.g., Anthropic’s Claude Code, OpenAI’s tools). Instead, he advocates for a unified interface —specifically citing OpenCode —that allows developers to swap models within a single environment. The thread reveals a three-way tension in the developer community between convenience (unified tools), corporate control (walled gardens), and sovereignty (running local models). Key Discussion Themes 1. The Fatigue of Fragmentation The Problem: Developers are exhausted by "model choice fatigue" and the need to manage multiple CLIs. As Rob Zolkos noted, the fragmentation is absurd, leading some to write scripts just to manage their AI CLIs. The Desire: There is a strong consensus (DHH, Will McGugan, Mustafa Ergisi) that a "universal s...

Ubuntu 22.04 Wayland share screen

 After switching to Dell XPS 13 which running Ubuntu 22.04, I noticed that trying to share screen through Google Meet, it shows this:-    This - Use operating system settings, I never saw it before. Usually here we will be presented the windows that we want to share.  It turned out that screen sharing in Ubuntu 22.04 indeed an issue, due to the use of Wayland instead of Xorg as its display server. Many suggested to disable wayland and back to use Xorg. I try to avoid that since Wayland seems to works fine so far. After some searching, the conclusion seems we can make this working by installing some packages. sudo apt install xdg-desktop-portal xdg-desktop-portal-gnome But it turned out that I have already installed the packages! So what were the problems?  Well, turn out it's more psychological than technical. Since the pop up is different than what I'm used to before, I never click the allow button. But clicking the allow button we will see this:-   Which...

Creating tag from github web UI

 Problem: I have Github Actions that automatically create a new release when certain tag is pushed. The only way to create tag from github web interface is to create a new release. The Actions[1] I'm using however failed with error message:- Validation Failed: {"resource":"Release","code":"already_exists","field":"tag_name"} If the tag was created from release. We can create the tag using another Actions, there are a number of Actions that provide that. First I try using Github Script:- name: "create-tag" on: workflow_dispatch: inputs: tagname: description: 'Enter tag' required: true type: string jobs: create_tag: name: "Create tag" runs-on: "ubuntu-latest" steps: - name: Create tag ${{ inputs.tagname }} uses: actions/github-script@v5 with: script: | github.rest.git.createRef({ ...

Google Family Link Android Device isn't ready

 When setting up Family Link for my kid, the setup keep failing and just showing very unhelpful error message "Something went wrong ..". Since the phone doesn't has family link installed yet, I try to login with my account first and installed Family Link app. Opening the app, on my kid's account status, I can see it shows "Device isn't ready for ...". I removed my account (since family link account can't share device) and try to add my kid's account again. This time the setup went through! So if you're facing similar issue and doesn't has Family Link app installed on the device yet, try to install the app with your own account first, before setting up your kid's account.

VS Code editor in browser

 There are 2 options, basically:- code-server OpenVSCode What's the difference? Excerpt from code-server's FAQ:- code-server and OpenVSCode-Server both allow you to access VS Code via a browser. The two projects also use their own forks of VS Code to leverage modern VS Code APIs and stay up to date with the upsteam version. However, OpenVSCode-Server is scoped at only making VS Code available in the web browser. code-server includes some other features: password auth proxy web ports certificate support plugin API settings sync (coming soon)  So I decided to try code-server. Installation is straightforward, as copied from the docs page:- curl -fsSL https://code-server.dev/install.sh | sh After that you can run it as:- PORT=3000 code-server To actually access that from my laptop, I just use ssh port forwarding:- ssh -L 3000:localhost:3000 my-server I can then access it through my browser at https://localhost:3000/. You'll need to copy password from ~/.config/code-server/co...

PHP with docker

A friend asking about a PHP library and I decided to test whether that library is working. But I don't have PHP environment setup (we're Python shop btw). But thanks to docker, that's easy these days. docker run -it --tty --rm --volume $PWD:/app --user $(id -u):$(id -g) composer require google/apiclient:^2.0 Then we just need to create the script to run, still in the same directory:- include_once __DIR__ . '/vendor/autoload.php'; $GCSE_API_KEY = "nqwkoigrhe893utnih_gibberish_q2ihrgu9qjnr"; $GCSE_SEARCH_ENGINE_ID = "937592689593725455:msi299dkne4de"; $client = new Google_Client(); $client->setApplicationName("My_App"); $client->setDeveloperKey($GCSE_API_KEY); $service = new Google_Service_Customsearch($client); $optParams = array("cx"=>self::GCSE_SEARCH_ENGINE_ID); $results = $service->cse->listCse("lol cats", $optParams); And we can run that script again using docker:- docker run -it --...

Receiving Email Using SES

There's service like Pawnmail (seem to be down now) that allow you to receive email on your custom domain. But that's a third party and mean adding another one into your trust list. Since we already using AWS, I'm wondering if it has anything that can receive email. They have SES that usually used to send email. But turn out SES can also receive email. So just add the MX record in your DNS to inbound-smtp.us-east-1.amazonaws.com. Next is to configure the domain and address to receive the email. The received email need to be forwarded somewhere like to your application for processing but that's overkill. I need something simpler. Here come SNS, Simple Notification Service. So the email can be forwarded to an SNS Topic. From the SNS Topic you can create Subscription that will forward the email to your actual email, finally. SNS will send the email as JSON so if you received HTML email that will be appear in your inbox as is. But since I can read HTML, t...

The rise of localhost

I noticed a pattern in dex world, where you build client backend to participate in the network, and then build a web app that simply connect to  localhost:someport  for the UI. To check my scuttlebutt updates, I opened up http://localhost:8027/. For those using Ethereum Parity wallet, they can open it at http://localhost:8180/. ZeroNet users are browsing at http://localhost:43110/. But Parity for example, try to make it seamless, they still provide a dns - web3.site which then redirected to home.web3.site which simply resolved to 127.0.0.1. But this I think bring up some problem, especially non-tech user which think that Parity is a website hosted by Parity Technologies. I seen this in a some articles about the latest bug .

The first step in learning new programming language

Is to prepare the basic environment where you can freely try and experiment with the new language features and tools. Maybe because I'm not programmer type person, but more as tinkerer/builder, I hate learning the language syntax and stuff. For years after I started "learning" Python, I can't barely write any Python code. But I have manage to try lot of Python cool apps because I have that environment for me to experiment with all Python based applications. All these cool apps that get me hooked to the language, not the syntax or whatever language features. And in my experiences, this is one reason why people failed to get hooked on the new language they want to learn. They started learning with some of the language syntax and eventually get bored, because not so much interesting stuff there. In whatever programming language, it's the ecosystem that made it lively, and where the real work happened. Early this year, I made it a point to learn Go programmin...

Notes on AWS Lightsail

Finally, I'm trying Amazon Lightsail. Just few notes:- 1. The direct console is great. This is basically what EC2 should have, instead of web ssh console. You need this console to verify the ssh key fingerprint before connecting through ssh first time. 2. There's simple firewall manager. Only port 22 and 80 opened by default. Click Manage from the instance menu to get into the firewall manager. 3. Now there's apac region !

A brief look into nginx unit

So nginx has come out with it's own application server that can run multiple types of application from PHP, Python and Go, with more languages support coming soon. Deployment is always my topic of interest  so this kind of news definitely caught my eyes. There's not much technical information yet, other than the official blog post . I'm quite interested to know how the python support being implemented. The Application model also remind me to the Webfaction hosting model and with unit HTTP API, it provide possibility to implement something like Webfaction hosting panel where you can add new application and manage it all through just a web interface. Reading through the source code of python module support, it look like python wsgi application is being executed in-process through python C API (my guess), particularly if you look at the line 337:- result = PyObject_CallObject (nxt_py_application, args); For Go application however it simply execute the Go built-in ...

List of DNS server software

It's been quite a long time I'm not following the recent development in dns scene, especially on the server software itself. In the past, I did try setting up my own BIND installation just to understand how all these things work. I tweet reminded me back:- Best #PowerDNS ni, siap http api. Auto SOA increment. #thorbaek — FryShadow (@FryShadow) August 15, 2017 So what else dns server software we have these days other than BIND 9 ? PowerDNS (as in tweet above). CoreDNS - now also a server type plugin of Caddy. It's a successor of SkyDNS. SkyDNS - SkyDNS is a distributed service for announcement and discovery of services built on top of etcd . Knot NSD

How smart-contract is possible in blockchain ?

The idea was derived from the scripting support in bitcoin. Part of bitcoin transaction contain a Script, a stack based language that will be executed to verify the transaction. Complex conditions can be expressed in this language, which has 80 different opcodes including arithmetic, bitwise operations, string operations, conditionals, and stack manipulation. This language however still pretty limited, such as not having loop and thus not Turing complete. So new blockchain implementation like Etherium expand the idea further to include support for real programming language, thus enabling more complex conditions to the blockchain transaction, which now commonly known as smart-contract . Side note, making bitcoin transaction in python .

How to build your own programming language

I've always fascinated in how programming languages are built and have made it into my 2017's new year resolution to learn building one myself. So here are all the notes collected along the way. My presentation at Malaysia Open Source Conference - How to build your programming language ?  I plan to extend this presentation at upcoming PyCon APAC  in this August with an example in Python. A write up in Malay - Bagaimana bahasa pengaturcaraan dibina ? A series on building simple interpreter in Python by Ruslan Plivak - Let's Build a Simple Interpreter ! A book on writing an interpreter with Go (Golang). I'm still making up my mind whether to buy this or not -  https://interpreterbook.com/ . Free book on building interpreter using Java and then C . This is not complete yet but the author also recommend Interpreter book above in his reply to my reddit's comment. (Updates 2020: It's complete now!) List of reddit's threads related to chapters in t...

My Python Workflow

This is basically what I did whenever starting on new Python project. mkdir project_name cd project_name wget https://bootstrap.pypa.io/bootstrap-buildout.py vim buildout.cfg Where my buildout.cfg look like:- [buildout] parts = main [main] recipe = zc.recipe.egg eggs = python-telegram-bot interpreter = python Then I just execute the following to get my new python environment initialize:- python bootstrap.py ./bin/buildout A python interpreter that already has access to my packages dependencies - in this case python-telegram-bot is ready in ./bin/python . I'm a fan of buildout and shall write more about it in later post.

Trying out Ajenti

Ajenti is server control panel, in the same space as Webmin. It allow you to manage your linux server directy via web interface. In term of installation, Ajenti really win. All available as OS packages, so if using Ubuntu or Debian it just a matter of apt-get. The initial installation is covered by a script that you download from Ajenti's website. wget -O- https://raw.github.com/ajenti/ajenti/1.x/scripts/install-ubuntu.sh | sudo sh One thing that tripped me up is that I thought the web hosting plugins also in the same packages. Turn out it a separate package called ajenti-v (It clearly shown on the website, so my bad). To get the webhosting packages you need to install ajenti-v package. sudo apt-get install ajenti-v ajenti-v-nginx ajenti-v-mysql ajenti-v-php-fpm php5-mysql ajenti-v-python-gunicorn If you have already install apache2 before, you need to remove it as Ajenti-v use nginx. The whole experiences of getting a Django website running is still not very s...

AWS: Allowing IAM user to manage their own MFA device

When enabling MFA (Multi-factor Authentication) on AWS Web Console, only users with admin privilege can configure the MFA device for each IAM user. This pose a problem if your users are not in the same physical location. To allow each IAM user to be able to configure the device on their own, you must add specific IAM policy:- http://docs.aws.amazon.com/IAM/latest/UserGuide/Credentials-Permissions-examples.html#creds-policies-mfa-console If you're using the default PowerUserAccess, that policy also basically remove access to the whole IAM so make sure to change that too. The default policy:- {   "Version": "2012-10-17",   "Statement": [     {       "Effect": "Allow",       "NotAction": "iam:*",       "Resource": "*"     }   ] } Change that to:- { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", ...

Apache read raw request data

It's not possible to get the whole raw request data from within PHP. You can get the request body using php://input but not the headers. Searching around, I found that you can log the request data from apache  using mod_dumpio . It will dump the incoming request data to error.log. As mentioned in the docs, for apache version < 2.4, you have to set LogLevel to debug. One catch with this is to make sure none of your virtualhost config has LogLevel higher than debug otherwise you'll not get output from this module. Also make sure you didn't set the LogLevel to debug but going down the config, another LogLevel exists and set to something else. Happened to me.

Craft HTTP requests using nc

To do some low level check on websites, I'd usually use telnet to compose a http requests against the server. The main intention is to talk directly to the server port to make sure the problem we have not caused by some higher level application. For example, to connect to server and issue a GET request:- telnet k4ml.github.io 80 Trying 199.27.75.133... Connected to github.map.fastly.net. Escape character is '^]'. GET / Connection closed by foreign host. There's always a problem with telnet. In the above example, I can only issue a GET request without having a chance to add other HTTP headers such as HOST before the server close the connection. Some websites also time out very quickly when they are not receiving any data after establishing connection. And since the above command is in interactive session, it's not repeatable or scripted. Using nc seem to be much better. Specify the virtual host:- echo -en "HEAD / HTTP/1.1\r\nHOST: k4ml.github.io\r\n\r\n...

Weekend project

Quick weekend project - a website to search for 'halal' status of products in local market. The data was scraped from JAKIM website. The primary motivation for doing this is to search for halal status from my mobile phone - small feature phone with browser (not android). The JAKIM website can't even being displayed on my phone. It used Django at the backend and the well known Twitter Bootstrap for the frontend page. This is my first use of Bootstrap, it simply work out of the box for mobile browser (mine is the old opera mini, 3.0 something I guess). I try to avoid Django for weekend project but the offer django-haystack has for quick search tool is too tempting so I decided to still use Django for this one. The search backend is Whoosh with the integration mostly done by haystack. Scraping JAKIM website not easy, the data are all in heavily nested html tables with no id or class to identify. I use python lxml lib to parse the html. When user search for keyword, it wi...