Category Archives: Notes

Awesome papers (developer focused)

This summary is touched-up by AI.

On the Criteria to Be Used in Decomposing Systems into Modules

Paper: criteria_for_modularization

This paper introduced information hiding as the fundamental principle for modular design. Instead of breaking systems apart by what they do i.e. mapping a flowchart onto modules, it argues we should decompose them by what design decisions are likely to change i.e. one module per decision which is likely to change.

Impact: This idea underpins encapsulation, stable APIs, and modern system boundaries — from object-oriented design to microservices. Nearly every discussion about maintainability traces back here, whether explicitly or not.

A Note on Distributed Computing

note-distributed-computing

This paper explains why distributed systems are not just “local systems with a network.” It highlights hidden assumptions—like zero latency or perfect reliability—that break down immediately once computation is spread across machines.

Impact: It became a foundational text for distributed systems thinking. The ideas influenced RPC design, cloud architecture, and the now-famous fallacies of distributed computing.

The Next 700 Programming Languages

Landin66-next-700-languages

Rather than proposing a new language, this paper introduced a framework for describing programming languages using mathematical foundations. It showed that languages could be reasoned about formally, not just implemented ad hoc.

Impact:
This work shaped the field of programming language theory and semantics. Many modern functional and hybrid languages owe their conceptual clarity to ideas introduced here.

Can Programming Be Liberated from the von Neumann Style?

This paper critiques imperative, state-heavy programming and argues for a functional alternative built around composition and mathematical reasoning rather than mutable state.

Impact:
It helped legitimize functional programming as a serious alternative, influencing languages, compilers, and parallel programming models.

Reflections on Trusting Trust

This paper demonstrates how a compiler can be maliciously modified to insert backdoors—even when the compiler’s source code appears clean. It shows that trust in software cannot rely solely on source inspection.

Impact:
It permanently changed how we think about trust, compilers, and software supply chains. The ideas are still central to discussions about reproducible builds and secure toolchains.

Lisp: Good News, Bad News, How to Win Big

This essay reflects on why technically superior systems often lose to simpler, more pragmatic ones. It contrasts ideal design with real-world adoption pressures.

Impact:
It popularized the “worse is better” philosophy, influencing how engineers think about trade-offs, simplicity, and adoption.

An Experimental Evaluation of the Assumption of Independence in Multiversion Programming

This paper experimentally challenges the idea that independently developed software versions fail independently—a key assumption in fault-tolerant system design.

 

Abstract of “AN EXPERIMENTAL EVALUATION OF THE ASSUMPTION OF INDEPENDENCE IN MULTI-VERSION PROGRAMMING”

Impact:
It forced a reevaluation of N-version programming and influenced how safety-critical systems are designed, tested, and certified.

Arguments and Results

This paper reframes design patterns not as code recipes, but as arguments—ways to reason about design trade-offs and communicate intent.

Impact:
It shifted how patterns are taught and discussed, emphasizing design rationale over mechanical reuse.

A Laboratory for Teaching Object-Oriented Thinking

This paper advocates teaching object-oriented design through experimentation, feedback, and responsibility-driven design rather than rigid theory.

Impact:
Its ideas influenced OO pedagogy, agile practices, and test-driven development.

Programming as an Experience: The Inspiration for Self

This paper focuses on programming as a human experience, emphasizing simplicity, immediacy, and live exploration rather than static abstractions.

Impact:
It influenced IDE design, live programming environments, and dynamic languages that prioritize developer experience.

A dog is scratching himself in a sunny February day in Bengaluru, India

February 01, 2026 – Weekly Notes

  • I spent last month (Jan 2026) interviewing and job hunting. I have one offer that feels good, and I may receive another by the end of this week. I also have one interview left that starts next week.
  • I really enjoyed Veeam’s interview process. The Toyota interview went great as well. I was a bit disappointed with Cloudflare’s process—I was expecting them to reschedule after I missed the second round.
  • Kaalu is now officially overweight. She weighs 25 kg; her ideal weight is 20 kg. Dieting doesn’t work since the whole neighbourhood feeds her, and she eats competitively outside.
  • I’m thinking of migrating from Notion to WordPress. Notion is great at what it does, but the publishing options are less than ideal. I’m also reluctant to pay $12 per month for it. They should bring back the $5 personal plan! It feels like they’re moving more toward enterprise users.

