<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Made Raka</title><link>https://raka.dev/</link><description>Recent content on Made Raka</description><generator>Hugo</generator><language>en-us</language><copyright>&amp;copy; Copyright 2017 Made Raka</copyright><lastBuildDate>Wed, 13 Apr 2022 00:00:00 +0700</lastBuildDate><atom:link href="https://raka.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Separation of Concerns through Layered Design</title><link>https://raka.dev/posts/separation-of-concerns/</link><pubDate>Wed, 13 Apr 2022 00:00:00 +0700</pubDate><guid>https://raka.dev/posts/separation-of-concerns/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>One of the well-known practices in software engineering when building information rich applications is layering it into different layers based on its concerns. I have seen many folks recommending this practice in many discussions, i.e blogpost, twitter discussion, linkedin post, etc. In this post, I&amp;rsquo;ll try to rephrase it with more details.&lt;/p>
&lt;p>Before going deep into detail of this principles, let&amp;rsquo;s define what&amp;rsquo;s problem we&amp;rsquo;re going to solve with this principle. Here&amp;rsquo;s some problems that we&amp;rsquo;re trying to solve with this principle in mind.&lt;/p></description></item><item><title>Deploying Go App on Minikube Using Local Docker Image</title><link>https://raka.dev/posts/deploying-go-app-on-minikube-using-local-docker-image/</link><pubDate>Sun, 08 Dec 2019 00:00:00 +0700</pubDate><guid>https://raka.dev/posts/deploying-go-app-on-minikube-using-local-docker-image/</guid><description>&lt;p>In this post I will guide you how to running local Docker Image on Minikube, a Virtual Machine which runs a single-node Kubernetes cluster locally. To go thru this post, I expect you already have Docker, kubectl and Minikube installed in local environment.&lt;/p>
&lt;p>Before starting into main topic, we need to create a small Go application first, it&amp;rsquo;s just a server that is receiving HTTP requests.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">package&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#e6db74">&amp;#34;fmt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#e6db74">&amp;#34;log&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#e6db74">&amp;#34;net/http&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#e6db74">&amp;#34;github.com/google/uuid&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#e6db74">&amp;#34;github.com/kelseyhightower/envconfig&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#a6e22e">Config&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#a6e22e">Port&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#e6db74">`envconfig:&amp;#34;PORT&amp;#34; default:&amp;#34;8080&amp;#34;`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">func&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">conf&lt;/span> &lt;span style="color:#a6e22e">Config&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#a6e22e">err&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#a6e22e">envconfig&lt;/span>.&lt;span style="color:#a6e22e">Process&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;KLAUS&amp;#34;&lt;/span>, &lt;span style="color:#f92672">&amp;amp;&lt;/span>&lt;span style="color:#a6e22e">conf&lt;/span>); &lt;span style="color:#a6e22e">err&lt;/span> &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#66d9ef">nil&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#a6e22e">log&lt;/span>.&lt;span style="color:#a6e22e">Fatalf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;%v&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">err&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#a6e22e">log&lt;/span>.&lt;span style="color:#a6e22e">Println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[INFO] Starting klaus server ...&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#a6e22e">http&lt;/span>.&lt;span style="color:#a6e22e">HandleFunc&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/&amp;#34;&lt;/span>, &lt;span style="color:#66d9ef">func&lt;/span>(&lt;span style="color:#a6e22e">w&lt;/span> &lt;span style="color:#a6e22e">http&lt;/span>.&lt;span style="color:#a6e22e">ResponseWriter&lt;/span>, &lt;span style="color:#a6e22e">req&lt;/span> &lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#a6e22e">http&lt;/span>.&lt;span style="color:#a6e22e">Request&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#a6e22e">id&lt;/span>, &lt;span style="color:#a6e22e">err&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#a6e22e">uuid&lt;/span>.&lt;span style="color:#a6e22e">NewUUID&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#a6e22e">err&lt;/span> &lt;span style="color:#f92672">!=&lt;/span> &lt;span style="color:#66d9ef">nil&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			&lt;span style="color:#a6e22e">fmt&lt;/span>.&lt;span style="color:#a6e22e">Fprintf&lt;/span>(&lt;span style="color:#a6e22e">w&lt;/span>, &lt;span style="color:#a6e22e">err&lt;/span>.&lt;span style="color:#a6e22e">Error&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			&lt;span style="color:#66d9ef">return&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#a6e22e">log&lt;/span>.&lt;span style="color:#a6e22e">Printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[INFO] ReqID: %v&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">id&lt;/span>.&lt;span style="color:#a6e22e">String&lt;/span>())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#a6e22e">fmt&lt;/span>.&lt;span style="color:#a6e22e">Fprintf&lt;/span>(&lt;span style="color:#a6e22e">w&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;Hello Klaus!!&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#a6e22e">log&lt;/span>.&lt;span style="color:#a6e22e">Printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;[INFO] Listening on port :%d&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">conf&lt;/span>.&lt;span style="color:#a6e22e">Port&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#a6e22e">http&lt;/span>.&lt;span style="color:#a6e22e">ListenAndServe&lt;/span>(&lt;span style="color:#a6e22e">fmt&lt;/span>.&lt;span style="color:#a6e22e">Sprintf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;:%d&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">conf&lt;/span>.&lt;span style="color:#a6e22e">Port&lt;/span>), &lt;span style="color:#66d9ef">nil&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s test the application first, run following command to resolve external packages&lt;/p></description></item><item><title>Dependency Injection in Go</title><link>https://raka.dev/posts/dependency-injection-in-go/</link><pubDate>Fri, 07 Sep 2018 15:06:09 +0700</pubDate><guid>https://raka.dev/posts/dependency-injection-in-go/</guid><description>&lt;p>Dependency Injection (DI) merupakan salah satu teknik yang cukup sederhana namun sangat powerful dalam pengembangan perangkat lunak. Teknik ini bertujuan untuk membuat unit atau komponen yang independent dan testable.&lt;/p>
&lt;h2 id="goals">Goals&lt;/h2>
&lt;p>Dengan menulis artikel ini, diharapkan bisa menjawab beberapa pertanyaan berikut.&lt;/p>
&lt;ul>
&lt;li>Bagaimana implementasi Dependency Injection di Go?&lt;/li>
&lt;li>Perkakas apa yang bisa digunakan untuk Dependency Injection di Go?&lt;/li>
&lt;/ul>
&lt;h2 id="case-study">Case Study&lt;/h2>
&lt;p>Kasus yang digunakan pada artikel ini adalah menambahkan daftar following pada jejaring sosial, seperti Instagram atau Twitter. Berikut struktur data model yang digunakan untuk menggambarkan masalah daftar following pada jejaring sosial.&lt;/p></description></item><item><title>Carrying Request Scoped Values Between Process in Go with Context</title><link>https://raka.dev/posts/carrying-request-scoped-values-between-process-in-go/</link><pubDate>Sun, 10 Jun 2018 14:58:04 +0700</pubDate><guid>https://raka.dev/posts/carrying-request-scoped-values-between-process-in-go/</guid><description>&lt;p>Di artikel sebelumnya, saya menjelaskan tentang implementasi HTTP middleware di Go. Dalam praktiknya implementasi middleware juga sangat terkait dengan bagaimana kita menangani nilai yang kita hasilkan di middleware dapat di konsumsi oleh proses lain di aplikasi. Semisal saya ambil contoh implementasi secured endpoint yang hanya boleh diakses oleh user yang sudah login. Middleware yang bertugas untuk pengecekan user login juga perlu mengirim informasi user ke proses selanjutnya atau agar API boundaries yang lain bisa menerima informasi tersebut.&lt;/p></description></item><item><title>HTTP Middleware di Go</title><link>https://raka.dev/posts/http-middleware-di-go/</link><pubDate>Sun, 10 Jun 2018 14:28:00 +0700</pubDate><guid>https://raka.dev/posts/http-middleware-di-go/</guid><description>&lt;p>Dalam konteks pembuatan aplikasi web, kita sering dihadapkan oleh berbagai kasus yang sebenarnya tidak berhubungan langsung dengan masalah bisnis yang ingin diselesaikan. Semisal, ketika membuat web untuk menerima order barang, kita perlu melakukan berbagai tugas sebelum order barang tersebut dikerjakan. Contoh paling sederhana, pengecekan hak akses, yaitu pembuatan order hanya boleh dilakukan oleh pihak yang memiliki akses. Dalam menyelesaikan masalah tersebut, kita bisa menggunakan pola atau teknik http middleware.&lt;/p>
&lt;p>Middleware merupakan sebuah sebuah layer tambahan sebelum http request dikerjakan oleh action handler atau request handler yang dituju. Middleware yang baik adalah yang hanya melakukan satu tugas, atau menganut pilosofi do one thing well. Sehingga untuk menangani banyak kasus di level middleware, mereka harus mampu bersifat compose-able. Contoh kasus yang bisa ditangani oleh middleware antara lain:&lt;/p></description></item><item><title>Dasar Dependency Injection</title><link>https://raka.dev/posts/dasar-dependency-injection/</link><pubDate>Tue, 25 Apr 2017 13:52:08 +0700</pubDate><guid>https://raka.dev/posts/dasar-dependency-injection/</guid><description>&lt;p>Mungkin ini termasuk topik yang agak membosankan di bidang pengembangan perangkat lunak. Tapi menurut saya gak ada salahnya untuk bahas topik ini, semoga dapat berguna di masa depan. Di artikel ini, saya tidak akan menggunakan perkakas tambahan apapun, sehingga diharapkan setiap orang dapat memahami konsep dasarnya dengan mudah.&lt;/p>
&lt;h2 id="apa-itu-dependency-injection-di">Apa itu Dependency Injection (DI)?&lt;/h2>
&lt;p>Sederhananya, Dependency Injection merupakan sebuah teknik untuk mengatur cara bagaimana suatu objek dibentuk ketika terdapat objek lain yang membutuhkan. Ada 2 istilah dalam DI, yaitu:&lt;/p></description></item></channel></rss>