<?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"><channel><title><![CDATA[husni.dev rss]]></title><description><![CDATA[Personal blog of Husni Munaya]]></description><link>https://husni.dev</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 15 Apr 2022 17:54:51 GMT</lastBuildDate><item><title><![CDATA[Feeling Overwhelmed]]></title><description><![CDATA[You may feel overwhelmed to keep up with the speed of technology changes as a software engineer. But it’s perfectly fine to not know…]]></description><link>https://husni.dev/feeling-overwhelmed/</link><guid isPermaLink="false">https://husni.dev/feeling-overwhelmed/</guid><pubDate>Fri, 15 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You may feel overwhelmed to keep up with the speed of technology changes as a software engineer. But it’s perfectly fine to not know everything. Software development is a complex and broad topic. No one can undertstand everything. Instead of focusing on things you don’t know, focus on things you need to know to do your job.&lt;/p&gt;&lt;p&gt;Most the technology that you need to know to do the job can be learned as you go. You can learn new ideas faster if you understand the underlying concept. A new framework is just another variation of the same concept. I used to think that you have to master the subject first before you can do the actual job. The reality is, you became a master after you do the job.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to Reuse HTTP Connection in Go]]></title><description><![CDATA[Go’s standard HTTP client supports HTTP keep-alive, which keeps the TCP connection open to be reused for subsequent HTTP request.
You have…]]></description><link>https://husni.dev/how-to-reuse-http-connection-in-go/</link><guid isPermaLink="false">https://husni.dev/how-to-reuse-http-connection-in-go/</guid><pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Go’s standard HTTP client supports HTTP keep-alive, which keeps the TCP connection open to be reused for subsequent HTTP request.
You have to read the body request to completion before you close it as stated in &lt;a href=&quot;https://golang.org/src/net/http/response.go#L59&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Response.Body documentation&lt;/a&gt;.
If you close the request body when it’s not fully read, the TCP connection can’t be reused because there’s still data left on the network to be read. Thus, the TCP connection will be closed.&lt;/p&gt;&lt;p&gt;Let’s take a look at the following program.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		res, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;http://127.0.0.1:8080&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;		res.Body.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;()&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It’s a simple program that tries to connect to a local web server on my local machine. It closes the response body without reading it.
We can monitor the network activity with netstat to see how many TCP connections are open while running the program.&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;netstat -atn | grep 8080
tcp        0      0 127.0.0.1:44390         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44374         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44380         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44392         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44388         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44384         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44378         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44386         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44382         127.0.0.1:8080          TIME_WAIT
tcp        0      0 127.0.0.1:44376         127.0.0.1:8080          TIME_WAIT
tcp6       0      0 :::8080                 :::*                    LISTEN&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As expected, there are multiple open TCP connections.&lt;/p&gt;&lt;p&gt;Now, modify the program as follows: the program now reads all of the request body before closing it.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;io/ioutil&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		res, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;http://127.0.0.1:8080&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;		io.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Copy&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(ioutil.Discard, res.Body)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		res.Body.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;()&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run netstat to see how many TCP connections are open.&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;netstat -atn | grep 8080
tcp        0      0 127.0.0.1:44332         127.0.0.1:8080          TIME_WAIT
tcp6       0      0 :::8080                 :::*                    LISTEN&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You’ll see that there’s only one TCP connections while running the program.
That means the program successfully reuses the same TCP connection.&lt;/p&gt;&lt;p&gt;You should fully read the response body before you close it to ensure that the TCP connection is reused.
By reusing the same TCP connection, we can avoid the overhead in establishing a new TCP connection, thus providing a significant performance to a program that makes a lot of HTTP requests.
If you don’t really need the request body, you can limit the reading with &lt;code&gt;io.CopyN&lt;/code&gt; in case the the other end of a connection sends you unwanted large streams of data.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Manage HTTP Cookie in Go with Cookie Jar]]></title><description><![CDATA[Go's standard HTTP library provides an interface to manage the storage of cookies in HTTP requests.
If we provide a jar to  http.Client…]]></description><link>https://husni.dev/manage-http-cookie-in-go-with-cookie-jar/</link><guid isPermaLink="false">https://husni.dev/manage-http-cookie-in-go-with-cookie-jar/</guid><pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Go’s standard HTTP library provides an interface to manage the storage of cookies in HTTP requests.
If we provide a jar to &lt;code&gt;http.Client&lt;/code&gt;, the jar is used to insert relevant cookies into every request.
The jar is also updated with the cookie values of every response.
If the jar is nil, cookies are sent only when they are explicitly set on the request.&lt;/p&gt;&lt;p&gt;Consider this example. Even though the server sets a cookie header on the response, the HTTP client will simply ignore it because the cookie jar is not set.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http/httptest&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	ts &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; httptest.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;NewServer&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;HandlerFunc&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(w http.ResponseWriter, r &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Request) {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; cookie, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; r.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;You don&amp;#x27;t have a cookie. Here&amp;#x27;s one for you. Don&amp;#x27;t forget to keep it.&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;SetCookie&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(w, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Cookie{Name: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, Value: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Peanut Butter&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;})&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		} &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Printf&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;You have &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt; cookie!&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, cookie.Value)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}))&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;defer&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; ts.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;()&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	client &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Client{}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; _, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(ts.URL); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; _, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(ts.URL); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Output:&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;You don&amp;#x27;t have a cookie. Here&amp;#x27;s one for you. Don&amp;#x27;t forget to keep it.
You don&amp;#x27;t have a cookie. Here&amp;#x27;s one for you. Don&amp;#x27;t forget to keep it.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;net/http/cookiejar&lt;/code&gt; package provides in-memory CookieJar implementation.
We can use that as the jar on the &lt;code&gt;http.Client&lt;/code&gt;.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http/cookiejar&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;net/http/httptest&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;golang.org/x/net/publicsuffix&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	ts &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; httptest.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;NewServer&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;HandlerFunc&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(w http.ResponseWriter, r &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Request) {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; cookie, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; r.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;You don&amp;#x27;t have a cookie. Here&amp;#x27;s one for you. Don&amp;#x27;t forget to keep it.&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			http.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;SetCookie&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(w, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Cookie{Name: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Cookie&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, Value: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Peanut Butter&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;})&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		} &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;			fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Printf&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;You have &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt; cookie!&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, cookie.Value)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}))&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;defer&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; ts.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Close&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;()&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	jar, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; cookiejar.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;New&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;cookiejar.Options{PublicSuffixList: publicsuffix.List})&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	client &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;http.Client{&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		Jar: jar,&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; _, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(ts.URL); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; _, err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Get&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(ts.URL); err &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(err)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;	}&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, the code produces the following output:&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;You don&amp;#x27;t have a cookie. Here&amp;#x27;s one for you. Don&amp;#x27;t forget to keep it.
You have Peanut Butter cookie!&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Because the &lt;code&gt;net/http/cookiejar&lt;/code&gt; package stores cookies in memory, the cookies will be destroyed once the program exits.
If you want to persist the cookies, you can build your own cookie jar by implementing the &lt;code&gt;http.CookieJar&lt;/code&gt; interface.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Beware of Implicit Memory Aliasing in Go For Loop]]></title><description><![CDATA[A for loop in Go will only use one iterator variable whose value gets updated in each loop operation.
Since it's just a single variable, its…]]></description><link>https://husni.dev/beware-of-implicit-memory-aliasing-in-go-foor-loop/</link><guid isPermaLink="false">https://husni.dev/beware-of-implicit-memory-aliasing-in-go-foor-loop/</guid><pubDate>Sat, 19 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A for loop in Go will only use one iterator variable whose value gets updated in each loop operation.
Since it’s just a single variable, its address is constant and doesn’t change. If not used carefully, it might lead to unintended behaviour.&lt;/p&gt;&lt;p&gt;Consider the following example.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; output []&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    nums &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; []&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; _, num &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; nums {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;        output &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(output, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;num)&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    }&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;    fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Value: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;])&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Address: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;])&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It will produce the following output:&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;Value:  3 3 3
Address:  0xc00010c000 0xc00010c000 0xc00010c000&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To avoid such problem, we can access the item in the iterable directly instead of using the iterator variable.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; main&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color:#FF79C6&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;() {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; output []&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    nums &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; []&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; nums {&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;        output &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(output, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;nums[i])&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    }&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;    fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Value: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;])&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;    fmt.&lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;Println&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;Address: &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;], output[&lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;])&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Output:&lt;/p&gt;&lt;pre class=&quot;shiki-unknown&quot;&gt;&lt;code&gt;Value:  1 2 3
Address:  0xc00013a000 0xc00013a008 0xc00013a010&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/securego/gosec&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Gosec&lt;/a&gt; can detect this problem automatically for you. If you scan the code in the first example with gosec, you’ll get the following output:&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:undefined&quot;&gt;[/home/user/project/implicit-memory-aliasing/main.go:10] - G601 (CWE-118): Implicit memory aliasing in for loop. (Confidence: MEDIUM, Severity: MEDIUM)
    9:  for _, num := range nums {
  &amp;gt; 10:                 output = append(output, &amp;amp;num)
    11:         }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title><![CDATA[Obtain Exponent and Modulus from RSA key in PEM Format]]></title><description><![CDATA[If you understand the math behind RSA algorithm, you should know that RSA consists of several components:  ,  , and   such that Here's how…]]></description><link>https://husni.dev/obtain-rsa-exponent-and-modulus/</link><guid isPermaLink="false">https://husni.dev/obtain-rsa-exponent-and-modulus/</guid><pubDate>Sun, 09 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you understand the math behind RSA algorithm, you should know that RSA consists of several components: &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;e&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.43056em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.69444em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.43056em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; such that&lt;/p&gt;&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;m^{ed} \equiv m\,  (mod\,  n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8991079999999999em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8991079999999999em&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≡&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.16666666666666666em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Here’s how you can obtain those values from RSA private and public key in PEM format with python.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; Crypto.PublicKey &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;RSA&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;private_key_pem&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;#x27;&amp;#x27;&amp;#x27;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;-----BEGIN RSA PRIVATE KEY-----&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;MIIEpQIBAAKCAQEA3fJtY+4/TSuZ07iVqGq6Xa9QMFeor5JZwy7IfyyNOHeVFRSS&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;dYBo8WDTHTe4flJsRspHa1pI72v1yoJQJ3M7DFAtAxiHzqhAyYZ4wjdxTN8YBVl5&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;qqbRr7OKTvM8s3Z+2O7aG+ayIyeFKf0DX2ajFkOD3/ql6ne1pQUPCSjLNRSRYdCe&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;e03eKVw6ORSBUe262gEDf/UWHisg3o2JaVLcmR3ps4ESRcdx0AZ9hYWONGmHn7Fs&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;NiSp1ry8SVTOnfdcuvjVVfKLVaOui7nntU5OxQijz+/kk4vy58qDedyHxB24wMt6&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;S+7a5P++ZO20K4/mBIFmdyGIuvOYJY0Gs7X/EQIDAQABAoIBAQDSqNNjUjMLECNF&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;baG+5O5XFZtLByi43HQOak0rSCISQo5iH9CTbnotAPXgeY7Hd3wGBOCc6GjpttLo&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;j598kkatfTv8AECGyfQUU2ozDWSgze+CxFZSv1uvJP5VyVEIFaR4St0CNolGDLC8&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;FcYpusV40ERPRxxL26uxIYgP7YRSr5nReJrZU3xVaBIPxRVmPnJD/7MhaiwkZI53&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;Trwgp7Za3cXMLxetSXV4mRcyejKUYac+OWrf9/gvvFWegHRHJPz5AfS6jo8qPPy0&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;HO+yW3w9psSSYv7n+P5hHk6uqfEnPjp80ke+MxPtRTT2+OpjypToZiL4nNZmppA2&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;p5vQf0NxAoGBAPvLQ2YGZsP4uvbLrRMbFzaVlfiXnwGU4gJ4R2nf6OnKWhWqTI6W&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;TxuUS5VJetgSgSU721LjGvyBjwJWa7mMmfHnmrZqW7AKNKVlpUqx7nsUy9YHfV7o&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;zZTXBZxgMEiCWxHYl36DdGbEclQDitjFH+ur8TaVIo7xewZ/cgOudqK/AoGBAOGn&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;h8lpqoP0U/49BpznMhN1trBct4uLs+EYgK5Dtu2+RQCoApHCQ9QLLFjvVv3plyVm&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;Hy9+MHovxl9hQ1C6RqIpncWlGiI52gr4tGCiM+VMTQ8h2qOESfSJHqd4hivcHDsZ&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;/1HDETQa6vF3b/zyXDAQxstBhotHqhdZEHMTn2IvAoGAEI0n/QjmsHMlNxvkYKEj&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;QX9LwG+XEC+NO8RUTW1ejh+zFEGBjs3qnVF+Nm4CGTn+K0hn/mbXW0nY8Lplkmjf&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;pbsnvF35cPT6yPSJjQNtPcH8NDGB2D9NZD9OKx1Xjyyid+XY74QMnsTDDyq8cctj&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;ccZ3sLLU9riA8chm4j8RpVkCgYEA0Xi4N0Nss6OKmPbDfcGsnZ3nYh4fkF22NJ2P&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;TrWzSU0YNvy/rdkdJ+jbWQ+MvJYr5d6/0lGc5MAWsRHT8EuLKBvjxsZ11RHJE+g9&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;YXsRG6lR21s84A/8qxDisOnT+0EPv9lpRtgCz1CxikeqYLAG3eOk9qe0IvT6s0PN&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;XlX33acCgYEAq97EBQqEUusOOnut5Or89+j1e0A7NywSfiWYl0As8hwuxApAYtyV&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;sHgiPtRCjfD8UcWyD9cbL2Vk/6ZI85u0n7J+OO9ep6pyrMDlCMrx6gEuskyTalsp&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;ggB5+scSGkfSpCI/Hm2UvQUYf+QzYWpgy0yTmCrFoHibkTKHZQAzsVE=&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;-----END RSA PRIVATE KEY-----&lt;/span&gt;
&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;#x27;&amp;#x27;&amp;#x27;&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;public_key_pem&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;#x27;&amp;#x27;&amp;#x27;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;-----BEGIN PUBLIC KEY-----&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3fJtY+4/TSuZ07iVqGq6&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;Xa9QMFeor5JZwy7IfyyNOHeVFRSSdYBo8WDTHTe4flJsRspHa1pI72v1yoJQJ3M7&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;DFAtAxiHzqhAyYZ4wjdxTN8YBVl5qqbRr7OKTvM8s3Z+2O7aG+ayIyeFKf0DX2aj&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;FkOD3/ql6ne1pQUPCSjLNRSRYdCee03eKVw6ORSBUe262gEDf/UWHisg3o2JaVLc&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;mR3ps4ESRcdx0AZ9hYWONGmHn7FsNiSp1ry8SVTOnfdcuvjVVfKLVaOui7nntU5O&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;xQijz+/kk4vy58qDedyHxB24wMt6S+7a5P++ZO20K4/mBIFmdyGIuvOYJY0Gs7X/&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;EQIDAQAB&lt;/span&gt;
&lt;span style=&quot;color:#F1FA8C&quot;&gt;-----END PUBLIC KEY-----&lt;/span&gt;
&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;#x27;&amp;#x27;&amp;#x27;&lt;/span&gt;


&lt;span style=&quot;color:#F8F8F2&quot;&gt;private_key &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;RSA&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;importKey&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(private_key_pem)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;private key components:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;modulus:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, private_key.n)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;decryption key:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, private_key.d, &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;public_key &lt;/span&gt;&lt;span style=&quot;color:#FF79C6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#BD93F9&quot;&gt;RSA&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#50FA7B&quot;&gt;importKey&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(public_key_pem)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;public key components:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;modulus:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, public_key.n)&lt;/span&gt;
&lt;span style=&quot;color:#8BE9FD&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;encryption key:&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;, public_key.e)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The code produces the following output.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;private key components:&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;modulus: 28018210757639036701806576653473108663108237654992710644382580670706356521104503590269747243444881816860960886628707561729506054845669087158286487779668877579111045682687132130967542003640620395709760439291791359332971311569833464916696923708100648936544179482515518284015359758063690936170429993787988992366530178656661760648006433502964162950734482834691341055821131012179885041912952708019133191444259147492689058801662179466923034701521378053315755439283332003332125730956606219922314282161592457216832544141605338942735432555226858379903566758713188147527196578404934586961422561713661928243117076396507324088081&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;decryption key: 26593295115250601019258987963328215378793426844243199611260418512300199902937036198317581786338181920686317820343502527882298467058608112937639084575835373314784373493536023423023711533858143508166836113427630036711295107571141810758475600688751281969708624754419569088284349884654375863917259370028961766347968136242492409216019897338881947171652949409664617568373420518516510028969311296632860124215508429507388883135792513113188476224349460853934378076812541476273510991540179616816870490909273466785702119283308474487346009112179993007498269623263500977729040200031842282261746661152366200714995020265888356975473&lt;/span&gt;

&lt;span style=&quot;color:#F8F8F2&quot;&gt;public key components:&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;modulus: 28018210757639036701806576653473108663108237654992710644382580670706356521104503590269747243444881816860960886628707561729506054845669087158286487779668877579111045682687132130967542003640620395709760439291791359332971311569833464916696923708100648936544179482515518284015359758063690936170429993787988992366530178656661760648006433502964162950734482834691341055821131012179885041912952708019133191444259147492689058801662179466923034701521378053315755439283332003332125730956606219922314282161592457216832544141605338942735432555226858379903566758713188147527196578404934586961422561713661928243117076396507324088081&lt;/span&gt;
&lt;span style=&quot;color:#F8F8F2&quot;&gt;encryption key: 65537&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/48025710/obtain-rsa-exponent-and-modulus-from-public-key-with-python&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Amdahl's Law]]></title><description><![CDATA[Let's say that you want to speed up 75% of your system's execution time by three times.
What is the overall speedup of the whole system…]]></description><link>https://husni.dev/amdahl-law/</link><guid isPermaLink="false">https://husni.dev/amdahl-law/</guid><pubDate>Sat, 01 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let’s say that you want to speed up 75% of your system’s execution time by three times.
What is the overall speedup of the whole system? There’s a formula to solve this problem. It’s called Amdahl’s law and can be formulated as follows.&lt;/p&gt;&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mstyle mathsize=&quot;0.7em&quot;&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;S{\scriptsize max} = \frac{1}{(1-p) + \frac{p}{s}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.68333em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.35244em;vertical-align:-1.0310000000000001em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.32144em&quot;&gt;&lt;span style=&quot;top:-2.314em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7475em&quot;&gt;&lt;span style=&quot;top:-2.6550000000000002em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.446108em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.345em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0310000000000001em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Where&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mstyle mathsize=&quot;0.7em&quot;&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;S{\scriptsize max}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.68333em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the maximum speedup of the system&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.625em;vertical-align:-0.19444em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is part of the system that is improved&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.43056em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the speedup of &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.625em;vertical-align:-0.19444em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you speed up 75% if your system’s execution time by three times, the overall speedup of the whole system will be&lt;/p&gt;&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mstyle mathsize=&quot;0.7em&quot;&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.75&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;0.75&lt;/mn&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;S{\scriptsize max} = \frac{1}{(1-0.75) + \frac{0.75}{3}} = 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.68333em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;mord mathnormal sizing reset-size6 size3&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.401548em;vertical-align:-1.080108em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.32144em&quot;&gt;&lt;span style=&quot;top:-2.2648919999999997em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222222222222222em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.845108em&quot;&gt;&lt;span style=&quot;top:-2.6550000000000002em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.345em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.080108em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2777777777777778em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.64444em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Amdahl’s law has few important implications:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;As &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.43056em;vertical-align:0em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; approaches infinity, &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\frac{p}{s}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0925em;vertical-align:-0.345em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7475em&quot;&gt;&lt;span style=&quot;top:-2.6550000000000002em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.446108em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.345em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; approaches zero. This means that no matter how far you optimize a system, the overall speedup is always limited by the part of the system that doesn’t benefit from the improvement (&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\frac{1}{1-p}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.326216em;vertical-align:-0.481108em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.845108em&quot;&gt;&lt;span style=&quot;top:-2.6550000000000002em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.481108em&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;You should make the common case fast.&lt;/li&gt;&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Uses]]></title><description><![CDATA[In case you're curious, here's what I use to get my work done. Hardware 2018 15" Macbook Pro in space grey. I also own a PC that runs on…]]></description><link>https://husni.dev/uses/</link><guid isPermaLink="false">https://husni.dev/uses/</guid><pubDate>Sat, 01 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In case you’re curious, here’s what I use to get my work done.&lt;/p&gt;&lt;h2&gt;Hardware&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;2018 15” Macbook Pro in space grey.&lt;/li&gt;&lt;li&gt;I also own a PC that runs on Windows 10 for playing games. I use &lt;a href=&quot;https://www.microsoft.com/store/apps/9n6svws3rx71&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ubuntu for Windows&lt;/a&gt; if I want to do programming stuff on my PC.&lt;/li&gt;&lt;li&gt;Keychron K2.&lt;/li&gt;&lt;li&gt;Logitech MX Master 2S.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Development&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;VS Code&lt;/a&gt; with &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Dracula&lt;/a&gt; theme and &lt;a href=&quot;https://github.com/tonsky/FiraCode&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;FiraCode&lt;/a&gt; font.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;iTerm2&lt;/a&gt; + &lt;a href=&quot;https://ohmyz.sh/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Oh My Zsh&lt;/a&gt; for Mac and &lt;a href=&quot;https://github.com/microsoft/terminal&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Windows Terminal&lt;/a&gt; for PC.&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How to Sign Your Git Commit]]></title><description><![CDATA[Today I learned that you can sign your git commit with GPG.
Before you can sign your commit, you need to have a GPG keypair configured on…]]></description><link>https://husni.dev/how-to-sign-your-git-commit/</link><guid isPermaLink="false">https://husni.dev/how-to-sign-your-git-commit/</guid><pubDate>Mon, 15 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I learned that you can sign your git commit with GPG.
Before you can sign your commit, you need to have a GPG keypair configured on your machine.&lt;/p&gt;&lt;p&gt;To generate a GPG keypair, run the following command.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;gpg --full-generate-key&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once you have a GPG keypair, you can sign your commit with &lt;code&gt;-S&lt;/code&gt; flag.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;git commit -S -m &lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#F1FA8C&quot;&gt;your commit message&lt;/span&gt;&lt;span style=&quot;color:#E9F284&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can sign all commits by default in any local repository by running the following command.&lt;/p&gt;&lt;pre class=&quot;shiki&quot; style=&quot;background-color:#282A36&quot;&gt;&lt;code&gt;&lt;span style=&quot;color:#F8F8F2&quot;&gt;git config --global commit.gpgsign &lt;/span&gt;&lt;span style=&quot;color:#8BE9FD&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can also &lt;a href=&quot;https://docs.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;add your GPG key to your Github account&lt;/a&gt; so that they can verify your commits’ signature.&lt;/p&gt;</content:encoded></item></channel></rss>