Drainage Dogs

For the last few years, occasionally, I witness a curious behavior from some street dogs. When they see me, they don’t bark or wag tail (often both together) but quickly run away and hide in road side drainage. A bit like rats!

I think I know what’s going on.

The municipality has aggressively been neutering dogs in my locality. Road-side drainage provides an escape from the capture from neutering. Any strategy that helps dogs survive the neutering is being selected for.

Drainage in any Indian city are usually in bad shape, unkempt and usually not covered. Most days they do not have flowing water. Dogs can enter and exit these drainage easily, sleep inside them, and also raise their pups. A non-zero percentage of dogs that are now breeding heavily are using these drainage effectively.

No wonder that their pups have learnt this behavior. Instead of barking at me or interacting with me in more benign ways, they quietly run to their shelter like a rat when they see unknown humans approaching them. This keeps them safe from neutering from municipality staff to breed another day.

A black dog is resting in her bed

January 10, 2026: Weekly Notes 2026/02

  • I’m trying to set up an engineering workflow at Dognosis (my current employer). After brainstorming with ChatGPT, I ended up with a template: Engineering Workflow Rhythm for a 20–100 Person Startup.
  • I clearly spelled out what I was looking for in the prompt—and what I didn’t want:
    • The first thing in the week is a short meeting; everyone should know they’ll work independently for the rest of the week.
    • Every Friday, we review work, update status, and report to stakeholders.
    • During the week, no cat herding. Each engineer acts like a professional and is treated like one (I don’t ask for updates).
    • Write before talking. Every meeting must have a written agenda.
  • I did the same exercise with Gemini. The results were not to my liking. ChatGPT’s responses were short, pointed, and—most importantly—felt implementable. Gemini, on the other hand, used language I don’t usually hear from good engineers. It added phrases that would make a PHB from Dilbert proud.
  • You may also like this post:Small projects, clear scope | Swizec Teller, along with his other posts on related topics.
  • I used to think std::move was C++’s way of implementing Rust-like move semantics. Turns out it’s another confusing monstrosity created by the committee that doesn’t do what it sounds like (f**king RAII?). std::move doesn’t move anything: A deep dive into value categories. Academic-type people should never be in charge of a language—or anything used by many people. Get a few normal programmers onto the committee, you C++ 😡.
  • 💡 Suddenly there’s a lot of incoming interest in my resume. Either the job market is heating up, or my resume is finally making sense to people. I spent over three months tweaking it (revisiting once a week). Talking to AI about my resume helped a lot.
  • 💬 I gave a few interviews this week.
    🚗 Toyota Connected is almost done. It’s Rust + firmware + software-defined vehicle work, which I’m pretty excited about. The interview itself was very pleasant: the technical team asked relevant questions and were very friendly. I felt comfortable after the first five minutes and didn’t suffer from brain fog.
  • Another interview was with a seemingly good company working in the secure computation domain. Senior leadership described the role one way, while the interviewer described it differently. The interviewer was very focused on dotting i’s and crossing t’s on a LeetCode question—and asked me to write code in Google Docs! I’m not really sure what he wanted to see. You meet every kind.
  • I had a first round with Cloudflare. I applied for a zero-trust and data-protection–focused role. They have the network, they have the edge—I wouldn’t be surprised if they start offering secure enclaves and other services where “trust” is explicitly computed.
  • A few surprising moments in the first round: I wasn’t expecting a technical screening but rather a discussion about the role and engineering problems with a manager. It turned out I’m in their general hiring pipeline, which means a phone screen by a manager first. Perhaps I’ll talk to the relevant team later. Not great, but not a deal-breaker.
  • I went through the round and felt I did average. I said a few very dumb things and had some brain fog. We finished early, which I really liked. +1 to the manager for keeping the agenda tight and being professional. I wasn’t very surprised when I was moved to the next round.
  • After that, I did something embarrassing. I made an off-by-one error in real life and ended up missing my second round 😢. I scheduled it for early Saturday morning (00:00 hrs) but marked my desk calendar for Sunday morning. Strong DND settings on both my phone and desktop made it impossible to error-correct—there was no persistent notification. Very unprofessional on my part, though I’m not mad at DND at all.
  • I sent an apology to the interviewer and asked to reschedule, but I’m not sure if this error is recoverable. Let’s see.
  • Three more opportunities are in the pipeline—all incoming interest, and all pretty interesting: hardware/algorithm development for space satellites, Windows security kernel development, and a data backup and protection SaaS.

