<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Adhika Setya Pramudita</title><link>https://adhikasp.my.id/</link><description>Recent content on Adhika Setya Pramudita</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 10 Aug 2026 18:27:04 +0800</lastBuildDate><atom:link href="https://adhikasp.my.id/index.xml" rel="self" type="application/rss+xml"/><item><title>Using Nano Banana Pro as 'Browser Engine'</title><link>https://adhikasp.my.id/posts/2025/12/nano-banana-pro-browser-engine/</link><pubDate>Sat, 06 Dec 2025 12:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/2025/12/nano-banana-pro-browser-engine/</guid><description>Randomly I am thinking can we use the Google new Nano Banana Pro model as a &amp;ldquo;browser engine&amp;rdquo;? The goal was to see how it handles rendering a standard HTML page compared to a modern web browser.
The Setup I asked ChatGPT 5.1 Thinking to create it with this prompt
Create a html for a mock business profile landing page about independently owned convenience store. It should be 1 file contain all the html js css It happily produce 1700 line length HTML page for it.</description></item><item><title>Path of Exile Phrecia event builds</title><link>https://adhikasp.my.id/posts/2025/03/poe-phrecia/</link><pubDate>Sat, 01 Mar 2025 18:39:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/2025/03/poe-phrecia/</guid><description>Path of Exile Legacy of Phrecia has been going on for some time, it introduce all new ascendancies so let&amp;rsquo;s see if what new build stands out.
Finding OP build in the event The subreddit r/PathOfExileBuilds is a good place to start mining out information.
Sumarize OP and bait build combining all the discussions. for each reddit thread get all 400 comment with 4 depth - https://www.reddit.com/r/PathOfExileBuilds/comments/1iwudz7/its_been_3_days_review_your_league_event_starter/ - https://www.reddit.com/r/PathOfExileBuilds/comments/1j0jry0/league_been_out_for_a_bit_now_opinions_on_biggest - https://www.</description></item><item><title>Top 3000 comments with the most replies</title><link>https://adhikasp.my.id/notebook/2025/02/hn-top-comments/</link><pubDate>Sun, 16 Feb 2025 19:00:00 +0700</pubDate><guid>https://adhikasp.my.id/notebook/2025/02/hn-top-comments/</guid><description>Show code (25 lines) 1import duckdb 2import pandas as pd 3from IPython.display import HTML 4 5pd.set_option(&amp;#39;display.max_rows&amp;#39;, None) 6pd.set_option(&amp;#39;display.max_columns&amp;#39;, None) 7pd.set_option(&amp;#39;display.width&amp;#39;, None) 8 9conn = duckdb.connect() 10df = conn.sql(&amp;#34;&amp;#34;&amp;#34; 11SELECT 12 by as author, 13 text, 14 array_length(kids) as replies, 15 CONCAT(&amp;#39;&amp;lt;a href=&amp;#34;https://news.ycombinator.com/item?id=&amp;#39;, id, &amp;#39;&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;view&amp;lt;/a&amp;gt;&amp;#39;) as url 16FROM read_parquet(&amp;#39;~/hn-data-fetcher/data_parquet/*/*/*.parquet&amp;#39;) 17WHERE type = &amp;#39;comment&amp;#39; 18 AND text IS NOT NULL 19 AND kids IS NOT NULL 20ORDER BY array_length(kids) DESC 21LIMIT 3000 22&amp;#34;&amp;#34;&amp;#34;).</description></item><item><title>Top 3000 Stories from Hacker News of all time</title><link>https://adhikasp.my.id/notebook/2025/02/hn-top-stories/</link><pubDate>Sun, 16 Feb 2025 14:12:17 +0700</pubDate><guid>https://adhikasp.my.id/notebook/2025/02/hn-top-stories/</guid><description>Show code (22 lines) 1import duckdb 2import pandas as pd 3from IPython.display import HTML 4 5pd.set_option(&amp;#39;display.max_rows&amp;#39;, None) 6pd.set_option(&amp;#39;display.max_columns&amp;#39;, None) 7pd.set_option(&amp;#39;display.width&amp;#39;, None) 8 9conn = duckdb.connect() 10df = conn.sql(&amp;#34;&amp;#34;&amp;#34; 11 SELECT 12 &amp;#39;&amp;lt;a href=&amp;#34;https://news.ycombinator.com/item?id=&amp;#39; || id || &amp;#39;&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;&amp;#39; || title || &amp;#39;&amp;lt;/a&amp;gt;&amp;#39; as title, 13 CAST(score AS INTEGER) as score, 14 &amp;#39;&amp;lt;a href=&amp;#34;&amp;#39; || url || &amp;#39;&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;url&amp;lt;/a&amp;gt;&amp;#39; as url 15 FROM read_parquet(&amp;#39;~/hn-data-fetcher/data_parquet/*/*/*.parquet&amp;#39;) 16 WHERE type = &amp;#39;story&amp;#39; 17 ORDER BY score DESC 18 LIMIT 3000 19&amp;#34;&amp;#34;&amp;#34;).</description></item><item><title>Ping Test to Popular Websites</title><link>https://adhikasp.my.id/notebook/2025/02/ping/</link><pubDate>Sun, 16 Feb 2025 11:12:17 +0700</pubDate><guid>https://adhikasp.my.id/notebook/2025/02/ping/</guid><description>First, we define the webiste to ping. This is collection of popular websites + some Indonesian websites. Show code (37 lines) 1websites = [ 2 &amp;#39;google.com&amp;#39;, 3 &amp;#39;facebook.com&amp;#39;, 4 &amp;#39;apple.com&amp;#39;, 5 &amp;#39;amazon.com&amp;#39;, 6 &amp;#39;microsoft.com&amp;#39;, 7 &amp;#39;netflix.com&amp;#39;, 8 &amp;#39;twitter.com&amp;#39;, 9 &amp;#39;instagram.com&amp;#39;, 10 &amp;#39;linkedin.com&amp;#39;, 11 &amp;#39;youtube.com&amp;#39;, 12 &amp;#39;reddit.com&amp;#39;, 13 &amp;#39;wikipedia.org&amp;#39;, 14 &amp;#39;github.com&amp;#39;, 15 &amp;#39;yahoo.com&amp;#39;, 16 &amp;#39;twitch.tv&amp;#39;, 17 &amp;#39;tiktok.com&amp;#39;, 18 &amp;#39;spotify.com&amp;#39;, 19 &amp;#39;whatsapp.com&amp;#39;, 20 &amp;#39;zoom.us&amp;#39;, 21 &amp;#39;discord.com&amp;#39;, 22 &amp;#39;pinterest.com&amp;#39;, 23 &amp;#39;dropbox.com&amp;#39;, 24 &amp;#39;salesforce.</description></item><item><title>Hacker News Data Exploration</title><link>https://adhikasp.my.id/notebook/hn-data-exploration/</link><pubDate>Sat, 15 Feb 2025 11:53:00 +0700</pubDate><guid>https://adhikasp.my.id/notebook/hn-data-exploration/</guid><description>I have the Hacker News data in the form of Parquet files. It is parsed with my hn-data-fetcher project.
I will be using DuckDB to explore the Hacker News data. I found it much faster than SQLite. Both in term of performance and ease of use as I don&amp;rsquo;t need to do indexing on the table to make it workable.
1import duckdb 2conn = duckdb.connect() 3conn.sql(&amp;#34;CREATE VIEW hn AS SELECT * FROM read_parquet(&amp;#39;~/hn-data-fetcher/data_parquet/*/*/*.</description></item><item><title>Sorting Algorithm Time Scaling</title><link>https://adhikasp.my.id/notebook/sorting-algorithm-time-scaling/</link><pubDate>Sat, 15 Feb 2025 11:53:00 +0700</pubDate><guid>https://adhikasp.my.id/notebook/sorting-algorithm-time-scaling/</guid><description>Sorting is one of those basic algorithms that new programmer and CS students learn.
Maybe you already see the big-O comparison in Wikipedia, or few sites that visualize how the element in sorting move around like this.
In this notebook, we will compare the actual time comparison of different sorting algorithms.
Generating sample data First we need to get random list of integers with different size.
1import numpy as np 2 3sizes = [2**i for i in range(4, 18)] 4random_arrays = {} 5for size in sizes: 6 random_arrays[size] = np.</description></item><item><title>Localfirstwebdev</title><link>https://adhikasp.my.id/link-blog/localfirstwebdev/</link><pubDate>Wed, 12 Feb 2025 20:08:25 +0700</pubDate><guid>https://adhikasp.my.id/link-blog/localfirstwebdev/</guid><description>A style of web development that emphasizes making the data workable in offline environement and sync whenever available.</description></item><item><title>Smolagents</title><link>https://adhikasp.my.id/link-blog/smolagents/</link><pubDate>Tue, 11 Feb 2025 18:40:07 +0700</pubDate><guid>https://adhikasp.my.id/link-blog/smolagents/</guid><description>The next iteration of agents?
LLM + function calling + ReACT is the usual way. But it can only call predefined functions with predefined arguments.
But smollagents do the function calling as part of code exection. It have Python runtime as part of the agent chain of thoughts.
So it can call and compose the functions, do iteration, and pass larger amount of data between call (pass the whole pandas dataframe, for example).</description></item><item><title>Alfamart vs Indomart dominance in Jakarta</title><link>https://adhikasp.my.id/notebook/alfamart-vs-indomart/</link><pubDate>Sun, 09 Feb 2025 15:12:17 +0700</pubDate><guid>https://adhikasp.my.id/notebook/alfamart-vs-indomart/</guid><description>Alfamart and Indomart are two of the most popular convenience stores in Indonesia.
For thought experiment, lets try to explore the data that we can get from OpenStreetMap about it. Do note though that OSM data is not always complete and up to date, so the results might not be 100% accurate. If you notice specific place are missing, do try to add them on OSM!
Pull list of minimarket To do this, we are using osmnx library, which simplify the query process to the OpenStreetMap database, and we got a tidy GeoDataFrame ready to process further.</description></item><item><title>Jupyter Notebook in Hugo</title><link>https://adhikasp.my.id/link-blog/jupyter-notebook-in-hugo/</link><pubDate>Sun, 09 Feb 2025 12:53:37 +0700</pubDate><guid>https://adhikasp.my.id/link-blog/jupyter-notebook-in-hugo/</guid><description>Very handy guide on how to render Jupyter Notebook in Hugo. This work the best since it doesn&amp;rsquo;t require additional dependencies like nbconvert or additional daemon. Also simple enough to understand and self-maintain.</description></item><item><title>Tailscale for Residential IP Forward Proxy in Cloud</title><link>https://adhikasp.my.id/posts/tailscale-for-residential-ip-forward-proxy-in-cloud/</link><pubDate>Sat, 08 Feb 2025 21:34:39 +0700</pubDate><guid>https://adhikasp.my.id/posts/tailscale-for-residential-ip-forward-proxy-in-cloud/</guid><description>One of the features in TanyaGPT is to &amp;ldquo;watch&amp;rdquo; a YouTube video and answer questions about it. It works by pulling the video transcript as part of the LLM inference.
The problem is, YouTube puts IP blocking on their public API, making the code work in my dev machine but not in the deployed production server that I have in fly.io. This is a common issue when using cloud providers, as their IP ranges are often blocked by services to prevent abuse.</description></item><item><title>Simon Willison's Link Blog</title><link>https://adhikasp.my.id/link-blog/simon-willison-link-blog/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate><guid>https://adhikasp.my.id/link-blog/simon-willison-link-blog/</guid><description>Simon Willison shares his thoughts on maintaining a link blog - a curated collection of interesting links with personal commentary. What resonates with me is how link blogs serve dual purposes: they&amp;rsquo;re both a personal knowledge management tool and a way to share discoveries with others.
Key points from Simon&amp;rsquo;s article that I find compelling:
Link blogs help build a personal archive of interesting content They encourage active engagement with content through commentary The practice combines personal note-taking with public sharing It&amp;rsquo;s a lightweight form of blogging that&amp;rsquo;s easier to maintain than full articles This aligns perfectly with my goal of both keeping personal notes and sharing interesting findings with others.</description></item><item><title>Indonesia Postal Code</title><link>https://adhikasp.my.id/posts/indonesia-postal-code/</link><pubDate>Sun, 02 Feb 2025 00:12:17 +0700</pubDate><guid>https://adhikasp.my.id/posts/indonesia-postal-code/</guid><description>Today, I watch a video from CGP Grey on postal code patterns.
I was curious about the postal code pattern in Indonesia, so I decided to visualize it in Kodepos.
I built it with help of Cursor. Lately I found it making producing code and exploring new ideas much more fun. As I can focus on what I want to do instead of how to do it and figuring out how to use this random Python library or trying to understand how pandas dataframe works.</description></item><item><title>Reviving Blog 2025</title><link>https://adhikasp.my.id/posts/reviving-blog-2025/</link><pubDate>Sat, 01 Feb 2025 20:38:06 +0700</pubDate><guid>https://adhikasp.my.id/posts/reviving-blog-2025/</guid><description>Feels like writting, so I dig into my GitHub repostory and refound this old blog of mine.
I have few different iteration of my blog.
The first one is a WordPress blog that was part of high school IT subject.
Then I think I create an static nginx based website, hosted on VPS.
And this one, a Hugo site originally hosted on my homelab. But my homelab die a few month ago after a brownout in my apartement.</description></item><item><title>Self hosting my websites with Cloudflare Tunnel</title><link>https://adhikasp.my.id/posts/self-hosting-my-website-with-cloudflare-tunnel/</link><pubDate>Sat, 07 Jan 2023 18:22:58 +0700</pubDate><guid>https://adhikasp.my.id/posts/self-hosting-my-website-with-cloudflare-tunnel/</guid><description>This site is served not from cloud or hosting service, but from a crappy consumer-grade desktop from 2008 that I store in my living room, with a Cloudflare Tunnel.
Why? Because it is fun learning exercise.
About the server This is a Fujitsu Mini PC, running a state-of-the art core 2 duo processor E8400 released just in 2008. It have 4GB RAM. The OS of choice is Ubuntu LTS 22.04. I upgrade it with old 128GB SSD that used to be on my gaming PC, to make the OS more snappy.</description></item><item><title>Exploring TimescaleDB</title><link>https://adhikasp.my.id/posts/timescaledb-exploration/</link><pubDate>Sun, 20 Feb 2022 18:22:58 +0700</pubDate><guid>https://adhikasp.my.id/posts/timescaledb-exploration/</guid><description>This is a simple exploration of TimescaleDB, a time-series database.
See the code in adhikasp/timescaledb-exploration.
Comparison between databases Features MySQL 5.7 MySQL 8.x TimeScaleDB ScyllaDB Atomic transaction Yes Yes Yes No Instant alter No Yes Yes Yes Background indexing No No Yes Yes Parallel scan query No No Yes Yes Data compaction No No Yes Yes Data TTL No No Yes Yes Analytics-like query No No Yes, continuous aggregate Yes, realtime query Multi node sharding No No Yes, with master node Yes, fully peer-to-peer Multiple indexes Yes Yes Yes Kinda, use GSI / materialized view Query time 1SELECT sum(total_fee), count(*) from transactions WHERE merchant_id = &amp;#39;merchant-1&amp;#39;; Database Time Mysql 8.</description></item><item><title>Hello World</title><link>https://adhikasp.my.id/posts/hello-world/</link><pubDate>Sun, 26 Dec 2021 19:44:14 +0700</pubDate><guid>https://adhikasp.my.id/posts/hello-world/</guid><description>Just test driving this blog.</description></item><item><title>GSOC Phase 3 - Polishing aspect feature</title><link>https://adhikasp.my.id/posts/gsoc/gsoc-phase-3-polishing-aspect-feature/</link><pubDate>Tue, 25 Jul 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/gsoc-phase-3-polishing-aspect-feature/</guid><description>This post is part of my GSOC journey in coala.
Because aspect is still new and experimental, many things around it is still untested. Also, not all bear in coala (read: none of them) support aspect. And it will be a long time before it happen. So I think it&amp;rsquo;s important to make the migration process became more easy.
In this phase, I try to polish up feature so hopefully it will became more sane to be used.</description></item><item><title>GSOC Phase 2 - Working MVP Coala Aspect</title><link>https://adhikasp.my.id/posts/gsoc/gsoc-phase-2-working-minimal-coala-aspect/</link><pubDate>Fri, 21 Jul 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/gsoc-phase-2-working-minimal-coala-aspect/</guid><description>This post is part of my GSOC journey in coala.
In phase 2, my target is to make aspect-based configuration works. Maybe not with its full power and capabilities, but at least the core foundation must ready in coala codebase and prove that aspect could run.
Starting from my previous phase, I have 3 crucial milestone to reach, which is:
Intepret aspect-based configuration Passing aspects into bear Choosing bear based on aspects Even though the todo is short, I meet with miscellaneous supporting works, few surprising but interesting &amp;ldquo;bugs&amp;rdquo;, and design decisions.</description></item><item><title>GSOC Phase 1 Mid - Automatic star import expanding on autoflake</title><link>https://adhikasp.my.id/posts/gsoc/gsoc-phase-1-mid-automatic-star-import-expanding-on-autoflake/</link><pubDate>Sun, 18 Jun 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/gsoc-phase-1-mid-automatic-star-import-expanding-on-autoflake/</guid><description>This post is part of my GSOC journey in coala.
In this week, I was writting a patch into autoflake for a new feature that could expand a wildcard import to specify each name that really was used in the code.
Autoflake and how it work Short introduction. Autoflake is a tool for automatically remove unused imports, unused variables, and useless pass statemant from Python code. It was mainly dependent on pyflakes, a python code checker, which provide the analysis foundation to check for the faulty code.</description></item><item><title>GSOC Bonding - Understanding current coala's aspect code</title><link>https://adhikasp.my.id/posts/gsoc/gsoc-bonding-understanding-current-coalas-aspect-code/</link><pubDate>Wed, 31 May 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/gsoc-bonding-understanding-current-coalas-aspect-code/</guid><description>This post is part of my GSOC journey in coala.
Even though aspect project in coala still in its infancy, there are already exist a basic prototype of itself in coala codebase. Today, I&amp;rsquo;ll dive into these code and try to analyze the core part about aspect.
Seek First to Understand, then to be Understood
That is a quote from the 7 habbit of Stephen Covey. It is a habbit for social interaction, but idk, I&amp;rsquo;ll try to make some connection here because I feel like it.</description></item><item><title>Designing configuration for coala's aspect</title><link>https://adhikasp.my.id/posts/gsoc/designing-coalas-aspect-configuration/</link><pubDate>Tue, 30 May 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/designing-coalas-aspect-configuration/</guid><description>This post is part of my GSOC journey in coala.
With the emerge of aspect project in coala, come the need to redefine how configuration works and define various new parameter that should control how the aspect should run.
Currently, the mockup for those configuration could be found on cEP-0005 and look like this
1[all] 2# Values can be added to inherited ones only, not within the section because 3# a configuration should describe a state and not involve operations.</description></item><item><title>My Path into Open Source</title><link>https://adhikasp.my.id/posts/gsoc/first-introduction-to-open-source/</link><pubDate>Fri, 12 May 2017 00:00:00 +0700</pubDate><guid>https://adhikasp.my.id/posts/gsoc/first-introduction-to-open-source/</guid><description>This is just a rant on how I got stuck on Open Source community and loving it.
6 month ago, at about October 2016, I just a normal college student who love programming. I like reading about new, hottest framework or library on hacker news, exploring on Github, or just read some random blog post and articles.
I feel kind of frustrated though. I do nothing productive or creating something useful.</description></item><item><title>About</title><link>https://adhikasp.my.id/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://adhikasp.my.id/about/</guid><description>Hey, I&amp;rsquo;m Adhika. I&amp;rsquo;m a software engineer driven by a passion for solving real-world problems by shipping products that users love. I enjoy building tech solution and applied AI products.
Currently, I&amp;rsquo;m a Lead Software Engineer at Grab, where I create services that help millions of merchants across Southeast Asia grow their businesses. One of the most exciting projects I&amp;rsquo;ve co-owned is the GrabMerchant Assistant, an LLM-powered virtual advisor. I led the backend development, prompt engineering, and evaluation to bring it to life.</description></item><item><title>Public services</title><link>https://adhikasp.my.id/public-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://adhikasp.my.id/public-service/</guid><description>I run several open source apps, feel free to use them. This provided on best-effort basis and I may change and became unavailable without notice.
ArxivTok - a TikTok-like interface for browsing arXiv papers. Forked from Miguel07Alm/arxivtok MCP Client CLI - a command line interface for interacting with LLM model, implementing Model Context Protocol. TanyaGPT - a simple cross-platform chatbot client powered by LLM. Kodepos - visualizes Indonesia&amp;rsquo;s postal code regions in hierarichal manner.</description></item></channel></rss>