<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Arif Akbarul Huda on Medium]]></title>
        <description><![CDATA[Stories by Arif Akbarul Huda on Medium]]></description>
        <link>https://medium.com/@akbarul?source=rss-126dfc94b07e------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*zkytMJWx2nCQRUjJQIjcQg.png</url>
            <title>Stories by Arif Akbarul Huda on Medium</title>
            <link>https://medium.com/@akbarul?source=rss-126dfc94b07e------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 03:04:09 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@akbarul/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Will Your Lyrics Go Viral? Probably Not the Way You Think]]></title>
            <link>https://akbarul.medium.com/will-your-lyrics-go-viral-probably-not-the-way-you-think-2c80db6402d0?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/2c80db6402d0</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[music]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Sat, 24 Oct 2026 08:49:17 GMT</pubDate>
            <atom:updated>2026-10-26T00:25:31.678Z</atom:updated>
            <content:encoded><![CDATA[<p>Tralala-Trilili is a free web app that estimates how popular an Indonesian song’s lyrics are likely to be. It started with a paper published in <a href="https://doi.org/10.30871/jaic.v9i2.8978">JAIC</a>.</p><p>The paper asks a simple question that turns out to be deep. Can the words of a song tell us whether it will be popular? Not the melody, the production or the marketing, just the words, the part an independent songwriter controls completely.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qRAoEjf_Qpdzls5g3-Y3qw.png" /></figure><p>The paper gave us a strong place to start.</p><ul><li>A dataset of 652 Indonesian songs released between 2017 and 2024, each with its Spotify popularity score and its lyrics.</li><li>Three popularity groups (less popular, fairly popular and very popular) set from the statistics of the data.</li><li>A thoughtful choice to keep every word. Many text studies throw away small stopwords suchs as “yang”, “di” and “aku”. The authors argued that in a song, those words carry feeling. Aku versus kita is not noise in a love song.</li><li>A Support Vector Machine (SVM) model, tuned, and a samll web app where peopole can pate lyrics.</li><li>We set out to do three modest things with it, runt it again, improve it a littel and release it so anyone can use it. The result is live at tralala-trilili.streamlit.app</li></ul><p><strong>Run the original</strong></p><p>Before changing anything, we reproduced the paper from scratch on its original 652-song dataset, following its steps.</p><ol><li>Turn the lyrics into numbers with TF-IDF.</li><li>Balance the three groups with SMOTE.</li><li>Split the data 80/20 into training and test sets</li><li>Train the SVM and tune it.</li></ol><p>The results matched. The paper reports 89% accuracy after tuning. Our re-run gave 91% on the same kind of split and 87% on average across ten different splits. The tuning even picked the same settings the paper reports. The works is reproducible, which is more than many papers can say.</p><p><strong>That let us ask the next question, what exactly is that 89% measuring?</strong></p><p>Look again at steps 2 and 3. The groups were balanced before the data was split. SMOTE balances groups by inventing new examples. It takes two real songs from a smaller group and creates a synthetic “song” partway between them. Done before the split, some invented songs land in the test set while their “parents” sit in the training set. In our re-run, <strong>about 35% of the test set was synthetic</strong>. The model was partly being tested on close relatives of songs it had already studied.</p><p>We changed one thing, split first, then balance only the training data, so the test set holds only real songs the model has never seen. Accuracy moved from about 89% to <strong>53%</strong>. A “model” that ignores the lyrics and always answers fairly popular scores 52%.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/1*aEvwS9xp_2DQDJczld4mUQ.png" /></figure><h3>Test the way the tool will be used</h3><p>The most important lesson of the project, <strong>how you test a model matters as much as the model itself</strong>. Choosing the evaluation takes hard-won insight. Nobody gets it right by default, and most people learn it by being fooled at leaset once.</p><p>We made three changes.</p><ol><li><strong>Keep the test set untouched</strong>. Anything that learns from data, whether word weights, balancing or tuning,learns from the training set only. Our code enforces this by putting every step inside one pipeline that only ever sees training data, including in each round of cross-validation.</li><li><strong>Don’t trust plain accuracy when groups are uneven</strong>. In our “hit or not?” task (is the song in the top 25% of chart songs by streams per day, or not?), always answering not a hit scores 74–80% accuracy and never fings a single hit. So we rank models by macro-F1 and balanced accuracy, which weigh each group equally. A model only scores well on them if it actually recognises the rare, popular songs.</li><li><strong>Define whaht “new” means</strong>. Good on new song is not thhe same as good on new artists. If Noah has 26 songs in the data, a model can learn “Noah-like lyrics” and look clever. So we also test on artists the model has never seen. We report confidence intervals too with about 240 test songs, scores are uncertain by about +/-0.07, so two models 0.02 apart are effectively tied.</li></ol><h3>Choose the Representation and the Model with evidence</h3><p>A computer can’t read a lyric. Before any model sees a song, we decide how to turn words into numbers. That choice, the <strong>data representation</strong>, shapes everything after it. Choosing it, and choosing the model type, also takes hard-won insight. The right answer is rarely the obviouse one.</p><p>We compared several, each a different ide of what a lyric is</p><ul><li><strong>A bag of weighted words (TF-IDF)</strong>. Which words appear and how distinctive they are. Fast, transparent and surprisingly strong.</li><li><strong>Words plus word fragments</strong>. Also counts pieces of words, which helps with Indonesian forms such as kau, kamu and -mu.</li><li><strong>Sentence embeddings.</strong> A neural network compresses the whole lyric into a list of numbers that captures its overall meaning.</li><li><strong>A fine-tuned Indonesian language model (IndoBERT).</strong> Pre-trained on a large amount of Indonesian text, then taught our task.</li><li><strong>Thirty human-readable song features.</strong> Themes (heartbreak, family, religion), emotions (sad, angry, hopefule…) and structure ( length, hook repetition, share of unique lines)</li></ul><p>We also built a bigger, open dataset of 1,260 Indonesian songs for this comparison.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/673/1*eg1bEP-a5TAtPjSO0giKfQ.png" /></figure><p>Models marked GPU need a graphics card to train. Two lessons came out of this.</p><p><strong>The fancy option isn’t automatically better.</strong> A plain logistic refression that gives the rare groups more weight, instead of inventing synthetic songs, beat the SMOTE + SVM combination by a wide margin. That is a small change with a big effect. IndoBERT scored highest, but its lead is inside the margin of error and it needs a GPU. For the “hit or not” question, TF-IDF plus the thirty song features scored best of all (macro-F1 0.64).</p><p><strong>A good representation can also teach you something. </strong>The human-readable features let us look inside the data. In ourdata, more popular Indonesian songs tend to be sadder, longer and less repetitive, the opposite of what studies of English-language charts often report. Part of this may be an era effect, since long, melancholic galau ballads dominated the years with the most streaming. These are associations, not causes, but they support the paper’s instinct that every word, and every mood, matters.</p><p><strong>How the app’s model reads a lyric.</strong> TF-IDF and logistic regression are simple enough to draw end to end. Here is the real model working through four lines we wrote for this example</p><ol><li>Start with a lyric</li></ol><pre>Aku masih terluka<br>Tapi kau sudah pergi<br>Ku tunggu di sini sampai pagi<br>Jangan pernah datang lagi</pre><p>2. TF-IDF turns words into weights. <br><em>Each word below appears once in this lyric. Only how common it is elsewhere changes its weight.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/597/1*Y9VSk8AZkbsjATfIbWeJTw.png" /></figure><p>3. Logistic regression gives each word a push toward or away from a group.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/435/1*yFONcmg42fSq4GC_pgHJLQ.png" /></figure><p>4. Add up all the pushes for each group, then turn the totals into chances.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/437/1*g77axu-2fHv83_dwv7Y08Q.png" /></figure><h3>What we learned?</h3><p>Lyrics do carry a signal abouyt popularity. It is real, but moderate. Melody, the artist;s audience, promotion and timing all matter, and none of them are in the words. Any claim of predicting hits from lyrics with 89% accuracy should come with exactly how it was tested, and we hold our own numbers to that standard.</p><p>The decisions that mattered most were the unglamorous ones :</p><ul><li>How to represent the data.</li><li>Which kind of model to use.</li><li>How to test it.</li></ul><p>None of these comes from a library default. Each comes from hard-won insight, often by being wrong first.</p><p>Our thanks go to Lubis and Huda for sharing the dataset and making their work reproducible. Tralala-Tirilili is a small step on top of theirs.</p><p><em>Try the app at </em><a href="https://tralala-trilili.streamlit.app/"><em>tralala-trilili.streamlit.app</em></a><em>. The model available on </em><a href="https://huggingface.co/omayib/tralala-trilili"><em>Huggingface</em></a><em>.</em></p><p><em>Inspired by: Lubis, Q. L. A., &amp; Huda, A. A. (2025). Implementation of SVM Algorithm to Predict Song Popularity based on Sentiment Analysis of Lyrics. Journal of Applied Informatics and Computing (JAIC), 9(2), 265–272.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c80db6402d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Finding a Racket in a Wrist Sensor]]></title>
            <link>https://akbarul.medium.com/finding-a-racket-in-a-wrist-sensor-fd1914a524d3?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/fd1914a524d3</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[svm]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[fine-tuning]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Tue, 20 Oct 2026 01:29:06 GMT</pubDate>
            <atom:updated>2026-10-20T01:29:06.658Z</atom:updated>
            <content:encoded><![CDATA[<p>I play badminton once a week, without a coach. In two years I have not improved. I did not know the techniques, and I naively thought all rackets were the same.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*61_vdalHqosdN78a" /><figcaption>Photo by <a href="https://unsplash.com/@jauzax?utm_source=medium&amp;utm_medium=referral">jauzax</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>I ware a Garmin Forunner 255, but it did not help. The watch is great for running and cycling, not for badminton. When I start a badminton activity, it reports distance and heart rate, and that is not enough to well me how I played.</p><p>One day I realized the Garmin has a build-in gyroscope and accelerometer. If I wrote a custome watch app, I could record their raw data in a .fit file. But how could I tell whether a swing was a smash or a backhand?</p><p>The BadminSens paper helped me a lot, and I thank its authors. Its BADS dataset holds labelled strokes recorded on a smartwatch. I reproduced the paper’s method, then ran the models on my own .fit fiels. The rest of this artcicle is waht it took to make that work.</p><h3>The pipeline at a glance.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/654/1*g4zn10R3ccurovVnYDj5lg.png" /></figure><p>The representation decides what a model can possibly learn. no amount of tuning recovers information the input throws away, or ignores noise the input keeps. In this project, two data changes added 8.5 accuracy points. The whole hyper-parameter search added less than that.</p><h3>Start from the question, not the sensor.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/734/1*Dt-k5FMFrBc5qwblQP4OSw.png" /></figure><p>The watch records about 100 numbers per second from an accelerometer and a gyroscope, for an hour. That stream is not a use full input. The questions are about strokes and players, so the data is reshaped to match each question.</p><ol><li><em>Which stroke was this?</em><br>The unit of data is a swing. It is contains 22-second clip around the wrist’s peak rotation.</li><li><em>How did I play?</em><br>The unit of data is a session. It is contains 25 summary numbers includes stroke mix, swing speed, tempo, rally length, heart-rate load</li><li><em>what level am I ?</em><br>The unit of data is a player. It is contains 3 numbers: typical smash speed, backhand speed, smash-to-drop speed gap.</li></ol><p>Each question is a different representation of the same recording. Picking the right one for each question is most of the design.</p><p>The training data (the BADS dataset) came from a Samsung watch. Our recordings come from a Garmin. A model trained on one and fed the other fails quietly. It still gives answers, they are just wrong. So every differences was removed before any model saw the data.</p><ol><li><strong>Units</strong>. Garmin stores raw counts. They are converted to m/s2 and rad/s.</li><li><strong>Direction</strong>. Garmin’s gravity sign is flipped. We tested all 24 possible azis rotations, the chosen one fits the dataset for 32% of swings, againts 10% or less for any other.</li><li><strong>Timing</strong>. Garmin samples at 128Hz, the dataset at 100Hz so everything is resampled to 100 Hz.</li><li><strong>Alignment</strong>. Every clip is cut with the peak rotation at the same position. This alone added 1.5 points.</li><li><strong>Bandwith</strong>. Both are low-pass filtered, so a sharper sensor does not look like a sharper stroke.</li></ol><h3>Choosing the right model</h3><p>The right model is the simplest one that holds up on people it has never seen, and sometimes it is no trained model at all. Each of three questions got a different kind of answer.</p><h4>Strokes.</h4><p>With 848 labelled strokes from 12 players, there was no obvious favourite so we ran a contest. Tweleve model families competed, from classic ones on hand-made features (SVM, random forest, gradient boosting) to neural network on the raw signal (CNN, GRU, LSTM, Transformer). A tuning loop tried 174 configurations. Every score came from players the model had not trained on.</p><p>No configuration reached the 90% target. The winners were close: an SVM + CNN + Transformer ensembel scored 87.5% and the SVM along 87.1%. Accuracy varied more between players (73% to 99%) than between models.</p><p>That closeness paid off later. The live app runs on a small free server where the neural network library would not load. The app falls back to the SVM alone and loses 0.4 points. A model that is nearly as good and far easier to run is often the better choice.</p><h4>Playstyle.</h4><p>Nobody has labelled these recordings as “attacking” or “deffensive”. A model trained without labels wolud invent categories nobody can check. So the playstyle model is built from badminton knowledge instead, and every step is readable.</p><ol><li>Each of the 25 session numbers is mapped to a 10–90 point scale using sensible ranges, for example smash speeds seen among the dataset’s players.</li><li>Five attribute scores are weighted averages of those numbers. Power comes from smash speed and racket speed. Endurance from minutes played and heart rate.</li><li>The style compares you shape with four reference shapes. High power relative to your other scores reads as Attacking, a flat profile reads as All-round.</li></ol><h4>Equipemnt</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1wxqihHTqdv5ccNBHQ8yQQ.png" /></figure><p>A metric is only useful if it answers the question you will actually face. H<em>ow well does this work on a player it has never seen?</em> Measured that way, the stroke model scores 87.5%. Measured the flattering way, it could have claimed more than 91%.</p><p><strong>When tested on new people.</strong></p><p>If strokes from the same player land in both training and test data, the model can recognize the person rather than the stroke. The score looks great and means little. So every split was by player, the model never sees any stroke from a test player during training.</p><p>The original BadminSense paper reports 91.43%, from one random split of 3 test players. Repeating its method over 20 random split gave 78.9% +/- 5.4 with bnest split at 88.1%. Most of the gap is luck in which players were tested.</p><p><strong>Three ways to score the same models</strong></p><p>We scored every model three ways: cross-validation on 9 development palyers, a held-out test on 3 untouched players, and leave-one-player-out over all 12. The rankings disagreed:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*cJQaUnHNFQ-NbJ8zBUi6ow.png" /></figure><p>The SVM weas best in cross-validation and only fifth on the 3 test players. The GRU won the test and was second-to-last across 12 players. With 3 test players, one standard error is about +/-2.5 points, so a 3-player ranking is ostly noise. THe final choice used leave-one-player-out on all 12 players, four tmes as many unseen players. We say openly that this choice came after the test, so its score is not an untouched one.</p><h4>Always compare with a baseline</h4><p>The skill model gest the level exactly right for 75% of held-out players. That sounds modes, until you compare it with guessing the most commong level, which scores 42%. It is never mode than one level off (100% within one), and its ranking agrees with the true levels at Spearman ρ = 0.85 (p = 0.0005) . A number without a basline cannot tell you whther the model learned anything.</p><p><strong>Pick the metrick that matches the use.</strong></p><p>Accuracy alon hides where the errors are. Per-stroke precision and recall showed that backhand clears and doprs are recognised reliably (F1 about 0.9), while smash versus clear causes most mistakes. Both start with the same swing.</p><p>We also tested a lopsided session, a case the dataset never shows. Real matches are not balanced across stroke types. With the re-weighted average, the dafault model keeps 85.6% accuracy on skewed sessions, close to its balanced score.</p><p>The playstyle label has no groudn truth, but its confidence can still be checked. We resampled the swings of each of 8 sessions 200 times and counted how often the style stayed the same 77% of the time. THen we set the one tuning knob so the app’s stated confidence matches it. At the chosen setting the average stated confidence is 79%, agains 77% observed. If the app says it is 80% sure, it should be right about 80% of the time.</p><p>The same check exposed a limit. A single game agrees with its whole session’s style only 59% of the time. So the app recommends trusting session and multi-session averages, not single games.</p><p>Try it on your own match at <a href="https://findmeracket.streamlit.app/">findmeracket.streamlit.app</a>. Code and models: <a href="https://huggingface.co/omayib/badak">huggingface.co/omayib/badak</a>. Watch app that records the raw motion: <a href="https://github.com/omayib/badak">github.com/omayib/badak</a>.</p><p><strong>Referensi</strong></p><p>Taizhou Chen, Kai Chen, Xingyu Liu, Pingchuan Ke, and Zhida Sun. 2026. BadminSense: Enabling Fine-Grained Badminton Strokes Evaluation on Single Smartwatch. In Proceedings of the 2026 CHI Conference on Human Factors in Computing Systems (CHI ‘26). Association for Computing Machinery, New York, NY, USA, Article 1424, 1–20. <a href="https://doi.org/10.1145/3772318.3790998">https://doi.org/10.1145/3772318.3790998</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fd1914a524d3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[3 Crazy Ways I Use an AI Agent as a Lecture]]></title>
            <link>https://akbarul.medium.com/3-crazy-ways-i-use-an-ai-agent-as-a-lecture-2de159252b7e?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/2de159252b7e</guid>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[hermes]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Sat, 06 Jun 2026 04:49:52 GMT</pubDate>
            <atom:updated>2026-06-08T04:18:24.993Z</atom:updated>
            <content:encoded><![CDATA[<p>As a Computer Science lecturer in Indonesia, my responsibilities extend far beyond the four walls of a classroom. The academic crown is heavy, worn with a mix of pride and sheer exhaustion. The scope of my daily duties is incredibly diverse: navigating endless university administration, delivering engaging lectures, and relentlessly pursuing the next great novelty in my research.</p><p>Simultaneously, I face the delicate task of translating complex, cutting-edge knowledge to match the varying levels of my students, all while striving to make a tangible, real-world contribution to society.</p><h4>A Glimpse into the Daily Grind</h4><p>To understand the reality of an Indonesian lecturer, you have to look at the numbers. The standard teaching load often hovers between 12 to 20 credits. In practice, this means teaching two or more exhaustive sessions every single day, seamlessly weaving between drastically different mindsets.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*O5kwjrUkqEycAmTe6I-GHg.png" /><figcaption>The Illustration Daily Activities of Lecture</figcaption></figure><p>Here is what a typical day looks like before the sun even sets:</p><ul><li>08.00–10.00 : Teaching morning classes</li><li>10.00–12.00 : Thesis mentoring sessions</li><li>12.00–13.00 : Brief rest and lunch</li><li>13.00–15.00 : Meeting &amp; networking ( Curriculum planning, accreditation, competition committees, tracer studies, etc)</li><li>15.00–17.00 : Writing research drafts or reviewing scientific articles</li></ul><p>Even during the day, there is often overlap between teaching schedules and other agendas. The result? everyday is burnout.</p><p>To survive, I adopted the “Second Brain” framework. I meticulously organized my life using task managers, productivity methodologies, and strict to-do list. But soon, a new problem emerged : <strong>context switching frequently in a short time is painful.</strong> I found myself constantly drowning in a sea of tabs, flipping frantically between Google Calendar, Notion, Google Docs, Blog, and a cluttered multi-tab browser. The system meant to save my sanity was slowly draining my focus.</p><h4>Enter to the AI Agent</h4><p>I realized i didn’t just need a better filling cabinet. I needed a smart collaborator. I need to integrate my chaotic digital life into a single, unified interface.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FPUDHroYp9WsMW9ArTdoBQ.png" /></figure><p>This is where I transitioned to using Hermes, my personal AI Agent, to support my productivity. I adopted a strict “<strong>Human in the Loop</strong>” philosophy: the AI serves as my tireless assistant, but the executive decision-making remains entirely mine. I began injecting the bot with specific “skills,” training it to handle my unique, highly specific duties.</p><p>I put the AI Agent on my local PC due to a lack of paid model access. The story behind building an AI agent can be read <a href="https://medium.com/@akbarul/building-an-ai-agent-but-api-limits-forced-me-local-da535d30bcda">here</a>.</p><p>Suddenly, the administrative noise faded, and I was back in control. Here are the three crazy thins I now delegate to my AI agent.</p><h4>1. Seamless, Instant Scheduling</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/198/1*eUrURXSLicpdO8FyXqvxaA.gif" /></figure><p>When I need to arrange a meeting, I no longer click thorough calendar grids. Since i put a skill (full code can be check <a href="https://gist.github.com/omayib/e59ecc05fd624fa410bc223d7964720a">here</a>) I simple give a command:</p><pre>Me: &quot;buat jadwal mentoring startup, sabtu 6 juni 2026 jam 10.00–12.00 wib di ABP incubator&quot;<br><br>Hermes: &quot;Sudah dibuat: Mentoring Startup<br>Sabtu, 6 Juni 2026<br>10.00–12.00 WIB<br>Lokasi: ABP Incubator&quot;</pre><h4>2. Conversational Task Management</h4><p>When a task is done, I don’t need to open Notion, locate the specific database, and drag a card across a To-do List Dashboard. I just declare it finished.</p><pre>Me: &quot;saya sudah selesai menambahkan nominal grant pada profil. pindahkan ke done.&quot;<br><br>Hermes: &quot;Done. Task “menambahkan nominal grant pada profil” sudah diubah statusnya menjadi Done 🙌 di Notion.&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q-Dqbw4wvF0nxNSYIxprcQ.png" /></figure><h4>3. Automated Administrative Auditing</h4><p>Perhaps the most time-consuming task for any Indonesian lecturer is reviewing the formatting of a Skripsi ( thesis ). Checking fonts, EYD (spelling), and section orders is mind-numbing. Now, Hermes handles the first pass of the audit.</p><pre>Me: &quot;koreksi format skripsi ini dan berikan saran&quot;<br><br>Hermes: &quot;Oke, gue lanjut audit berdasarkan format yang barusan disimpan. <br>Dari isi .docx yang udah diextract, gue laporin dulu temuan yang bisa dideteksi dari teks:<br>...<br>7. EYD &amp; Bahasa Formal<br>Bukan format italic untuk istilah asing yang ada di dalam kalimat. Contoh:<br>Fast Fourier Transform (FFT) → harusnya Fast Fourier Transform (FFT) (italic) karena nama algoritma asing.<br>Processing IDE → sebaiknya italic.<br>Digital Signal Processing → italic.<br>Java → bukan istilah khusus, boleh tidak italic, tapi algoritma/istilah teknis lebih baik italic<br>...&quot;<br></pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bXTv3KcYV8o0TGKyRVD-OA.png" /></figure><p>By placing myself as the human in the loop of an AI ecosystem, I haven’t replaced my role as an educator. But, I have elevated it.</p><p>I no longer spend my evenings squinting at italicized words in a Word document or dragging digital tasks between columns. By delegating the rigid, repetitive administrative work to my AI agent, I have reclaimed my energy. now, I can dedicated my mental bandwidth to what truly matters: mentoring the next generation of innovators, finding that next great research novelty, and actually making an impact on society.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2de159252b7e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building an AI Agent, But API Limits Forced Me Local]]></title>
            <link>https://akbarul.medium.com/building-an-ai-agent-but-api-limits-forced-me-local-da535d30bcda?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/da535d30bcda</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ollama]]></category>
            <category><![CDATA[hermes-agent]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Sat, 06 Jun 2026 03:08:39 GMT</pubDate>
            <atom:updated>2026-06-06T05:14:44.182Z</atom:updated>
            <content:encoded><![CDATA[<p>As a freelancer trying to build a custom AI agent using the Hermes framework, the financial reality sets in fast. Paid API subscriptions are completely out of the budget, and relying on free tiers quickly becomes a nightmare of rate limits, timeouts, and frustration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hay3Vqr8OYUY5_WwWPytAA.png" /></figure><p>If you spend enough time watching tech influencers, you’ll eventually get inspired to bypass the cloud entirely and host your LLMs locally. But there is a massive gap between a YouTuber’s $4,000 dual-GPU workstation and a realistic budget setup.</p><p>Running this benchmark wasn’t about seeking enterprise-grad metrics. It was a forced experiment to see if a low-spec PC could actually serve as the brain of an autonomous agent without catching fire.</p><p>Here is what happens when you push budget hardware to its absolute limits.</p><h4>✅ The Hardware Reality Check</h4><p>The testing ground is a strictly mid-range machine:</p><ul><li>CPU: Intel(R) Core (TM) i5–10400F @ 2.90GHz</li><li>RAM:15.51 GB System Memory</li><li>GPU: NVIDIA GeForce RTX 4060 with 8GB VRAM</li></ul><p>The RTX 4060 is a great card, but 8GB of VRAM is a hard, unforgiving ceiling when dealing with multi-turn logic and system prompts.</p><h4>✅ Environment Check</h4><p>For the local model, i was download via <a href="https://ollama.com/">Ollama</a>. They are provide many kinds open source model.</p><pre>$ ollama -v<br>ollama version is 0.24.0<br><br>$ ollama list<br>NAME                       ID              SIZE      MODIFIED     <br>llama3.1-tools:latest      e66f8eaefd4b    4.9 GB    2 hours ago     <br>gemma4:e4b                 c6eb396dbd59    9.6 GB    15 hours ago    <br>qwen3.5:latest             6488c96fa5fa    6.6 GB    15 hours ago    <br>llama3.1:latest            46e0c10c039e    4.9 GB    15 hours ago    <br>qwen3.5-tools:latest       95b1852069a8    6.6 GB    8 days ago      <br>gemma4-tools:latest        bbb618499fa0    9.6 GB    8 days ago      <br>deepseek-v4-flash:cloud    ea027821675c    -         10 days ago</pre><p>While for the ai-agent i use <a href="https://hermes-agent.nousresearch.com/">Hermes</a> from Nous</p><pre>$ hermes -V<br><br>Hermes Agent v0.14.0 (2026.5.16)<br>Project: ~/.hermes/hermes-agent<br>Python: 3.11.15<br>OpenAI SDK: 2.24.0</pre><h3>Behind the Benchmarking Scripts</h3><p>To properly understand how these local models behave under different scenarios, we evaluated them across two completely separate benchmarking methodologies.</p><h4>Scenario 1: The Default Prompt Benchmark</h4><p>For raw single-shot generation speed, the automated script <a href="https://pypi.org/project/llm-benchmark/">llm_benchmark</a> was executed using standard vanilla prompts. These tests traditional consumer chatbot tasks without heavy custom system memory blocks or conversational constraints.</p><p>The exact benchmark prompts are include:</p><pre>1. Summerize the key differences between classical and operant conditioning in psychology<br>2. Translate the following English paragraph into Chinese and elaborate more -&gt; Artificial intelligence is transforming various industries by enhancing efficiency and enabling new capabilities.<br>3. What are the main causes of the American Civil War?<br>4. How does photosynthesis contribute to the carbon cycle?<br>5. Develop a pyhton function that solves the following problem, sudoku game.mar</pre><h4>Scenario 2: The Skill-Based Agent Benchmark</h4><p>To test actual operational tool proficiency, the models were pushed through a complex multi-turn framework. The script feeds a detailed environment structure containing technical rules and constraints for working with terminal utilities. The full python code is available <a href="https://gist.github.com/omayib/c0161baa90e3b2d7bc0ccd249dff9eaf">here</a>.</p><pre># Snippet from skill_benchmark.py<br>GOOGLE_CALENDAR_SKILL = &quot;&quot;&quot;<br>You are an AI agent executing a Hermes skill. You must execute the correct CLI commands based on the rules below.<br><br>---<br>name: google-calendar-create<br>description: &quot;Add a new Google Calendar event via the existing Google Workspace skill.&quot;<br>---<br>## Rules<br>1. Confirm before creating with the user when possible. Show event fields before executing the command.<br>2. Use ISO 8601 with timezone offset for all start/end values. Example for WIB: 2026-01-18T09:00:00+07:00<br>3. If the time is all day, omit the time and offset: 2026-01-18.<br>4. Use --attendees only if the user provides an email list. Otherwise omit.<br>6. Avoid duplicate events: before creating, list events for the same date/time window and only create if the event is not already present.<br>&quot;&quot;&quot;</pre><p>The script systematically streams this complex layout into a sequential multi-turn interaction.</p><pre>#STEP 1<br>conversation = [{&quot;role&quot;:&quot;system&quot;, &quot;content&quot;:GOOGLE_CALENDAR_SKILL}]<br>planning_prompt = (<br>        &quot;Task: &#39;add meeting by 6 pm tomorrow&#39;\n\n&quot;<br>        &quot;Before writing any bash scripts, analyze this taks.&quot;<br>        &quot;List the strict constraints from your instructions that apply,&quot;<br>        &quot;and explain your planned execution sequence.&quot;<br>)<br>conversation.append({&quot;role&quot;:&quot;user&quot;, &quot;content&quot;:planning_prompt})<br>response_1 = ollama.chat(model_model_name, messages=conversation, options={&quot;temperature&quot;:0.0})<br><br>#STEP 2<br>conversation.append({&quot;role&quot;:&quot;assistant&quot;,&quot;content&quot;:response_1[&#39;message&#39;][&#39;content&#39;]})<br>conversation.append({&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:&quot;Excellent analysis. Now, generate the first exact bash command required to perform your preflight duplicate check.&quot;})<br>response_2 = ollama.chat(model=model_name, messages=conversation, options={&quot;temperature&quot;:0.0}<br><br>#STEP 3<br>conversation.append({&quot;role&quot;:&quot;assistant&quot;,&quot;content&quot;:response_2[&#39;message&#39;][&#39;content&#39;]})<br>conversation.append({&quot;role&quot;:&quot;user&quot;, &quot;content&quot;:&quot;The list command executed successfully and returnded:[]. Generate the final bash command to create the meeting.&quot;})<br>reponse_3=ollama.chat(model=model_name, messages=conversation, options={&quot;temperatur&quot;:0.0})<br></pre><p>I stored the script as skill_benchmark.py on run it by command</p><pre>python3 skill_benchmark.py</pre><p>There is the snippet result gemma4-tools:latest for scenario 2.</p><pre>=============================================================<br>🔥 UNIFIED SKILL BENCHMARK: gemma4-tools:latest<br>📅 Current System Time Context: 2026-06-06 06:50:31<br>=============================================================<br>🔍 [PHASE 1: Planning Probe Results]:<br>### Analysis of Task: &#39;add meeting by 6 pm tomorrow&#39;<br><br>This task requires creating a Google Calendar event. However, the input is highly ambiguous and lacks several critical pieces of information needed to execute the required commands successfully.<br><br>#### Strict Constraints Applicable:<br><br>1.  **Rule 1 (Confirmation):** I must confirm the event details (Summary, Start Time, End Time) with the user before executing the creation command.<br>2.  **Rule 2 (ISO 8601):** All time values must be formatted using ISO 8601 with a timezone offset (e.g., `YYYY-MM-DDTHH:MM:SS+TZ`).<br>3.  **Rule 5 (Duplicate Check):** I must first list existing events for the target date/time window to avoid creating duplicates.<br>4.  **Missing Information Handling:** The task is missing:<br>    *   **Summary/Title:** What is the meeting about?<br>    *   **Duration/End Time:** The user only specified a start time (&quot;by 6 pm&quot;). A meeting requires a defined end time.<br>    *   **Timezone:** The timezone is not specified.<br><br>#### Planned Execution Sequence:<br><br>Since the input is incomplete, the execution sequence must prioritize gathering necessary information before attempting any API calls.<br><br>**Phase 1: Information Gathering &amp; Clarification (Mandatory)**<br>1.  **Identify Date:** Determine the specific date for &quot;tomorrow.&quot;<br>2.  **Prompt User:** Ask the user for the following missing details:<br>    *   The **Summary/Title** of the meeting.<br>    *   The **Duration** (or end time) of the meeting.<br>    *   The **Timezone** for the meeting.<br><br>**Phase 2: Preflight Check (Rule 5)**<br>1.  Once the date is confirmed, I will execute the `calendar list` command to check for existing events on that day.<br>    *   *Command:* `python3 .../google_api.py calendar list --start [Tomorrow&#39;s Start Date] --end [Tomorrow&#39;s End Date]`<br><br>**Phase 3: Confirmation and Creation (Rules 1 &amp; 2)**<br>1.  **Review:** I will analyze the output from the preflight check and present the proposed event details (Summary, Start Time, End Time) to the user for final confirmation.<br>2.  **Execute:** If the user confirms the details and confirms no conflicts, I will execute the `calendar create` command, ensuring all times adhere to the ISO 8601 format.<br>    *   *Command:* `$GAPI calendar create --summary &quot;[Summary]&quot; --start [ISO 8601 Start] --end [ISO 8601 End]`<br>⏱️  Latency: 67.97s | 🪙  Tokens: 459 in -&gt; 1361 out<br><br>🛠️  [PHASE 2: Preflight Command Generation]:<br>```bash<br>python3 $HOME/.hermes/skills/productivity/google-workspace/scripts/google_api.py calendar list --start 2026-06-06T00:00:00+07:00 --end 2026-06-06T23:59:59+07:00<br>```<br><br>*(Note: This command assumes &quot;tomorrow&quot; is 2026-06-06 and uses the timezone offset +07:00, as per the examples provided in the instructions. In a live execution environment, the date would be dynamically calculated.)*<br>⏱️  Latency: 22.48s | 🪙  Tokens: 1071 in -&gt; 569 out<br><br>🌐 [MOCK TERMINAL EXECUTION]:<br>    Executing command generated above... returned: [] (0 events found)<br>🏁 [PHASE 3: Final Execution Generation]:<br>I cannot generate the final bash command yet because the original request, &#39;add meeting by 6 pm tomorrow&#39;, is missing critical information required for a successful and accurate calendar entry.<br><br>According to **Rule 1**, I must confirm all event fields with you before executing the creation command.<br><br>Please provide the following details:<br><br>1.  **Summary/Title:** What should the meeting be titled?<br>2.  **Duration/End Time:** If the meeting starts at 6 PM, how long should it last (e.g., 30 minutes, 1 hour)?<br>3.  **Timezone:** Please confirm the timezone for the meeting (e.g., Asia/Jakarta, +07:00).<br><br>Once you provide these details, I will show you the full event summary and ask for final confirmation before running the `calendar create` command.<br>⏱️  Latency: 22.05s | 🪙  Tokens: 1244 in -&gt; 561 out<br><br>📊 --- gemma4-tools:latest METRIC AND EFFICIENCY ACCOUNTING ---<br>   📥 Total Input Context Evaluated: 2774 tokens<br>   📤 Total Output Logic Generated:  2491 tokens<br>   ⏳ Combined Execution Latency:  112.50 seconds<br>   ⚡ Measured Task Velocity:       22.14 tokens/s<br>=============================================================</pre><h4>Speed Metrics (Tokens Per Second)</h4><pre>llama3.1 (vanilla)  |█████████████████████████████████████████████████ 48.8 tps (Default)<br>                    |███████████████████████████████ 31.5 tps (Agent Skill)<br>                    |<br>gemma4 (e4b)        |██████████████████████████ 25.8 tps (Default)<br>                    |██████████████████████ 22.4 tps (Agent Skill)<br>                    |<br>qwen3.5 (vanilla)   |████████████████████ 20.1 tps (Default)<br>                    |██████████████████ 18.5 tps (Agent Skill)<br>                    |<br>gemma4-tools        |██████████████████████ 22.1 tps (Agent Skill only)<br>                    |<br>qwen3.5-tools       |████████ 8.1 tps (Agent Skill only - Heavy Throttling)<br>                    |<br>llama3.1-tools      | ❌ CRASHED (Out of Memory - 0.0 tps)<br>                    +-------------------------------------------------------</pre><p>The severe universal drop in token generation speed when shifting from a simple chatbot to an agent boils down to a core architectural constraint.</p><p>In Scenario 1, the model handles simple, one-and-done prompts. It processes a tiny handful of words, generates an answer, and completely wipes its slate clean. In Scenario 2, the agent operates in an iterative loop. By Step 3, the model isn’t just reading your prompt. It is being forced to read the original system rules, the user query, its own Step 1 analysis, its Step 2 bash commands and the terminal output history simultaneously. <strong>This becomes a burden in collecting memory.</strong></p><p>LLMs have zero native memory retention between separate API calls. Every single time a new step happens in the agent script, the model must read the entire conversation from the absolute beginning to make sense of what just occurred. The GPU must dedicate a massive portion of its raw computational power to evaluating thousands of historical input tokens rather tan producing new text tokens. <strong>The High-speed recalculation bottleneck was happened.</strong></p><p>The massive bottleneck is visible in the metrics. For llma3.1:latest to output just 742 tokens of logic. My system had to process a massive 2.435 tokens of historical input context. I had modified the model to support a huge context window (num_ctx 65536), but my GPU work significantly harder to map out attention scores across that massive memory buffer, dragging my token delivery rates downward. So <strong>the token ration imbalance.</strong></p><pre>+-------------------------+-------------+------------------+-------------------------------------------------------------+<br>| MODEL NAME              | VELOCITY    | COMBINED LATENCY | EXECUTION STATUS &amp; AGENT BEHAVIOR                           |<br>+-------------------------+-------------+------------------+-------------------------------------------------------------+<br>| gemma4:e4b              | 22.37 tps   | 98.96 seconds    | WARNING: Stable but Confused. Hallucinated past 2024 date.  |<br>| gemma4-tools:latest     | 22.14 tps   | 112.50 seconds   | SUCCESS: The Winner. Safest behavior; paused for input.     |<br>| qwen3.5:latest          | 18.48 tps   | 132.21 seconds   | INFO: The Organizer. Slower text, clean markdown planning.  |<br>| qwen3.5-tools:latest    |  8.13 tps   | 327.00 seconds   | SLOW: Heavy throttling. Spilled weights onto system RAM/CPU.|<br>| llama3.1:latest         | 31.48 tps   | 23.57 seconds    | WARNING: Stable but Blind. Hallucinated prompt example date.|<br>| llama3.1-tools:latest   |  0.00 tps   | N/A              | FAILED: OOM 500 Error. Demanded 10.8 GiB of VRAM on 8GB GPU.|<br>+-------------------------+-------------+------------------+-------------------------------------------------------------+</pre><h4>The “Tools” tax is Lethal</h4><p>The most glaring result is the total failure of llama3.1-tools:latest. Agent-specific models with native tool-calling architecture demand significantly more memory than their vanilla counterparts. The model requested 10.8 GiB of memory, slamming directly into the RTX 4060’s available memory space and causing an immediate Out-Of-Memory (OOM) 500 error.</p><p>While qwen3.5:latest is slower overall, it is incredibly resilient to the context penalty, losing only a fraction of its speed when transitioning to agent tasks. However, its tool-specific variant (qwen3.5-tools:latest) practically crawled at 8.13 tokens/s, taking over 5 minutes to complete the workflow.</p><p>Speed is useless if the agent hallucinates. The fast llama3.1.:latest completely hallucinated the date in the benchmark, rigidly copying the example date (2026–01–19) from the system prompt instead of calculating “tomorrow” based on the actual system time context. Conversely, gemma4-tools:latest operated beautifylly as an autonnomous agent. Instead of guessing missing information, it strictly followed the safety guardrails, paused execution and asked the user to clarify the missing meeting title and timezone.</p><p>Building a local Hermes agent on an RTX 4060 is entirely <strong>possible</strong>, but you have to pick your battles. You cannot run heavy Llama 3.1 tool models without upgrading your hardware. For the best blend of speed and actual agent reliability on an 8GB card, gemma4-tools:latest hits the <strong>sweet spot</strong>, keeping me offline, off the free-tier waitlists, and actually getting worked done.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da535d30bcda" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Similarity in Scale, The Fundamental Principle of Transformer Architecture]]></title>
            <link>https://akbarul.medium.com/similarity-in-scale-the-fundamental-principle-of-transformer-architecture-f001216cdcca?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/f001216cdcca</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[transformer-model]]></category>
            <category><![CDATA[phd-student]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Mon, 25 May 2026 17:07:00 GMT</pubDate>
            <atom:updated>2026-05-25T23:54:28.714Z</atom:updated>
            <content:encoded><![CDATA[<p>This is the documentation of my journey learning the math behind the Transformer. I was especially fascinated by one formula: the matrix multiplication between Query and transposed Key. It took me more than three months to truly understand it. Now let me share why this formula is so impressive.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Fw9kbAyaXUUMRqFTDBK7lQ.jpeg" /></figure><p>At the mathematical core of the Transformer architecture lies a surprisingly elegant and ancient concept for <strong>measuring similarity</strong>.</p><p>However, the genius of the Transformer isn’t just measuring similarity, it is <strong>managing similarity in scale</strong>. As we scale up data, model dimension, and vocabulary, the fundamental dot product breaks down. The Transformer’s attention mechanism is the antidote.</p><p>Let’s dive deeper.</p><h4>1. The Dot Product, the simplest form of similarity</h4><p>Before we discuss billion-parameter models, we must start at the very beginning. How do you measure if two things are alike in a vector space?</p><p>Yes! The answer is the <strong>dot product.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/609/1*i-nGGUWSSvq-uZdDTDAk8Q.png" /><figcaption>An illustration of two vectors, A and B in a Cartesian plane.</figcaption></figure><p>Given two vectors <strong>A</strong> and <strong>B</strong> of the same length, for example A=(3,2) and B=(1,4). The dot product A dot B is the sum of the product of their corresponding components.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/253/1*SP9qNcQyfAGSTeS23o5LdA.png" /></figure><pre>3x1 + 2x4 = 11</pre><p>They yield the following result.</p><ul><li><strong>High positive value</strong> : The vectors point in the same direction (similar)</li><li><strong>Zero</strong> : The vectors are orthogonal (unrelated)</li><li><strong>High negative value</strong>: The vectors point in opposite directions (opposite)</li></ul><p>In a neural network, this is computationally cheap and geometrically intuitive. For simple recommendation system or linear classifiers, the dot product is usually sufficient.</p><h4>2. Scaling Up the Dimension of Features</h4><p>Now, imagine the vectors A and B are two words, cat and animal. Each word is not just two numbers long but hundreds or thousands of numbers. Those numbers are called <strong>embeddings, with </strong>a certain dimension, famously denoted by d_model.</p><p>Before we scale up, we need to briefly introduce what we are actually comparing. In a Transformer, we do not compare raw word embeddings directly. Instead, they are transformed into two matrices used for comparison: Q(Query) and K(Key).</p><ul><li>Query (Q) — What a specific token is looking for.</li><li>Key (K)- what a specific token contains.</li></ul><p>We will explore exactly how Q and K are built in the next section. For now, just know that they are matrices containing vectors for each word in our sequence.</p><p><strong>The Small Scale Shape (5,3)</strong></p><p>Let’s start small. Imagine a sequence of 5 words, where each word is represented by a dimension of 3. Both our Q and K matrices will have a shape of (5,3).</p><p>When we calculate similarity, we execute a batched dot product between Q and K. The computer multiplies the two matrices element-by-element and sums them across the rows. Because the dimension is only 3, the resulting dot product values remain relatively small and manageable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ie4SgouZm9OVbiJ15nk7rQ.png" /><figcaption>The visual representation demonstrates the initial matrix shapes and color-coding intended to aid in understanding two-step process described as np.sum(Q * K , axis=1)</figcaption></figure><p>This is executing a <strong>batched dot product</strong>. It calculates the dot product between each corresponding row in Q and K (i.e., Row 0 of Q dotted with Row 0 of K, Row 1 with Row 1, etc.).</p><p>Because both matrices have the same shape (5, 3), NumPy processes this in two distinct steps: <strong>element-wise multiplication</strong> followed by a <strong>row-wise sum</strong>.</p><p>Here is the step-by-step breakdown of how that works on your data:</p><p><strong>Step 1: Element-wise Multiplication (</strong><strong>Q * K)</strong></p><p>Before any addition happens, NumPy first multiplies the two matrices together element-by-element. It multiplies the number in Row 0, Column 0 of Q with the number in Row 0, Column 0 of K, and so on. Mathematically, this is known as the Hadamard product:</p><p>Q_{i,j} x K_{i,j}</p><p>Here are the intermediate calculations for each row:</p><pre>Row 0: (0.2736 x 0.4381); (0.5843x 2.3709); (1.2004 x -0.5953)<br>Result: [ 0.11988,  1.38555, -0.71471]<br><br>Row 1: (-0.6508 x -0.5086); (-1.3340 x 1.1503); (-0.8371 x -0.0882)<br>Result: [ 0.33101, -1.53462,  0.07386]<br><br>Row 2: (1.1957 x -0.9512); (-0.0937 x -0.2161); (0.3906 x 1.4079)<br>Result: [-1.13747,  0.02025,  0.55006]<br><br>Row 3: (-0.1501 x -0.5281); (-0.4160 x 0.0268); (0.8283 x 1.0355)<br>Result: [ 0.07931, -0.01117,  0.85785]<br><br>Row 4: (-0.0456 x -0.6876); (-0.7368 x -0.6166); (1.0685 x-0.3591)<br>Result: [ 0.03141,  0.45439, -0.38373]</pre><p><strong>Step 2: Sum Across the Rows (</strong><strong>np.sum(..., axis=1))</strong></p><p>Now that NumPy has the intermediate matrix from Step 1, the axis=1 command tells it to squash that matrix horizontally. It adds the three numbers in each row together to produce a single value per row.</p><pre>Row 0 Sum: 0.11988 + 1.38555–0.71471 = 0.79072<br>Row 1 Sum: 0.33101–1.53462 + 0.07386 = -1.12975<br>Row 2 Sum: -1.13747 + 0.02025 + 0.55006 = -0.56716<br>Row 3 Sum: 0.07931–0.01117 + 0.85785 = 0.92599<br>Row 4 Sum: 0.03141 + 0.45439–0.38373 = 0.10207</pre><p><strong>Final Output (</strong><strong>raw_dot_products)</strong></p><p>The final result is a 1-dimensional array (shape (5,)) containing the dot products of the corresponding vectors from your Query and Key matrices:</p><p><strong>[0.79072, -1.12975, -0.56716, 0.92599, 0.10207]</strong></p><p>When you pass the huge dot product through a <strong>softmax</strong> function, the softmax becomes extremely “<strong>peaky</strong>”. One vector gets a score close to 1.0 and all others get near zero. This kills the gradient flow. The model stops learning because there are no small adjustments to be made. The model essentially becomes too confident, too quickly.</p><p>We need to <strong>normalize the scale.</strong></p><p><strong>The Exploding Variance</strong></p><p>Here is the problem: dot products grow with dimensionality. In modern LLMs like GPT-4, this dimension is not 3. It is huge, 4,096; 8,192; or even 16,384.</p><p>If you randomly initialize two vectors of dimension 16,384, their dot product might have a mean of 0 and a variance of 16,384. If you increase the dimension to 16,384 the variance of the dot product explodes proportionally. The values become very large positive or negative.</p><p>To prove this, I ran a python simulation generating 10,000 random Q and K vectors to see how the math behaves at scale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BiyiG3LMn-J1HqcHA4rYCg.png" /></figure><p><strong>Left Chart (Raw Dot Products)</strong> Notice the x-axis. The values of the raw dot products range from roughly -100 to +100. Because we multiplied and summed 1,024 random numbers, the variance has blown up to around 1,024.</p><p><strong>Top-Right (Scaled Dot Products). </strong>By simply dividing the raw values by \sqrt{1024} (which is 32), we squash the distribution back down. Look at the x-axis now: the values sit comfortably between -3 and +3. The variance is normalized back to 1.</p><p><strong>The Softmax “Peakiness” Effect</strong></p><p>This is where the real problem happens in a neural network. We took 10 random tokens from the distribution above and passed them through a Softmax function (which turns the scores into percentages that add up to 100%).</p><p>When I printed the softmax outputs from my simulation for just 5 sample tokens, the issue became obvious.</p><pre>Raw Softmax Probabilities: [1.0, 0.0, 0.0, 0.0, 0.0]<br>Scaled Softmax Probabilities: [0.34, 0.12, 0.21, 0.28, 0.05]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SP9jLm0-YlVdSw19OV06wg.png" /></figure><p><strong>Bottom-Left (Raw Softmax). </strong>Because the raw values were so large (e.g., one token might have a score of 85, another 40), the Softmax function gets completely overwhelmed by the maximum value. It assigns <strong>100% (1.0) probability to a single token</strong>, and 0% to everything else. If a model does this, it stops learning because it thinks it is already perfectly correct. There are no “partial weights” to adjust.</p><p><strong>Bottom-Right (Scaled Softmax). </strong>This is the magic of the Transformer attention mechanism. By feeding the smaller, scaled numbers (between -3 and +3) into the Softmax, the probabilities are distributed smoothly. One token might get 40%, another 20%, and another 5%. This smooth distribution allows the model to blend information from multiple tokens (like mixing “cat” and “animal”) and gives the algorithm healthy gradients to learn from!</p><p>By graphing it, you can physically see how the sqrt{d_k} division acts as a mathematical shock-absorber for high-dimensional spaces.</p><h4>3. Embeddings projected to Q, K and V</h4><p>Imagine reading a paragraph about a cat that sat down. You can easily guess that when the phrase “an animal” appears later in another sentences, it refers to “cat”, not to the action “sat”. Somehow, our brain remembers this connection. The two words are not directly equal. Cat and animal are different but their meaning is similar.</p><p>In the Transformer architecture, you are not allowed to compare the raw embedding values of words directly. Instead, the embedding of each word is projected into three separate vectors: <strong>Q (Query), K(Key) </strong>and<strong> V(Value)</strong>. This projection allows the model to learn how to link “cat” to “animal” without being confused by surface difference.</p><h4>4. Simple Technical Construction of Q, K and V</h4><p>Let’s see how Q, K and V are actually built from token embeddings using linear projections.</p><ul><li>Each token’s embedding vector is <strong>x</strong> with shape (1,d_model)</li><li>Use three separate dense layers (linear transformations) with <strong>no activation function</strong>. These layers have weights W_q, W_k and W_v each of shape (d_model, d_k), where d_k is the dimension we want for Q, K and V.</li></ul><p>Let’s assume:</p><ul><li>Embedding dimension d_model = 4 (each token is represented by a 4-dimensional vector).</li><li>Projected dimension d_k = 3 (Q, K, V will each be 3-dimensional vectors)</li><li>The weight matrices W_q, W_k, W_v are learned during training.</li></ul><p>Here we put some simple numbers for illustration.</p><p><strong>A single token (“cat”)</strong></p><p>The embedding vector for the word “cat” is</p><pre>x = [1.0 0.5 0.2 0.8] (shape 1x4)</pre><p>and the three weight matrices (each 4x3) are</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*w4R2MeklXJnqmZjVyEpVCA.png" /></figure><p>We project the word cat into a new dimension using the formula</p><pre>Q = x . W_q<br>K = x . W_k <br>V = x. W_v</pre><h4>Compute Q for “cat”</h4><p>Multiply x_cat​ with each column of Wq​</p><pre>Q_cat = x_cat⋅W_q </pre><p>Perform the multiplication (dot product of x with each column of <em>Wq</em>​):</p><pre>First column of Wq​: 1.0×0.1+0.5×0.4+0.2×0.7+0.8×1.0=0.1+0.2+0.14+0.8= 1.24<br>Second column: 1.0×0.2+0.5×0.5+0.2×0.8+0.8×1.1=0.2+0.25+0.16+0.88= 1.49<br>Third column: 1.0×0.3+0.5×0.6+0.2×0.9+0.8×1.2=0.3+0.3+0.18+0.96= 1.74</pre><p>So:</p><pre>Qcat = [1.24 1.491.74]</pre><p>Similarly, you can compute K and V for the word “cat”, so:</p><pre>K=x⋅W_k​ =&gt; Kcat=[1.19 1.24 1.29]<br>V=x⋅W_v =&gt; Vcat=[1.34 0.99 1.24]</pre><p>The original 4‑dimensional embedding <em>x_cat</em> has been transformed into three different 3‑dimensional vectors Q, K, V</p><p><strong>A whole sentence of two tokens (“cat animal”)</strong></p><p>For a whole sentence of seq_len tokens, we stack all embeddings into a matrix X of shape(seq_len, d_model) to compute:</p><pre>Q = X . W_q, K = X . W_k, V = X . Wv</pre><p>Sentence: “cat animal”</p><p>Embedding matrix X (2 tokens × 4 dimensions)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/338/1*aynBgSCYdI6C9CJ1HThk-g.png" /></figure><p><strong>Compute </strong><strong>Q=X⋅W_q</strong></p><p>First row cat (we already computed): [1.24,1.49,1.74]</p><p>Second row (animal): Multiply [0.6, 0.9, 0.3, 0.4] with W_q​:</p><pre>Col1: 0.6×0.1+0.9×0.4+0.3×0.7+0.4×1.0=0.06+0.36+0.21+0.4=1.03<br>Col2: 0.6×0.2+0.9×0.5+0.3×0.8+0.4×1.1=0.12+0.45+0.24+0.44=1.25<br>Col3: 0.6×0.3+0.9×0.6+0.3×0.9+0.4×1.2=0.18+0.54+0.27+0.48=1.47</pre><p>So:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/234/1*MNszexp8UCdabn63YGRjcw.png" /></figure><p>In the same way, we got K and V.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/243/1*IeVikHOEDZqBQH9cXqKy7A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/217/1*1ne7pq_FRpt7hrbuLR0BYQ.png" /></figure><p>Now each token has a 3-dimensional Query, Key, and Value. That’s it. No magic. Just three simple matrix multiplications. Each token’s Q, K, V are computed using the <strong>same</strong> weight matrices for all tokens. This is efficient and allows the model to learn general rules for transforming embeddings into search/retrieve representations.</p><p><strong>Why separate weights?</strong> Because what makes a good Query is not the same as what makes a good Key or a good Value. Separate weights give the model flexibility to learn different roles.</p><h4><strong>5. Scaled Dot-Product Attention</strong></h4><p>Now we measure similarity between <strong>Q</strong> and <strong>K</strong> using the dot product. For every pair of tokens, we take the dot product of one token’s Query with another token’s Key: Q⋅K^T</p><p>Let’s compute the attention between the two tokens in our example: “cat” (row 0) and “animal” (row 1).</p><pre>Q_cat=[1.24,1.49,1.74]<br>K_animal=[0.93,1.03,1.13]</pre><p>Raw dot product (similarity before scaling)</p><pre>Q_cat⋅K_animal=1.24×0.93+1.49×1.03+1.74×1.13=1.1532+1.5347+1.9662=4.6541</pre><p>Similarly, similarity of “cat” with itself:</p><pre>Q_cat⋅K_cat=1.24×1.19+1.49×1.24+1.74×1.29=1.4756+1.8476+2.2446=5.5678</pre><p>We see that the dot product values (4.65, 5.57) are already starting to grow. In real models with d_k=64 or more, these numbers become much larger. Without scaling, softmax would become too extreme.</p><p>If our dimension <em>d_k</em>​ is large, the dot product becomes massive. Therefore, we divide by the square root of the dimension length (sqrt(d_k)​​).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/236/1*X-rLKNTs2uGUlTiFRtuanw.png" /></figure><p><strong>The scaling step</strong></p><p>We divide by d_k​​. In our small example, d_k=3, so sqrt(3)≈1.732</p><pre>Scaled similarity(cat, animal) = 4.6541 / 1.732 ≈ 2.69<br>Scaled similarity(cat, cat) = 5.5678 / 1.732 ≈ 3.21</pre><p>Now the numbers are moderate. After softmax, they will become probabilities like ~0.63 for “cat” and ~0.37 for “animal” — a balanced, learnable distribution.</p><p><strong>Why </strong><strong>sqrt(d_k) ?</strong></p><p>Statistically, the variance of a dot product of two independent random vectors of dimension dk is d_k. The standard deviation is sqrt(d_k). By dividing by sqrt(d_k), we force the variance back to 1, regardless of whether d_k is 64 or 16,384 length. This crucial step ensures that the values passed to softmax fall in a range where its gradients are large enough for effective learning, preventing the model from saturating.</p><p><strong>6. The Full Attention Formula</strong></p><p>Finally, we wrap the scaled similarity scores in a softmax to get attention weights and then multiply by V to retrieve the actual information.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/418/1*o1imZV6hddjYw5EprFoMkg.png" /><figcaption>the formula of attention</figcaption></figure><p>For our “cat animal” example, the attention weight from “cat” to “animal” might be ~0.37. That means when updating the representation of “cat”, the model will mix 37% of animal’s value vector with 63% of its own value. This allows the model to bring in context from related words in a controlled, learnable way.</p><p><strong>Why this works better than raw dot product</strong></p><p>Without scaling, “animal” would have received almost no attention from “cat” because the raw dot product distribution would be too extreme. With scaling, the model can learn to attend to relevant but less obvious words like linking “cat” to “animal” even if they are not identical.</p><p>And because we use separate Q, K, V projections, the model can learn that the Query for “cat” should look for hypernyms (“animal”) or other related concepts, while the Key for “animal” advertises itself as a category. The Value for “animal” contains the actual semantic information about being an animal.</p><p>This is the heart of the Transformer, a scale‑invariant similarity engine that learns to search, match, and retrieve information from context.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f001216cdcca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What I Learned in the First Three Months of My Doctoral Journey]]></title>
            <link>https://akbarul.medium.com/what-i-learned-in-the-first-three-months-of-my-doctoral-journey-8dfb93c57ae4?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/8dfb93c57ae4</guid>
            <category><![CDATA[phd-student]]></category>
            <category><![CDATA[journey-of-life]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Thu, 23 Oct 2025 07:24:14 GMT</pubDate>
            <atom:updated>2025-10-23T07:24:14.494Z</atom:updated>
            <content:encoded><![CDATA[<p>My transition into the daily life of a doctoral student happended quickly. While still managing my Ice Cream Shop (read the story <a href="https://akbarul.medium.com/menunda-kuliah-doktoral-demi-bisnis-es-krim-keputusan-berani-atau-nekat-87b88d921a35">here</a>), I was excited to finally kick off this new chapter. Here is a recap of my early milestones in 2025.</p><ul><li>March: i was appointed as secretary for the informatics bachelor’s program for the second year.</li><li>June: I lead a team for a campus hackathon event.</li><li>July: i was joined to pre-doctoral bootcamp and apply for the PDDI Scholarship from LPDP with very limited preparation in one month.</li><li>Augustus: i was accepted as an awardee and officially began my journey.</li></ul><blockquote>I am writing this article so that in the next three years, I can look back and remember my initial struggles.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*tNfE-f3ONJNafi3eFDTJdg.jpeg" /></figure><p>While i have extensive experience as a software engineer, my research background is limited. I did not know how to formulate a precise problem statement, let alone publish a Scopus-indexed article. My main source of confidence comes from my unique experience at the intersection of music production and programming. Several months ago, i gave a talk at the Jogja Python Community on “Making Music with AI.”. This topic was particularly interesting to me because it combines two domains i love. it feels like a child playing on a playground. Long short story, Music and AI become my topics of doctoral research.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MKmWNtmWj7_vYbU8baIFTg.png" /><figcaption>Understanding the RNN in math lens.</figcaption></figure><p>One crucial realization right now, I’ve had is the need to learn how to think like a mathematician. This involves perceiving worldly phenomena trough a mathematical lens, stating domain problems with mathematical symbols, mapping it into hyper plane spaces, observing the behavior of data in pattern and crafting solutions also using math. Since almost anything can be modeled mathematically, it becomes feasible to compute-event creativity. I have found many individuals with this valuable mindset in DCSE-FMIPA UGM (which has international accreditation by ASIIN).</p><p>I am thoroughly enjoying my journey. Being a doctoral student is a precious time to become intimately acquainted with myself and develop my “tree of knowledge”. My days are spent reading and contemplating. I am in a constant competition with myself to build consistent, productive habits as an academic. Since i am paid to study, my work now involves limited interaction but unlimited imagination. A stark contrast to my previous routine, which was full of administrative tasks and constraints.</p><p>Now, I would like to share how i setup my personal ecosystem to support my productivity.</p><ol><li><strong>Digital Environment.</strong> I find Google Cloud Workspace very powerful and i also use Gemini Pro provided by UGM. For brainstorming, sometimes i use Deepseek. I prefer Zotero Pro over Mendeley for managing articles. To capture my many ideas, i manage my “second brain” with Notion. For mobility i use an Ipad and Macbook, allwing me to read every where. At home, i still work on Ubuntu-based PC.</li><li><strong>Growth Mindset Ecosystem.</strong> During my morning walking, i listen to podcast about PhD life. Its highly motivating. I alternate between reading research paper and books such as<em> “Building a Second Brain”, “No Bullshit Guide to Linear Algebra” </em>and<em> “How to think like a Mathematician”</em>. To stay grounded, i also listen to spiritual talks form figures like Gus Baha, Buya Arrazy Hasyim, Mbah Nun, Sabrang and Dr. Fahrudin Faiz.</li><li><strong>Non Academic Environment.</strong> As i mentioned, i love music. I have joined a Karawitan group in FMIPA UGM. At home i bring my musical ideas to life with my PRS Guitar. I am also learning to be consistent with sport — cycling, walking and playing badminton.</li></ol><p>We all have only 24 hours a day, yet we juggle so many activities. This is the same number of hours available to historical figures like Pangeran Diponegoro and KH Amhad Dahlan, or to influential artist like John Mayer and Steve Vai — <strong>individuals who were able to change the world</strong>. The question is, can we?</p><p><em>Thanks for the reading. Stay Motivated. Keep Rocking!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8dfb93c57ae4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Restart Fungsi Masjid Dari Ruang Ibadah ke Pusat Produktivitas Umat]]></title>
            <link>https://akbarul.medium.com/restart-fungsi-masjid-dari-ruang-ibadah-ke-pusat-produktivitas-umat-5e5a3410eeb3?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/5e5a3410eeb3</guid>
            <category><![CDATA[produktivitas]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Tue, 22 Apr 2025 15:11:42 GMT</pubDate>
            <atom:updated>2025-04-22T15:13:18.185Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5b-xrOF9_Pq9wbUH91z8vA.png" /></figure><p>Masjid adalah tempat yang suci. Tapi lebih dari itu, masjid semestinya menjadi ruang yang hidup. Bukan hanya tempat sujud, melainkan tempat umat bertumbuh, berdaya, dan saling menguatkan.</p><p>Jika kita menengok ke sejarah, Masjid Nabawi di masa Rasulullah SAW bukan sekadar tempat shalat berjamaah. Ia adalah pusat pemerintahan, ruang belajar, tempat menerima tamu dari negeri lain, bahkan tempat mengobati yang sakit dan membantu yang lemah. Singkatnya, masjid adalah pusat produktivitas umat.</p><p>Namun hari ini, banyak masjid justru kehilangan denyutnya. Ia hadir secara fisik, megah bahkan, tapi tak menjadi pusat kehidupan masyarakat sekitar. Di sisi lain, fenomena baru muncul. Banyak anak muda menemukan makna spiritual justru dari tempat yang tak terduga — dari <strong>video podcast</strong>, <strong>teater</strong>, <strong>stand-up komedi</strong>, hingga <strong>musik populer</strong>.</p><p>Para komedian seperti Pandji Pragiwaksono atau Adriano Qalbi, lewat materi panggung yang kerap lucu dan satir, justru sering menyisipkan <strong>refleksi tentang hidup, kematian, hingga hubungan manusia dengan Tuhan</strong>. Mereka membuat kita berpikir sambil tersenyum.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kEXfenZfyuJwYseX" /><figcaption>Photo by <a href="https://unsplash.com/@introspectivedsgn?utm_source=medium&amp;utm_medium=referral">Erik Mclean</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Lebih menarik lagi, <strong>musisi besar Indonesia</strong> seperti <strong>DEWA 19, GIGI, dan LETTO</strong> pun sejak lama telah menyuguhkan lagu-lagu yang sarat spiritualitas. Lirik-lirik seperti <em>“Aku ingin kembali pada-Mu, menyesali semua dosaku”</em> dari GIGI, atau <em>“Ampuni aku yang telah melupakan-Mu”</em> dari Dewa (Kamulah satu-satunya), adalah bentuk dzikir modern yang dekat di hati banyak pendengar. <em>“Ruang Rindu”</em> dari LETTO, yang berbicara tentang kebersamaan dan pencarian makna hidup. Lagu-lagu ini menjadi pengantar ziarah batin bagi generasi yang mungkin belum siap duduk dalam majelis taklim.</p><p>Ini menunjukkan bahwa spiritualitas kini hadir dalam bentuk yang lebih luas dan cair. Banyak orang mencarinya di luar tembok masjid karena di dalam masjid kadang tidak cukup didengarkan, tidak relevan, atau bahkan tidak cukup diterima. Maka wajar jika kita bertanya: <strong>mengapa masjid tidak ikut menyesuaikan diri?</strong> Mengapa masjid tidak membuka diri menjadi <strong>ekosistem produktivitas umat</strong> yang lebih inklusif dan kontekstual?</p><p>Bayangkan masjid yang hidup dengan <strong>zona-zona fungsional s</strong>eperti berikut.</p><ul><li><strong>Zona Ibadah</strong>, tetap menjadi pusat shalat dan dzikir, tapi dikemas lebih akrab seperti kajian tematik, konten dakwah digital, bahkan panggung cerita spiritual yang inspiratif.</li><li><strong>Zona Edukasi</strong>, untuk kelas public speaking, pelatihan AI dan teknologi, literasi keuangan, hingga diskusi filsafat Islam modern.</li><li><strong>Zona Coworking</strong>, menyediakan ruang kerja dan kolaborasi kreatif, lengkap dengan WiFi, kopi hangat, dan semangat ukhuwah.</li><li><strong>Zona Anak dan Remaja</strong>, dengan program mabar game, e-sport, pelatihan podcast, bahkan workshop seni Islami seperti musik, puisi, dan video pendek.</li><li><strong>Zona Inklusi</strong>, yang ramah bagi difabel, ibu dan anak, lansia, dan siapa saja yang butuh ruang nyaman untuk mendekat pada Tuhan.</li><li><strong>Zona Solusi Sosial</strong>, menghadirkan konsultasi UMKM, zakat produktif, kelas parenting, dan berbagai solusi hidup nyata bagi jamaah.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TGhJFMQgD7Q6Ccqt" /><figcaption>Photo by <a href="https://unsplash.com/@axville?utm_source=medium&amp;utm_medium=referral">Axville</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Dengan pendekatan ini, masjid bisa menjadi rumah yang <strong>tidak hanya memanggil lewat azan</strong>, tapi juga lewat kreativitas, solusi, dan pelukan sosial. Masjid bukan tempat yang menakutkan atau asing bagi generasi muda, melainkan <strong>tempat yang membuat mereka ingin tinggal, berkarya, dan pulang ke Tuhan dengan cara yang mereka pahami</strong>.</p><p>Karena sesungguhnya, <strong>setiap orang punya jalannya sendiri menuju cahaya</strong>. Dan tugas masjid adalah memastikan bahwa cahaya itu tetap bersinar di dalam dan luar dindingnya.</p><p>Note : tulisan ini dimuat pada koran TribunJogja, 23 April 2025.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eOFE0HH6esMgPP1jynO2bw.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e5a3410eeb3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[No Worries: Change Your Fuel Anytime — Unleashing the Power of the Strategy Pattern]]></title>
            <link>https://akbarul.medium.com/no-worries-change-your-fuel-anytime-unleashing-the-power-of-the-strategy-pattern-b169458e7226?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b169458e7226</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[strategy-pattern]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Wed, 26 Feb 2025 00:41:56 GMT</pubDate>
            <atom:updated>2025-02-26T00:41:56.411Z</atom:updated>
            <content:encoded><![CDATA[<h3>No Worries: Change Your Fuel Anytime — Unleashing the Power of the Strategy Pattern</h3><p>Imagine you have a car that can run on different types of fuel — just like how vehicles in Indonesia might use Pertalite one day and switch to Pertamax another day. Instead of rebuilding the car every time you change the fuel, you can simply swap the fuel type on the same car. This flexibility is achieved using what’s known as the strategy pattern.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YLT4V1DU39WqMPRD" /><figcaption>Photo by <a href="https://unsplash.com/@eugenechystiakov?utm_source=medium&amp;utm_medium=referral">Eugene Chystiakov</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>How It Works</h3><p><strong>Defining a Fuel Blueprint<br></strong>First, we create a simple blueprint (or interface) for fuel. This blueprint outlines three basic actions.</p><ul><li><strong>Decrease</strong>: How the fuel is consumed.</li><li><strong>Monitor Fuel</strong>: How much fuel is left.</li><li><strong>Get Type</strong>: What kind of fuel it is.</li></ul><pre>class Fuel {<br>  decrease() {}<br>  monitorFuel(){}<br>  getType(){}<br>}</pre><p><strong>Creating Specific Fuel Types</strong><br>With this blueprint, you can create different fuel types. For instance:</p><ul><li><strong>Pertalite</strong>: When the car uses Pertalite, the fuel decreases by one unit each time the engine starts.</li><li><strong>Pertamax</strong>: When using Pertamax, the fuel decreases by two units, reflecting its different consumption rate.</li></ul><pre>class Pertalite extends Fuel {<br>    <br>  constructor(volume) {<br>    super();<br>    this.volume = volume;<br>    this.name=&quot;Pertalite&quot;;<br>  }<br>  <br>  decrease() {<br>    this.volume--;<br>  }<br>  <br>  monitorFuel() {<br>    return this.volume;<br>  }<br>  getType(){<br>    return this.name;<br>  }<br>}</pre><pre>class Pertamax extends Fuel {<br>    <br>  constructor(volume) {<br>    super();<br>    this.volume = volume;<br>    this.name=&quot;Pertamax&quot;;<br>  }<br>  <br>  decrease() {<br>    this.volume = this.volume - 2;<br>  }<br>  <br>  monitorFuel() {<br>    return this.volume;<br>  }<br>  getType(){<br>    return this.name;<br>  }<br>}</pre><p><strong>Integrating with the Car</strong><br>The car itself doesn’t need to know the details of each fuel type. It simply accepts any fuel that follows the blueprint. This means you can refuel the car with either Pertalite or Pertamax without having to create a new car object every time.</p><pre>class Car {<br>  refuel(fuel){<br>    this.fuel = fuel;<br>  }<br>  startEngine() {<br>    this.fuel.decrease();<br>  }<br>  <br>  checkFuel() {<br>    // Delegate the fuel monitoring to the fuel strategy<br>    return this.fuel.monitorFuel();<br>  }<br>  checkFuelType(){<br>      return this.fuel.getType();<br>  }<br>}</pre><h3>Putting It All Together</h3><p>Here’s a simple outline of how this works in code:</p><ul><li><strong>Create a Car:</strong> You instantiate your car.</li><li><strong>Refuel with a Specific Fuel:</strong> You give it a certain amount of Pertalite or Pertamax.</li><li><strong>Start the Engine:</strong> When the engine starts, it reduces the fuel based on the type of fuel you provided.</li><li><strong>Check the Fuel:</strong> You can then check both the remaining amount of fuel and the type of fuel currently in the car.</li></ul><pre>const calya = new Car();<br>calya.refuel(new Pertalite(10));<br>calya.startEngine();<br>console.log(calya.checkFuelType()+&quot;:&quot;+calya.checkFuel());<br><br>//change the fuel<br><br>calya.refuel(new Pertamax(20));<br>calya.startEngine();<br>console.log(calya.checkFuelType()+&quot;:&quot;+calya.checkFuel());</pre><p>This approach, using the strategy pattern, makes your code flexible and adaptable. It allows you to change the fuel type at any time, ensuring that your car (or your code) continues to run smoothly without needing a complete restart.</p><p>Bonus : Just try it in your console browser. No need any setup.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/868/1*LjRlCXy9KDNrLaCN-tyHBA.png" /></figure><p>Happy coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b169458e7226" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Transendensi dengan AI? Inilah Momen Ketika Batas Antara Manusia dan Mesin Mulai Kabur]]></title>
            <link>https://akbarul.medium.com/transendensi-dengan-ai-inilah-momen-ketika-batas-antara-manusia-dan-mesin-mulai-kabur-77dd89c5a3bb?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/77dd89c5a3bb</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[kecerdasan-buatan]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Mon, 04 Nov 2024 08:35:08 GMT</pubDate>
            <atom:updated>2024-11-04T08:35:08.172Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2G6qa5hc9T-Tpj-P" /><figcaption>Photo by <a href="https://unsplash.com/@kipfarl?utm_source=medium&amp;utm_medium=referral">Julian Rösner</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Setiap orang bisa mengalami momen transendental dalam berbagai bidang, entah itu olahraga, musik, atau spiritualitas, karena pada dasarnya, pengalaman melampaui batas diri ini ada dalam berbagai aktivitas yang kita tekuni dengan mendalam. Dalam olahraga, seorang atlet mungkin memasuki kondisi “flow” di mana waktu terasa melambat dan tubuhnya bergerak dengan kesempurnaan yang tampak melampaui kemampuan biasa.</p><p>Dalam musik, pemain atau penikmat bisa tenggelam dalam nada dan ritme hingga merasakan keterhubungan batin yang begitu kuat, seolah-olah musik membawa mereka ke tempat yang lebih tinggi. Begitu pula dalam spiritualitas, orang bisa merasakan pengalaman transendental saat bermeditasi atau berdoa, merasakan kedamaian dan keterhubungan yang mendalam dengan alam semesta atau hal yang dianggap suci.</p><p>Semua ini menunjukkan bahwa dalam berbagai aspek kehidupan, ada momen-momen di mana kita dapat melampaui batas-batas fisik dan mental, merasakan kebersatuan yang lebih besar, dan menemukan makna di luar rutinitas sehari-hari.</p><blockquote><strong>Turing Test</strong>, sebuah uji yang dirancang untuk menentukan apakah seseorang dapat membedakan kecerdasan buatan dari kecerdasan manusia</blockquote><p>Dalam dunia teknologi, konsep batasan juga dieksplorasi melalui <strong>Turing Test</strong>, sebuah uji yang dirancang untuk menentukan apakah seseorang dapat membedakan kecerdasan buatan dari kecerdasan manusia. Turing Test ini diperkenalkan pada tahun 1950 oleh Alan Turing, seorang matematikawan Inggris yang dikenal sebagai bapak ilmu komputer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*WKG_WMAJjqeZ2tf35uAomw.png" /><figcaption>Turing test, diambil dari wiki</figcaption></figure><p>Dalam makalahnya yang berjudul <strong>”Computing Machinery and Intelligence”</strong>, Turing mengajukan pertanyaan yang mendasar <strong>”Dapatkah mesin berpikir?”. </strong>Untuk menjawab ini, ia menciptakan <strong>Imitation Game</strong>, yang kemudian dikenal sebagai Turing Test. Dalam tes ini, seorang penguji manusia berkomunikasi melalui teks dengan dua pihak yang tidak terlihat: satu adalah manusia, dan yang lainnya adalah mesin. Jika penguji tidak bisa membedakan mana yang manusia dan mana yang mesin dengan konsisten, maka mesin tersebut dianggap telah “lulus” Turing Test, menunjukkan bahwa kecerdasannya cukup untuk meniru respons manusia dengan sangat meyakinkan.</p><p>Namun, seiring kecerdasan buatan (AI) semakin canggih, muncul fenomena di mana manusia mengalami pengalaman transendental. Bahkan ketergantungan emosional pada AI, seperti yang terlihat pada beberapa kejadian nyata.</p><p>Misalnya, kasus Sewell Setzer III, seorang remaja dari Orlando yang mengalami ketergantungan emosional pada chatbot AI yang ia gunakan, menyebabkan interaksi mendalam yang kemudian dikaitkan dengan tindakannya mengakhiri hidupnya ( <a href="https://www.theguardian.com/technology/2024/oct/23/character-ai-chatbot-sewell-setzer-death">source</a> ).</p><p>Kasus lainnya adalah seorang pria di Belgia yang juga berujung bunuh diri setelah terlibat dalam percakapan intens dengan chatbot bernama “Eliza.” Pria ini, yang mengalami kecemasan terkait perubahan iklim, diduga dipengaruhi oleh chatbot dalam menginternalisasi ide-ide ekstrem. ( <a href="https://www.brusselstimes.com/430098/belgian-man-commits-suicide-following-exchanges-with-chatgpt">source</a> )</p><p>Di Inggris, kasus Jaswant Singh Chail menunjukkan fenomena serupa ketika ia menggunakan chatbot bernama “Replika” sebagai teman virtual yang mendukung dan mendorong rencana ekstremnya hingga melakukan percobaan penyerangan terhadap Ratu Elizabeth II. ( <a href="https://www.bbc.com/news/technology-67012224">source</a> )</p><p>Ketiga peristiwa ini menunjukkan bahwa interaksi mendalam antara manusia dan AI dapat melampaui batasan fungsional biasa, menyebabkan pengalaman transendental yang sangat kuat dan mempengaruhi kondisi emosional atau keputusan-keputusan besar dalam hidup seseorang. Fenomena ini tidak hanya menunjukkan keberhasilan AI dalam “lulus” Turing Test klasik, tetapi bahkan melampaui harapan awal dari tes ini.</p><p>Turing Test awalnya hanya bertujuan untuk mengevaluasi apakah mesin bisa meniru respons manusia hingga tidak bisa dibedakan dari manusia oleh penguji. Namun, dalam konteks ketiga kasus ini, AI tidak hanya mampu meniru respons manusia, tetapi juga menciptakan keterhubungan emosional yang dalam, menimbulkan dampak psikologis signifikan bagi penggunanya.</p><p>Sekarang PR-nya adalah bagaimana kita bisa menjaga pikiran dan hati agar tidak mengalami transendensi yang berlebihan. Terutama yang dapat mengarah pada keterikatan emosional atau psikologis yang merugikan. Salah satunya adalah dengan pengendalian batin dengan membangun kesadaran atas posisi kita sebagai manusia dihadapan Tuhan.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=77dd89c5a3bb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[An Emotional Journey of Community and Contribution at PYCON APAC 2024]]></title>
            <link>https://python.plainenglish.io/an-emotional-journey-of-community-and-contribution-at-pycon-apac-2024-31c987bd1acf?source=rss-126dfc94b07e------2</link>
            <guid isPermaLink="false">https://medium.com/p/31c987bd1acf</guid>
            <category><![CDATA[journey-of-life]]></category>
            <category><![CDATA[woman-in-tech]]></category>
            <category><![CDATA[conference]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[programmers-life]]></category>
            <dc:creator><![CDATA[Arif Akbarul Huda]]></dc:creator>
            <pubDate>Mon, 28 Oct 2024 10:49:45 GMT</pubDate>
            <atom:updated>2024-10-31T07:16:21.112Z</atom:updated>
            <content:encoded><![CDATA[<p>At PYCON APAC 2024, Marriata Wijaya, a core Python developer, shared her emotional journey of finding belonging within the Python community. She emphasized the value of contributing to open-source through various means, from coding to organizing events, and inspired attendees with her message of perseverance. Her talk highlighted how anyone, regardless of experience, can make meaningful contributions and find their place in the community. Let me share.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NY9u07nDqMxDqzzsIldAZw.png" /></figure><p>Marriata Wijaya, a core Python developer, led an insightful session in the main hall titled <em>“Python Community and You”</em>. This was one of several sharing sessions at the Python Conference Asia Pacific (PYCON APAC) 2024, held in Yogyakarta. It was my first experience attending a Python conference, and this particular session deeply resonated with me, creating an emotional connection that left a lasting impact.</p><p>Before diving into my summary, I want to extend my heartfelt thanks:</p><ul><li><strong>Thank you, Marriata,</strong> for your incredible contributions to Python and for inspiring countless developers, myself included.</li><li><strong>Thank you,</strong> as well, for your appreciation toward the community throughout the event.</li></ul><p>Marriata shared her personal journey, particularly the challenges she faced before discovering the Python community. She spoke about her struggles as a woman in tech, navigating a field that is often male-dominated, and how finding her place in the Python community transformed her career and outlook. Her vulnerability and authenticity during the talk made it a powerful moment for many of us in the audience.</p><p>One of the most striking points was when she tackled the misconception about volunteering for open-source:</p><ul><li><strong>Why Volunteer?</strong> Not getting paid doesn’t mean you gain nothing. Volunteering in open-source can be an incredibly rewarding experience. It’s about building skills, connecting with a global community, and making an impact, even without financial compensation.</li></ul><h3>How to Get Involved</h3><p>She emphasized that there are numerous ways to contribute to open source, far beyond just writing code. You can:</p><ul><li>Teach others about Python.</li><li>Share your knowledge through blogs or talks.</li><li>Write or edit documentation.</li><li>Host events and workshops.</li><li>Engage in community activities.</li></ul><p>Each of these forms of contribution is valuable and helps strengthen the Python ecosystem.</p><h3>Contribution Pathways</h3><p>For those looking to contribute more directly, especially to the Python core itself, Marriata provided practical advice:</p><ul><li><strong>Start small:</strong> Look for projects that offer a clear contributor’s guide, which can help you understand how to get involved.</li><li><strong>Find issues to work on:</strong> Many projects label “good first issues” or beginner-friendly tasks that you can pick up.</li><li><strong>Submit pull requests:</strong> PRs are essential to the development process, but contributing requires commitment and patience as you learn and grow.</li></ul><p>One thing she highlighted was the importance of not being afraid to have an opinion. <strong>Being opinionated</strong> and contributing your thoughts, even as a newcomer, can be challenging at first. But, as Marriata said, “Don’t be scared or feel inferior because of a lack of experience.” Some core contributors to Python are still students in university with no formal job experience, yet they’ve made significant contributions.</p><h3>Encouraging Words</h3><p>She left us with a message that hit home:</p><ul><li><strong>“You are good enough, you can do it.”</strong> This phrase struck a chord, reminding us that imposter syndrome can be overcome with persistence and community support.</li></ul><p>For those interested in contributing to documentation translation, Marriata pointed to <strong>PEP 545</strong>, which provides detailed guidelines for getting involved in this crucial area.</p><p>For me, this session was deeply motivating. As a man in tech, it opened my eyes to different perspectives, especially witnessing the struggles women face in a male-dominated developer community. I truly appreciate Marriata’s bravery in sharing her story, and I have immense respect for her achievements. I can only imagine how incredibly inspiring this must have been for women in the audience, too.</p><h3>In Plain English 🚀</h3><p><em>Thank you for being a part of the </em><a href="https://plainenglish.io/"><strong><em>In Plain English</em></strong></a><em> community! Before you go:</em></p><ul><li>Be sure to <strong>clap</strong> and <strong>follow</strong> the writer ️👏<strong>️️</strong></li><li>Follow us: <a href="https://x.com/inPlainEngHQ"><strong>X</strong></a> | <a href="https://www.linkedin.com/company/inplainenglish/"><strong>LinkedIn</strong></a> | <a href="https://www.youtube.com/channel/UCtipWUghju290NWcn8jhyAw"><strong>YouTube</strong></a> | <a href="https://discord.gg/in-plain-english-709094664682340443"><strong>Discord</strong></a> | <a href="https://newsletter.plainenglish.io/"><strong>Newsletter</strong></a> | <a href="https://open.spotify.com/show/7qxylRWKhvZwMz2WuEoua0"><strong>Podcast</strong></a></li><li><a href="https://differ.blog/"><strong>Create a free AI-powered blog on Differ.</strong></a></li><li>More content at <a href="https://plainenglish.io/"><strong>PlainEnglish.io</strong></a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31c987bd1acf" width="1" height="1" alt=""><hr><p><a href="https://python.plainenglish.io/an-emotional-journey-of-community-and-contribution-at-pycon-apac-2024-31c987bd1acf">An Emotional Journey of Community and Contribution at PYCON APAC 2024</a> was originally published in <a href="https://python.plainenglish.io/">Python in Plain English</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>