January 3, 2026: Weekly Notes 2026/01

December 27, 2025: Weekly Notes 2025/28

  • This will be the last weekly notes this year. I started writing them this year about 29 weeks ago.
  • I’ve been living by “If I am not doing it the rest of my life, I am doing it a few times” (professionally). Let’s see how it stands up to the midlife crisis I am supposed to get in a few years.
  • I had to drive to Hyderabad and back to Bangalore this week because of a semi medical emergency. Kaalu The Fifth did well in the car. My No access also did very well. It gave me ~19 km/l mileage on highway. Driving experience was much better this time. This time I drove 90-100 km/hr speed during night without any issue. Though I prefer day-time driving, but two-wheeler and auto-drivers make life miserable on the highway since they can come from any-side anytime.
  • 🏃🏾I missed three days of running because of driving, but I’ll manage to finish 1000km in a couple of days 🎉.
  • Three months ago, I won a 1 gram gold coin from Spinny when I bought a car from them. But it’s not enough motivation to drive to Tanishque store. I won’t be surprised if I won’t collect it in time. Why can’t these people just transfer the money! Who has time to run around for gold?
  • I used to complain to my co-founder about something similar a lot, who’d have preferred to hire someone “senior” who doesn’t use their hands on the code-base. It’s really sad how many “senior” folks you meet during interviews who really don’t really “work on” the project they “manage” or “lead”.

December 20, 2025: Weekly Notes 2025/27

Last week I did not write my weekly note December 13, 2025: Weekly Notes 2025/26

  • 🏃🏾 I am well on track to finish my 1000 km run this year.
  • Some good reads over last couple of weeks.
  • 📗 Misconceptions about rust lifetime was a good read.
  • I need to read Good conversations have lots of doorknobs a few more times.
  • Found author’s draft on domain driven design Microsoft Word _ Book_AfterFinal_doc – Evans03.pdf
    . Domain Driven Design brings team communication to the center. I am a sucker for any idea that improves communication across teams.
  • 🤯 TIL that you can use either public or private key to encrypt/decrypt message.
    I used to think only private key can be used for encryption. I know, I know, LOL indeed.
    Since certificates contain the public key of a CA, you can decrypt encrypted messages sent from them using it.

BackupOnDelete: A Windows Minifilter And User Space App

When a file is deleted by any means possible, you want to ensure a backup of the file before its get permanently deleted. This post describes a windows minifilter and a user-space app working in tandem with minifilter to implement a working solution.

It is not a tutorial. You can browse the code and check if the patterns I’ve used make sense for your project. Additionally, you may like to have a look at the build system, packaging (nsis based installer) and application code.

Later I rewrote the application in Rust but that is not part of this project’s GitHub Repository.

Architectural summary

  • The minifilter monitors certain events in filesystem that says ‘delete this file’ (on close!).
  • Instead of letting kernel delete the file, the minifilter ask the kernel to rename the file (move it to a temporary space) and hide it. For example, if file D:\MyDocuments\important.pdf is being deleted, it will be moved to C:\ProgramData\Minifilter\D:^^MyDocument^^__??important.pdf??__ and then marked hidden. Minifilter also ensures that new file is not renamed by anyone.
  • Original filepath is converted to a special valid filename (filename!) e.g. D:\MyDocuments\important.pdf to D__^^MyDocument^^??important.pdf?? . As long as you can recover the original filepath from new filename unambigously, we are good to go. You can also use base64 encoded paths as filename. I used a simpler scheme since decoding base64 encoded path inside a kernel minifilter was quite a lot of work.
  • The new path is sent to user-space application which backs it in a bucket and then send a message a kernel minifilter to delete the file.
  • When delete this file request come from the user-space application, the minifilter doesn’t modify the delete-file event and let is go down the kernel stack. The kernel delete the file for sure this time.

Minifilter

This kernel minifilter is a cmake based project that also create a nsis based installer and sign it using your personal key. Note that you need to get the minifilter signed by MS or MS approved vendors before you can publish it. To load the minifilter into your machine, you should follow the official guide https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/development-and-testing-tools

  • The minifilter captures required filesystem events:
    CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
    { IRP_MJ_CREATE, 0, BackupOnDeleteShield, NULL },
    // IRP_MJ_SET_INFORMATION is sent whenever file is marked for deletion.
    { IRP_MJ_SET_INFORMATION,
    FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO,
    BackupOnDeleteShield,
    NULL },
    { IRP_MJ_OPERATION_END }
    };
  • See https://github.com/dilawar/minifilter-backup-before-delete/blob/e61e9c5fbfd9df51749d0de98acfbad7b7a6290b/minifilter/src/main.cpp#L396 for the definition of BackupOnDeleteShield function.
  • If the delete request has come from kenel mode application, let is pass. And if the user-space app is not connected with minifilter (more on it later), don’t do anything.

    if (Data->RequestorMode == KernelMode) {

    // if the requestor is kernel mode, pass the request on uninterrupted

    ret = FLT_PREOP_SUCCESS_NO_CALLBACK;

    goto CleanUp;

    }
        //
    // If no client is connected to create backups then there is no point using
    // the shield.
    //
    if (!IsUserAppConnected()) {
    DFLOG(ERROR, "Shield>" __FUNCTION__ ": No backup client connected.\n");
    ret = FLT_PREOP_SUCCESS_NO_CALLBACK;
    goto CleanUp;
    }
  • For an user-space app to talk to minifilter, the minifilter must create a channel to listen to. The port is opened by minifilter ‣. The channel is created using https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/fltkernel/nf-fltkernel-fltcreatecommunicationport

    PORT_STATE
    InitializeServerPort(IN PUNICODE_STRING CommunicationPortName,
    IN PFLT_FILTER Filter)
    {
    NTSTATUS status = STATUS_SUCCESS;

    gServerPortState = PORT_STATE::UnInitialized;

    PSECURITY_DESCRIPTOR SecurityDescriptor;
    OBJECT_ATTRIBUTES ObjectAttributes;

    PAGED_CODE();

    DFLOG(ERROR,
    "Shield>" __FUNCTION__ ": Trying opening port: '%wZ'.\n",
    CommunicationPortName);

    //
    // Create communication descriptor.
    //
    status = FltBuildDefaultSecurityDescriptor(&SecurityDescriptor,
    FLT_PORT_ALL_ACCESS);

    if (!NT_SUCCESS(status)) {
    DFLOG(
    ERROR,
    "Shield>" __FUNCTION__ " : Port is not initialized. Error "
    "FltBuildDefaultSecurityDescriptor - %X.\n",
    status);
    gServerPortState = PORT_STATE::UnInitialized;
    goto CleanUp;
    }

    InitializeObjectAttributes(&ObjectAttributes,
    CommunicationPortName,
    OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
    NULL,
    SecurityDescriptor);

    status = FltCreateCommunicationPort(
    Filter,
    &gServerPort,
    &ObjectAttributes,
    NULL,
    ShieldConnect, // Connect notify callback
    ShieldDisconnect, // Disconnect notify callback.
    ShieldMessage, // message notify callback.
    MAX_CLIENTS);

    if (!NT_SUCCESS(status)) {
    DFLOG(ERROR,
    "Shield>" __FUNCTION__ " : Port is not initialized. Error "
    "FltCreateCommunicationPort - %X.\n",
    status);
    gServerPortState = PORT_STATE::UnInitialized;
    goto CleanUp;
    }

    DFLOG(ERROR,
    "Shield>" __FUNCTION__ ": opened server port handle 0x%p.\n",
    gServerPort);

    gServerPortState = PORT_STATE::Initialized;

    CleanUp:
    if (SecurityDescriptor)
    FltFreeSecurityDescriptor(SecurityDescriptor);

    return gServerPortState;
    }

User-space app

How to connect a user-space app to communicate with minifilter? We opened a port with a name. Use the same name to connect to the port (minifilter). See the app directory in the repository.

C++
void
ShieldClient::connect()
{
port_ = INVALID_HANDLE_VALUE;
HRESULT hr = S_OK;
## ifdef COMMUNICATION_IN_SYNC_MODE
//
// port in sync mode. We don't have to use Overlapped structure here.
// TODO: Not sure about the performance.
//
PLOGI << "Connecting to " << portname_ << " in SYNC mode.";
hr = FilterConnectCommunicationPort(
portname_.c_str(), FLT_PORT_FLAG_SYNC_HANDLE, NULL, 0, NULL, &port_);
## else
// port in async mode. This is the preferred way. Use with completion port.
PLOGI << "Connecting to " << portname_ << " in ASYNC mode.";
hr = FilterConnectCommunicationPort(
portname_.c_str(), 0, NULL, 0, NULL, &port_);
## endif
if (FAILED(hr)) {
PLOGW << "Failed to connect to Shield: Error: 0x" << std::hex << hr;
connected_ = false;
goto MAIN_EXIT;
}
completion_port_ =
CreateIoCompletionPort(port_, NULL, 0, 2 /* 2 user threads */);
if (NULL == completion_port_) {
hr = HRESULT_FROM_WIN32(GetLastError());
PLOGW << "Error in creating completion port. Code: 0x" << std::hex
<< hr;
goto MAIN_EXIT;
}
PLOGI << " ... Successfully connected.";
connected_ = true;
MAIN_EXIT:
if (!connected_ && INVALID_HANDLE_VALUE != port_) {
CloseHandle(port_);
}
}

Messaging

To keep it simple,

  • Each messages has first two bytes of it designated as message code.
  • Next 4 bytes are the size of the message, and rest is the message.

December 6, 2025: Weekly Notes 2025/25

  • 💻I migrates some more code to HTMX — really enjoying working with HTMX.
  • 🔐I was curious if anyone is using Probably Approximately Correct Learning (PAC Learning,
    PAC: Valiant84.pdf ) in cyber-security. Its not yet mainstream but some folks have been proposing it as an alternative to classical ϵδ
    ϵδ-differential privacy
    [2210.03458] PAC Privacy: Automatic Privacy Measurement and Control of Data Processing (summary in
    Trip report: ‘CWI Lectures on Secure Computation’ (Amsterdam, NL) | Roseman Labs Tech Blog). I liked it! PAC gives you lower bounds for free so in many situation, you don’t have to assume or compute the worst-case scenario youself which are great for proving guarantees.
  • 🦀 I also bookmarked 🦀 Patterns for Defensive Programming in Rust | corrode Rust Consulting​
  • 📝Found a another good piece by No access E.W.Dijkstra Archive: The undeserved status of the pigeon-hole principle (EWD 1094)
  • 📕Beej has a new book Beej’s Guide to Learning Computer Science

Updating UI after a successful HTMX request

  • 👎🏾Reload the page. Send response header HX-Refersh which ensures that page is reloaded afters successful request. This is not the greatest of options because refreshing page causes UI to move.
        /**
        * Add HX-Refresh header to response. The client will refresh the page.
        */
        private function addRefreshHeader(): void
        {
            $this->response->setHeader('HX-Refresh', "true");
        }
    
    
  • 👍🏾 Trigger another HTMX read request that fetches the content on success. If you are coming from react/vue, this will feel natural. Send a header like HX-Trigger: HX-Update-My-Table and setup a hx-get to be triggered on this event e.g.
    <h2>My Table</h2>
       ...
      <tbody id="mytable-table" hx-get="/read/my-table" hx-trigger="HX-Update-My-Table from:body">
        ...
      </tbody>
    </table>
    
    <form hx-put="/put/my-table">
      <label>
        Name
            <input name="key" type="text">  
      </label>
      <label>
        Email
            <input name="value" type="text">  
      </label>
    </form>
    
  • There are more interesting options https://htmx.org/examples/update-other-content/

November 29, 2025: Weekly Notes 2025/24

  • 🏃🏾124 km more to go to finish 1000 km run this year. Pretty doable in 32 days!
  • 👨🏾💻I am increasing my use of HTMX. A few things I loved about HTMX
    • I can use server to manage my app’s state. The client does not have to do any state management which is a huge win.
      • I don’t have to use TS/JS everywhere, especially on servers. I can write as little JS as possible.
    • I don’t have to update client when I update my app. Decoupling is easy to achieve!
  • 🏏I gleefully watched South Africa trashing India 2-0 in home test series. Except for Jadeja, not a single player showed any fight or even some grit.
    • Also not giving Bumrah captaincy when Gill was out of the series reinforces the accusation that bowlers are a lower caste in Indian cricket. Even the great spinner Ashwin has to pose with a bat for this autobiography. For the f**k sake!!

  • 📺Plur1bus is an interesting series. Well done!

November 22, 2025: Weekly Notes 2025/23

  • I think I’ll be able to complete 1000 km of run this year without putting any special effort 🤞🏾.
  • Eating outside for food, like movies, is becoming a luxury. Thankfully the traditional South Indian restaurants are still standing strong.
    • Covid had a negative impact on restaurants and car hygiene. We have not recovered from it yet.
    • Weird how things become worse slowly and then get normalized — like garbage in Bengaluru?
  • I applied at a few places for my next startup. I don’t think I did an outstanding job at the application, but time was short.
    • I decided to go through them pretty late. I feel most alive in the driver seat.
    • It doesn’t have to be a startup. An open source project gives me the same feeling.
      You make decisions and you are responsible for everything! You only deal with your own BS 🙂!
  • I meant to write about what went wrong at the previous one. I don’t think I can still write about it, I’ll try soon though.
  • I like EF, Antler, and South Park Commons–like programs. They let you, even encourage you, to walk in from the front door. For someone like me, who never had social capital or connections, this is something to be supported and cherished.
  • I read a funny story on this thread RE: What’s so cool about Scheme?

The venerable master Qc Na was walking with his student, Anton. Hoping to prompt the master into a discussion,
Anton said, “Master, I have heard that objects are a very good thing – is this true?”
Qc Na looked pityingly at his student and replied, “Foolish pupil – objects are merely a poor man’s closures.”

Chastised, Anton took his leave from his master and returned to his cell, intent on studying closures.
He carefully read the entire “Lambda: The Ultimate…” series of papers and its cousins,
and implemented a small Scheme interpreter with a closure-based object system.
He learned much, and looked forward to informing his master of his progress.

On his next walk with Qc Na, Anton attempted to impress his master by saying,
“Master, I have diligently studied the matter, and now understand that objects are truly a poor man’s closures.”
Qc Na responded by hitting Anton with his stick, saying,
“When will you learn? Closures are a poor man’s object.”
At that moment, Anton became enlightened.

November 15, 2025: Weekly Notes 2025/22

Last week note November 8, 2025: Weekly Notes 2025/21

November 8, 2025: Weekly Notes 2025/21

Last week; November 1, 2025: Weekly Notes, 2025/20

November 1, 2025: Weekly Notes, 2025/20

Last week

October 25, 2025: Weekly Notes 2025/19

  • Implementing a moderate-size form is a difficult problem. The UI is probably the easiest part.
    It’s the state management along with UX that makes it hard.
    It gives me the same vibe as working with spreadsheets—easy to get started, looks very simple
    until the data it handles becomes complex.
    Not to mention when relationships among columns or schema changes break almost everything.
  • I think what I am trying to say is that local changes have global effects and the blast radius is very high.
  • The more I learn the way of HTMX, the more I seem to like it.
    I should spend more time writing a few blog posts or examples of HTMX.
  • I am searching for solutions that stop rats from entering the car.
    I learned that ultrasound solutions do not work effectively since rats become habituated to them.
    Some folks suggest peppermint spray, tobacco leaves, etc.
    I park the car in the open, which usually keeps the rats out since street dogs attack them,
    but sometimes I still find rat droppings under the car.
  • Here is a quick way to clean your seat-belt:


October 25, 2025: Weekly Notes 2025/19


1c9395c136d54d75ac1d5388f3dd451e

  • Paying attention to the structure of communication and work is a full-time job.
    I hope more folks write about it in the context of small teams.
    There is a lot of documentation and advice for enterprise-like environments.
  • I’ve started playing with HTMX a little. I used it at work lately.
    Instead of sending JSON from the server, I am sending HTML using HTMX.
    It feels weird at first—but it is not!
    I am still not sure how far I can go with it.
    Note that I have a PHP 8 monolith at work rather than a JSON API + Vue/React app.
  • You can read about it here:

    https://htmx.org/essays/hateoas/
    .
    Note that you can find an equal number of decent articles suggesting why this is a bad idea!
  • It’s been a while since we heard from Evan.
    I’ve been itching to try Elm for a while.
    The frontend is a complex problem, and many folks recommend Elm to deal with it.



  • Which is a better input to an AI—text or pixels?
    Many believe pixels to be better:

    https://news.ycombinator.com/item?id=45658928
    .
    Karpathy worked (works?) at Tesla, which has its driving system entirely based on camera inputs!
  • I find pixels to be a more “natural” input in biological systems than language—for example,
    mammalian vision systems.
    Olfaction and haptics are equally natural.
    All of these modalities look very different from each other to me,
    even though they create final representations in neural activity.
    A bit like how Haskell and TeX are different even though they run on the same processor!!
  • I don’t think there is something terribly common in these two modalities,
    even if there are correlates or similarities in neural representation.
    Perhaps vision is much more complex than other modalities and

    More Is Different | Science
    .

How to use PostGres Enum in Phinx

Currently, Phinx doesn’t support enum for postgres: https://github.com/cakephp/phinx/issues/891. Someone mentioned a solution on the issue (https://github.com/cakephp/phinx/issues/891#issuecomment-774496499).

PHP
$this->execute("create type foo as enum ('bar1', 'bar2')");
$this->execute('alter table table_name add column foo_column foo');

This works! In my project, I’ve used this pattern multiple times. E.g.

PHP
// table to track bag-sample relationship.
$bagSample = $this->table('bag_sample_relationv1');
$bagSample->addColumn('sample_bag_code', 'string', ['null' => false])
->addColumn("sample_code", "string", ['null' => false, 'limit' => 20])
->addColumn('added_at', 'datetime', ['default' => 'CURRENT_TIMESTAMP'])
->addIndex(['sample_bag_code', 'sample_code'], ['unique' => true])
->save();
// add a column with ENUM type.
$this->execute("create type BAG_SAMPLE_STATUS as ENUM('INSIDE', 'OUTSIDE', 'REMOVED')");
$this->execute("ALTER TABLE bag_sample_relationv1 ADD COLUMN status BAG_SAMPLE_STATUS DEFAULT 'INSIDE'");

October 18, 2025: Weekly Notes 2025/18

  • Over this weekend I drove over 1000 km. First to Bellary and then to Hyderabad and back to Bengaluru. Sandur is pretty nice in the morning during late monsoon.
    https://maps.app.goo.gl/hr6ij18By1aSgrQo8
  • I roughly got 16 17 km/l mileage from Nissan Micra XV CVT Micra XV CVT. I usually drive between 80 to 100 km/hr speed on the highway. The Bengaluru – Hyderabad is pretty OK but patches are pretty sub-standard.
    • The AC keeps malfunctioning — the cooling is pretty mild. The local mechanic on the way told me that something is wrong with expansion valve since gas pressure and compressor is working fine. The car is in warranty (from Spinny | Buy and Sell Used Cars). Their experience manager tried his best to schedule a visit in Hyderabad workshop but can’t find a slot since it is Diwali time.
  • I drove back October 25, 2025 night so that I don’t need a fully functional AC. Driving during the day with Kalu without proper functioning ac would be a nightmare for both of us.
    • It took me 9 hours to come back and had to sleep for half an hour on the roadside. Kalu slept during the later two third of the journey. The mild rain helped with temperature.
    • The trucks on the highway are much more well behaved than cars.
  • Drinking coffee to stay awake while driving is not the greatest of the idea. It kinda works but I always feel a “crash” after a while which is probably worse.
    • I still don’t know if there is a good solution to driving when feeling sleepy. If it is a long drive, you should just pull off and sleep in a lodge. But what to do when only couple of hours of driving is left? Some temporary solution may not be the worst of the idea!

October 11, 2025: Weekly Notes 2025/17

October 4, 2025: Weekly Notes 2025/16

  • In next 3 months, I need to run roughly 340 km to finish 1000 km this year. Doable!
  • I finally bought a used car from Spinny | Buy and Sell Used Cars. The experience was good. Test drives were on time and manager was extremely responsive. The car was delivered on time as promised.
    • I got a Nissan Micra which came with Spinny buyback insurance, i.e. they will buy it back for a fixed amount anytime for next 2 years. This car has a CVT automatic transmission, which is pretty smooth. It’s much better than AMT I am used to. The ride quality is nice, though I have no decent experience in other cars.
    • Yesterday, I went to meet a friend in this car. I got a mileage of 7km/l in Bengaluru traffic with AC on. I am hoping to get a >15km/l mileage on the highway and 10km/l in city (I don’t think it is possible in Bengaluru).
  • I found an excellent channel to learn more about working of cars.

    https://youtu.be/zRsAw5h6Thw?si=IIFKZHON7quOfTpm

  • I did not think much about Softwares this week (or last week). Most bandwidth went into buying this car. I am glad it is over.