<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>YBBond</title>
    <link>https://ybbond.id/</link>
    <description>Recent content on YBBond</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>CC BY-SA 4.0</copyright>
    <lastBuildDate>Mon, 07 Jul 2025 22:23:33 +0700</lastBuildDate>
    
  <atom:link href="https://ybbond.id/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Non Null Type Inference After Null Checking in Flutter</title>
      <link>https://ybbond.id/posts/2021-11-non-null-checking-in-flutter/</link>
      <pubDate>Mon, 08 Nov 2021 20:59:49 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2021-11-non-null-checking-in-flutter/</guid>
      <description>&lt;p&gt;A shorts.&lt;/p&gt;
&lt;p&gt;Suppose I make this cool simple widget with sound null safety:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-dart&#34; data-lang=&#34;dart&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;package:flutter/material.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; CoolWidget();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CoolWidget&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; CoolWidget({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Widget build(BuildContext build) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (text &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(text);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Y U NO GIVE TEXT?&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Flutter will get angry and &lt;strong&gt;summon this error log&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: The argument type &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;String?&amp;#39;&lt;/span&gt; can&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;t be assigned to the parameter type &amp;#39;&lt;/span&gt;String&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; because &amp;#39;&lt;/span&gt;String?&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; is nullable and &amp;#39;&lt;/span&gt;String&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; isn&amp;#39;&lt;/span&gt;t.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;text !&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; null&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;text&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                              ^     
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is silly that Flutter cannot dictate from the null check &lt;code&gt;text != null&lt;/code&gt; not a moment ago, and infer that the &lt;code&gt;text&lt;/code&gt; is in fact non-nullable. There is only one possible control flow from that point on!&lt;/p&gt;
&lt;p&gt;There is &lt;em&gt;&lt;strong&gt;bang operator&lt;/strong&gt;&lt;/em&gt; (&lt;code&gt;!&lt;/code&gt; operator) to tell Flutter: “Yeah, I know it is typed as nullable, but I am super duper sure it will not be a null!”&lt;/p&gt;
&lt;p&gt;Which sounds dangerous, no? Code changes, maintainer changes, the world is changing. There is a great chance that sometime in the future, a refactor done and the maintainer forget to deal with the &lt;em&gt;bang operator&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;&lt;p&gt;After browsing the internet for a bit, I found that there &lt;strong&gt;was&lt;/strong&gt; a mention in the Dart docs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The analyzer can’t model the flow of your whole application, so it can’t predict the values of global variables or class fields.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;which used to be &lt;a href=&#34;https://dart.dev/null-safety&#34;&gt;in this page of docs&lt;/a&gt;, but currently not exists.&lt;/p&gt;
&lt;p&gt;From that documentation text, implied that non-null inference can be done in a local scope. So if we define new local variable and do null check on that var, Flutter will gladly say: “OK homie, peace out ✌️”.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff --git a/lib/main.dart b/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;index 96969696..69696969 100644
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--- a/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+++ b/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -13,7 +13,8 @@ class Cool Widget extends StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  @override 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Widget build(BuildContext build) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-   if (text != null) return Text(text);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+   final String? newText = text;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+   if (newText != null) return Text(newText);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return Text(&amp;#39;Y U NO GIVE TEXT?&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Final code looks like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-dart&#34; data-lang=&#34;dart&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;package:flutter/material.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; CoolWidget();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CoolWidget&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; CoolWidget({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Widget build(BuildContext build) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; newText &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (newText &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(newText);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Y U NO GIVE TEXT?&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Other Example&lt;/h2&gt;&lt;p&gt;It’s not just variable (re)declaration, but &lt;strong&gt;passing parameter to a method also works&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, this will summon error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-dart&#34; data-lang=&#34;dart&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;package:flutter/material.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; CoolWidget();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CoolWidget&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; CoolWidget({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; text;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Widget build(BuildContext build) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _buildBuildBuild();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Widget _buildBuildBuild() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (text &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(text);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Y U NO GIVE TEXT?&amp;#39;&lt;/span&gt;);    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might have guessed that the solution is to pass the parameter to the private method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff --git a/lib/main.dart b/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;index 96969696..69696969 100644
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--- a/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+++ b/lib/main.dart
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -19,8 +19,8 @@ Widget build(BuildContext build) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;     return _buildBuildBuild();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-   Widget _buildBuildBuild() {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-     if (text != null) return Text(text);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+   Widget _buildBuildBuild({String? newText}) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+     if (newText != null) return Text(newText);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      return Text(&amp;#39;Y U NO GIVE TEXT?&amp;#39;); 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;I personally like this approach, rather than using the &lt;em&gt;bang operator&lt;/em&gt; (&lt;code&gt;!&lt;/code&gt; operator).&lt;/p&gt;
&lt;p&gt;Will there be performance impact because we declare some new variables? There might be.&lt;/p&gt;
&lt;p&gt;Is passing method parameter counts as declaring new variable? I honestly don’t know. Do tell me if you have insights about this 😃&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub of &lt;a href=&#34;https://github.com/dart-lang/language/issues/1472&#34;&gt;dart-lang issue #1472&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;dartlang.org Google Group thread titled &amp;ldquo;&lt;a href=&#34;https://groups.google.com/a/dartlang.org/g/misc/c/xYKOXNMiFpI&#34;&gt;Non-null inference after null check with class fields&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;StackOverflow accepted answer of question &amp;ldquo;&lt;a href=&#34;https://stackoverflow.com/questions/65456958/dart-null-safety-doesnt-work-with-class-fields/65457221#65457221&#34;&gt;Dart null safety doesn&amp;rsquo;t work with class fields&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Kalender dan Yearly Planner 2021</title>
      <link>https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/</link>
      <pubDate>Sun, 03 Jan 2021 23:46:13 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pembaruan&lt;/strong&gt;&lt;br /&gt;
Teman saya, Lala, membuat versi modifikasi sebagai kalender meja.&lt;br /&gt;
&lt;a href=&#34;https://cdn.ybbond.id/static/KALENDER-MEJA.pdf&#34;&gt;Klik di sini&lt;/a&gt; untuk akses PDF yang ia beri.&lt;/p&gt;
&lt;p&gt;Pun kalian dapat unduh, modifikasi, atau menambah fitur baru.&lt;br /&gt;
Saya senang dengan sistem yang mirip &lt;em&gt;open source&lt;/em&gt; ini.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sudah lama saya tidak mendesain. Sembari belajar lagi&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, saya coba bikin kalender sekaligus &lt;em&gt;yearly planner&lt;/em&gt; untuk tahun 2021.&lt;/p&gt;
&lt;p&gt;§ &lt;a href=&#34;#unduh&#34;&gt;Unduh&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#hitam-dengan-libur&#34;&gt;Hitam dengan penanda libur&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#hitam-tanpa-libur&#34;&gt;Hitam &lt;strong&gt;tanpa&lt;/strong&gt; penanda libur&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#angka-merah-dengan-libur&#34;&gt;Angka berwarna merah&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#angka-garis-merah-dengan-libur&#34;&gt;Angka dan garis berwarna merah&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#sabtu-masuk-angka-merah&#34;&gt;Sabtu tidak libur, angka berwarna merah&lt;/a&gt;&lt;br /&gt;
   »  &lt;a href=&#34;#sabtu-masuk-angka-garis-merah&#34;&gt;Sabtu tidak libur, angka dan garis berwarna merah&lt;/a&gt;&lt;br /&gt;
§ &lt;a href=&#34;#fitur&#34;&gt;Fitur&lt;/a&gt;&lt;br /&gt;
§ &lt;a href=&#34;#sumber-data&#34;&gt;Sumber Data&lt;/a&gt;&lt;br /&gt;
§ &lt;a href=&#34;#font&#34;&gt;Font&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Unduh&lt;/h2&gt;&lt;p&gt;&lt;span id=&#34;hitam-dengan-libur&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/hitam-dengan-libur.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Hitam,&amp;#32;dengan&amp;#32;penanda&amp;#32;libur
    title=Hitam,&amp;#32;dengan&amp;#32;penanda&amp;#32;libur
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Hitam, dengan penanda libur&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-hitam-dengan-libur.pdf&#34;&gt;hanya warna hitam, dengan penanda libur&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&#34;hitam-tanpa-libur&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/hitam-tanpa-libur.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Hitam,&amp;#32;tanpa&amp;#32;penanda&amp;#32;libur
    title=Hitam,&amp;#32;tanpa&amp;#32;penanda&amp;#32;libur
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Hitam, &lt;strong&gt;tanpa&lt;/strong&gt; penanda libur&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-hitam-tanpa-libur.pdf&#34;&gt;hitam, &lt;strong&gt;tanpa&lt;/strong&gt; penanda libur&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&#34;angka-merah-dengan-libur&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/angka-merah-dengan-libur.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Angka&amp;#32;berwarna&amp;#32;merah
    title=Angka&amp;#32;berwarna&amp;#32;merah
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Angka berwarna merah&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-angka-merah-dengan-libur.pdf&#34;&gt;angka merah&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&#34;angka-garis-merah-dengan-libur&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/angka-garis-merah-dengan-libur.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Angka&amp;#32;dan&amp;#32;garis&amp;#32;berwarna&amp;#32;merah
    title=Angka&amp;#32;dan&amp;#32;garis&amp;#32;berwarna&amp;#32;merah
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Angka dan garis berwarna merah&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-angka-garis-merah-dengan-libur.pdf&#34;&gt;angka, garis dan penanda libur berwarana merah&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&#34;sabtu-masuk-angka-merah&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/sabtu-masuk-angka-merah.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Angka&amp;#32;berwarna&amp;#32;merah
    title=Angka&amp;#32;berwarna&amp;#32;merah
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Angka berwarna merah&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-angka-merah-dengan-libur-sabtu-masuk.pdf&#34;&gt;Sabtu tidak libur dan angka merah&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&#34;sabtu-masuk-angka-garis-merah&#34;&gt;&lt;/span&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2021-01-kalender-dan-yearly-planner/sabtu-masuk-angka-garis-merah.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Angka&amp;#32;dan&amp;#32;garis&amp;#32;berwarna&amp;#32;merah
    title=Angka&amp;#32;dan&amp;#32;garis&amp;#32;berwarna&amp;#32;merah
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Angka dan garis berwarna merah&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unduh PDF varian &lt;a href=&#34;https://cdn.ybbond.id/static/2021-angka-garis-merah-dengan-libur-sabtu-masuk.pdf&#34;&gt;Sabtu tidak libur. Angka, garis dan penanda libur berwarana merah&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Rekomendasi saya adalah cetak ukuran A1 dengan bahan spanduk albatros atau lateks agar kalender ini mudah dan tahan lama.&lt;/p&gt;
&lt;p&gt;Umpan balik, saran atau pelaporan kesalahan penulisan dan desain dapat disampaikan ke alamat surel saya di &lt;a href=&#34;mailto:hi@ybbond.id&#34;&gt;hi@ybbond.id&lt;/a&gt;. Jika kalian punya akun Twitter, bisa juga &lt;a href=&#34;https://twitter.com/ybbond/status/1345821961323102208&#34;&gt;membalas tweet saya&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Fitur&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tidak ada jeda antar bulan&lt;/strong&gt; memungkinkan implementasi paradigma &lt;em&gt;day theming&lt;/em&gt; atau &lt;em&gt;calendar blocking&lt;/em&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; yang luwes.&lt;/p&gt;
&lt;p&gt;Hal tersebut juga menekankan bahwa dalam kehidupan yang sibuk ini, unit &lt;strong&gt;pekan&lt;/strong&gt; merupakan mata uang yang berharga. Kita hidup merencanakan kegiatan yang harus dilakukan tiap pekan, sembari menanti akhir pekan untuk bersantai.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dimensi yang besar&lt;/strong&gt; memudahkan kalian menulis catatan atau perencanaan kegiatan. Dimensi desain adalah &lt;code&gt;550x800mm&lt;/code&gt;, sedikit lebih kecil dari ukuran A1. Disadur dari ukuran lebar pintu kulkas di rumah saya.&lt;/p&gt;
&lt;h2&gt;Sumber Data&lt;/h2&gt;&lt;p&gt;Kalender dan &lt;em&gt;Yearly Planner&lt;/em&gt; 2021 ini turut mencantumkan Hari Libur Nasional dan jadwal cuti bersama untuk tahun 2021. Saya ambil data tanggal dan deskripsi dari artikel di situs &lt;strong&gt;Kementerian Pendayagunaan Aparatur Negara dan Reformasi Birokrasi&lt;/strong&gt;. Berikut tautan menuju artikel di &lt;a href=&#34;https://www.menpan.go.id/site/berita-terkini/libur-nasional-dan-cuti-bersama-tahun-2021-sebanyak-23-hari&#34;&gt;situs menpan.go.id&lt;/a&gt;, atau ke &lt;a href=&#34;https://web.archive.org/web/20210101095722/https://www.menpan.go.id/site/berita-terkini/libur-nasional-dan-cuti-bersama-tahun-2021-sebanyak-23-hari&#34;&gt;cadangan archive.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pemilihan singkatan untuk tiap nama bulan saya ambil dari &lt;a href=&#34;https://id.wikipedia.org/wiki/Bulan_(penanggalan)&#34;&gt;Wikipedia - Bulan (penanggalan)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Font&lt;/h2&gt;&lt;p&gt;Font yang saya gunakan dirilis oleh &lt;strong&gt;iA&lt;/strong&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, dengan nama varian &lt;code&gt;iA Writer Quattro&lt;/code&gt;. Font dapat &lt;a href=&#34;https://github.com/iaolo/iA-Fonts&#34;&gt;diunduh dari GitHub&lt;/a&gt;, dan saya himbau untuk membaca lisensi yang mereka pilih sebelum menggunakan font.&lt;/p&gt;
&lt;p&gt;Mereka juga &lt;a href=&#34;https://ia.net/writer/blog/a-typographic-christmas&#34;&gt;menerbitkan artikel&lt;/a&gt; memberi keterangan mengenai pembuatan font tersebut secara komprehensif (artikel dalam Bahasa Inggris).&lt;/p&gt;
&lt;h2&gt;Penutup&lt;/h2&gt;&lt;p&gt;Kalian bisa mendownload file PDF dan mencetak untuk diri kalian sendiri. Mohon tidak mencetak untuk dijual, karena saya pun memakai font gratis non-komersil. Lisensi dan hak milik adalah hal yang baiknya dihormati.&lt;br /&gt;
Jika kalian mencetak untuk teman kalian dan minta uang ganti, cukup ongkos cetak dan bensin saja :D&lt;/p&gt;
&lt;p&gt;Semoga kalender ini bermanfaat!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Saya menggunakan &lt;a href=&#34;https://affinity.serif.com/en-us/designer/&#34;&gt;Affinity Designer&lt;/a&gt;, yang saya beli saat potongan harga pada periode &lt;em&gt;Black Friday&lt;/em&gt; tahun lalu.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Metode merencanakan kegiatan yang bisa jadi berlangsung selama lebih dari sehari. Biasa ditemui di kalender digital, namun bisa juga diterapkan pada kalender fisik. Salah satu artikel (dalam Bahasa Inggris) yang menjelaskan tentang hal ini adalah &lt;a href=&#34;https://www.keepproductive.com/blog/how-to-calendar-block&#34;&gt;How to Calendar Block Your Week&lt;/a&gt; oleh &lt;strong&gt;KEEP PRODUCTIVE&lt;/strong&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Font itu, beserta 2 varian font lain, juga dipakai untuk aplikasi &lt;a href=&#34;https://ia.net/writer&#34;&gt;iA Writer&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Some Apple Scripts for Safari</title>
      <link>https://ybbond.id/posts/2020-08-safari-apple-script/</link>
      <pubDate>Sun, 23 Aug 2020 19:48:48 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-08-safari-apple-script/</guid>
      <description>&lt;p&gt;Safari Technology Preview is my primary web browser when I am not developing website. It is the beta equivalent for Safari that features the latest updates, including the «Tracker Blocker» that will be released to public on macOS Big Sur.&lt;/p&gt;
&lt;p&gt;One of the main losses is the lack of good browser extension to simulate Vim key bindings. &lt;a href=&#34;https://github.com/televator-apps/vimari&#34;&gt;Vimari&lt;/a&gt; is okay, but it doesn&amp;rsquo;t work correctly on GitHub. The other losses are the lack of accidental quit prevention and alternative key binding to change tab.&lt;/p&gt;
&lt;h2&gt;Prevent accidental quit&lt;/h2&gt;&lt;p&gt;Firefox and Chrome has option to warn us if we press &lt;code&gt;⌘ + Q&lt;/code&gt; accidentally. Safari doesn&amp;rsquo;t provide this option. This often happen when I want to close a tab with &lt;code&gt;⌘ + W&lt;/code&gt;, but my clumsy ring finger misses that &lt;code&gt;W&lt;/code&gt;. Previously, I use &lt;code&gt;App Shortcuts&lt;/code&gt; modifier (System Preferences → Keyboard → Shortcuts → App Shortcuts) and assign it to &lt;code&gt;⌘ + ⌥ + Q&lt;/code&gt;. It works, but I am curious whether there&amp;rsquo;s another way.&lt;/p&gt;
&lt;p&gt;I browsed the internet, and found that &lt;strong&gt;John Gruber&lt;/strong&gt; already shared the solution for this issue. You can read it on this post: &lt;a href=&#34;https://daringfireball.net/2020/01/quit_confirmation_for_safari_on_macos&#34;&gt;Quit Confirmation for Safari on MacOS&lt;/a&gt; via DaringFireball.net.&lt;/p&gt;
&lt;p&gt;For your convenience, I will share the slightly modified script here:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-AppleScript&#34; data-lang=&#34;AppleScript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; application &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Safari Technology Preview&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; windowCount &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; count windows
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; tabCount &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;repeat&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; currWindow &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; every &lt;span style=&#34;color:#a6e22e&#34;&gt;window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; tabCount &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; tabCount &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (count tabs &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; currWindow)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;repeat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;-- Make a string like &amp;#34;1 window containing 3 tabs.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; windowCount &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; msg &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; windowCount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; window containing &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; msg &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; windowCount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; windows containing &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; tabCount &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; msg &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; msg &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; tabCount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; tab.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; msg &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; msg &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; tabCount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; tabs.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  display alert &lt;span style=&#34;color:#ae81ff&#34;&gt;¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Are you sure you want to quit Safari?&amp;#34;&lt;/span&gt; message msg &lt;span style=&#34;color:#ae81ff&#34;&gt;¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    buttons {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cancel&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Quit&amp;#34;&lt;/span&gt;} &lt;span style=&#34;color:#ae81ff&#34;&gt;¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    giving up after &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;button returned&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Quit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt; quit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that you might want to change from &lt;code&gt;Safari Technology Preview&lt;/code&gt; to only &lt;code&gt;Safari&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;d want to put the script to &lt;code&gt;Script Editor.app&lt;/code&gt;, and —as suggested by John, use &lt;a href=&#34;https://red-sweater.com/fastscripts/&#34;&gt;FastScripts&lt;/a&gt;. FastScripts is awesome! Credits to red sweater. What you should do is move the scripts generated by Script Editor to FastScripts&amp;rsquo; folder for Safari and assign your preferred key bindings for it. Obviously you&amp;rsquo;d want to assign it to &lt;code&gt;⌘ + Q&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;More info on FastScripts, you can check &lt;a href=&#34;https://help.red-sweater.com/fastscripts/faq/&#34;&gt;their FAQ here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because we&amp;rsquo;ve covered the issue about quitting, now moving to the next issue.&lt;/p&gt;
&lt;h2&gt;Alternative key bindings to change tab&lt;/h2&gt;&lt;p&gt;The default key bindings to change tab for Safari is &lt;code&gt;⌃ + ⇥&lt;/code&gt; for Next Tab, and &lt;code&gt;⌃ + ⇧ + ⇥&lt;/code&gt; for Previous Tab. I&amp;rsquo;d like to add the already familiar key bindings that exist on Firefox and Chrome, that is &lt;code&gt;⌘ + ⌥ + ←&lt;/code&gt; for Previous Tab and &lt;code&gt;⌘ + ⌥ + →&lt;/code&gt; for Next Tab.&lt;/p&gt;
&lt;p&gt;I tried using Mac&amp;rsquo;s built in &lt;code&gt;App Shortcuts&lt;/code&gt; modifier (System Preferences → Keyboard → Shortcuts → App Shortcuts) to modify it, but I&amp;rsquo;d lose the original key bindings. I want them both to coexist.&lt;/p&gt;
&lt;p&gt;My solution is by using the Apple Script and FastScripts too.&lt;/p&gt;
&lt;p&gt;Hereby the script to change tab to Next Tab:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-AppleScript&#34; data-lang=&#34;AppleScript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; application &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Safari Technology Preview&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;window&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; myTab &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; goodtab &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; (myTab &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; integer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; goodtab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    on &lt;span style=&#34;color:#66d9ef&#34;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and the script to change tab to Previous Tab:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-AppleScript&#34; data-lang=&#34;AppleScript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; application &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Safari Technology Preview&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;window&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; myTab &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; goodtab &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; (myTab &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; integer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; goodtab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt; application &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Safari Technology Preview&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; lastTab &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; the number &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; tabs &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;window&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; lastTab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; current &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tab&lt;/span&gt; goodtab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;d want to change the &lt;code&gt;Safari Technology Preview&lt;/code&gt; too. The scripts are straight forward, one of the advantages of Apple Script&amp;rsquo;s strange syntax. Let me explain a bit about the &lt;code&gt;try ... on error&lt;/code&gt; and &lt;code&gt;if ... else&lt;/code&gt; part.&lt;/p&gt;
&lt;p&gt;When you use the Next Tab script and reach the last tab, you&amp;rsquo;d encounter error because the last tab + 1 is nowhere to be found. In that case, we move to the first tab. That&amp;rsquo;s the expected behavior too, because we&amp;rsquo;d want the key binding to keep looping on the available tabs.&lt;/p&gt;
&lt;p&gt;For the Previous Tab script, it gets a little complicated, because there is no property or method to get the length of available tabs that I know of. So I ask (&lt;code&gt;tell&lt;/code&gt;) Safari to define a &lt;code&gt;lastTab&lt;/code&gt; variable with the number of available tabs on the active Safari window as its value.&lt;/p&gt;
&lt;p&gt;Prior to this day, I never thought that I&amp;rsquo;d use Apple Scripts and these kind of macOS utility tools helps my day this much. I read Mac Power User, listen to Rosemary Orchard&amp;rsquo;s podcasts &lt;a href=&#34;https://nestedfolderspodcast.com&#34;&gt;about productivity&lt;/a&gt; and &lt;a href=&#34;https://www.relay.fm/automators&#34;&gt;automating some tasks&lt;/a&gt;, and others. Now I know how awesome the previously overlooked tools is.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Refactoring My Site</title>
      <link>https://ybbond.id/posts/2020-08-refactoring-my-site/</link>
      <pubDate>Sat, 15 Aug 2020 19:51:36 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-08-refactoring-my-site/</guid>
      <description>&lt;p&gt;For the past 2 months, I rewrite this blog&amp;rsquo;s code from the blank Hugo theme. I will keep the majority of the design, but I try to make the page size to minimal. I&amp;rsquo;ve been keeping record of this site&amp;rsquo;s page size on &lt;a href=&#34;https://ybbond.id/reports&#34;&gt;the /reports listing&lt;/a&gt;, and will keep doing that. I am looking at the code for RSS feed too, because I noticed Feedbin won&amp;rsquo;t detect updates on my posts.&lt;/p&gt;
&lt;p&gt;My other goal is to make the optional JavaScript usage to be worth it for visitor. The current JavaScript usage is for changing theme between dark and light, tracker and lazy loading images.&lt;/p&gt;
&lt;p&gt;Tracker will be removed, because I am not curious about the amount of visitor anymore. Theme toggler will be kept, I want to give visitor options. Lazy loading image will be removed, because previously I host the images within the code. Now the images will be stored in my file storage.&lt;/p&gt;
&lt;p&gt;Stuff I&amp;rsquo;d like to add is JavaScript to allow inline footnotes, my current option is &lt;a href=&#34;http://www.bigfootjs.com/&#34;&gt;BigfootJS&lt;/a&gt;. I also want to add more Indieweb features, such as ping WebMention reaction, and MicroPub.&lt;/p&gt;
&lt;p&gt;Per today, you can see the progress on &lt;a href=&#34;https://staging.ybbond.id&#34;&gt;staging.ybbond.id&lt;/a&gt;. If you read this in the future (obviously duh), maybe the staging is gone, already implemented in the main domain.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on July 2020</title>
      <link>https://ybbond.id/posts/2020-07-interesting-links/</link>
      <pubDate>Fri, 31 Jul 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-07-interesting-links/</guid>
      <description>&lt;h2&gt;Articles&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.rollingstone.com/tv/tv-features/streaming-wars-user-experience-sepinwall-1031729/&#34;&gt;Who Loses Big in the Great Streaming Wars? The User&lt;/a&gt; by &lt;strong&gt;Alan Sepinwall&lt;/strong&gt; via Rolling Stone.&lt;br /&gt;
&lt;small&gt;Mirror &lt;a href=&#34;http://archive.is/cWhYc&#34; rel=&#34;noreferrer noopener&#34;&gt;archive.is&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nytimes.com/2020/07/31/technology/blocking-the-tech-giants.html&#34;&gt;I Tried to Live Without the Tech Giants. It Was Impossible.&lt;/a&gt; by &lt;strong&gt;Kashmir Hill&lt;/strong&gt; via NYTimes.&lt;br /&gt;
How a journalist try to ditch any services backed by Amazon, Google, Facebook and Apple for experiment. Nice short read.&lt;br /&gt;
&lt;small&gt;Mirror &lt;a href=&#34;http://archive.is/badFW&#34; rel=&#34;noreferrer noopener&#34;&gt;archive.is&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Mount_Tambora&#34;&gt;Tambora Mountain&lt;/a&gt; via Wikipedia.&lt;br /&gt;
Not that I am proud of it, but my country had done many worldwide disaster. Natural or cultural disaster. This one mountain erupted on 1815, and the aftermath is called &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Year_Without_a_Summer&#34;&gt;Year Without a Summer&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://eager.io/blog/the-languages-which-almost-were-css/&#34;&gt;The Languages Which Almost Were CSS&lt;/a&gt; by &lt;strong&gt;Zack Bloom&lt;/strong&gt; via Eager Blog.&lt;/p&gt;
&lt;h2&gt;Apps&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://cyberduck.io/&#34;&gt;Cyber Duck&lt;/a&gt;&lt;br /&gt;
I was looking for file transfer client to manage my Dropbox and CDN files. The popular one is Transmit, but it is expensive. I found this &lt;a href=&#34;https://github.com/iterate-ch/cyberduck&#34;&gt;open source&lt;/a&gt; alternative. Cyber Duck is free, but it shows pop-up reminder for donation, with minimum £10 to get rid of it.&lt;/p&gt;
&lt;h2&gt;Website&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://staging.ybbond.id&#34;&gt;YBBond.id Staging&lt;/a&gt;&lt;br /&gt;
I am currently refactoring my site to use less data, less JavaScript and removing tracker. The progress is slow, as I am currently a lot busier at work too.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on June, 2020</title>
      <link>https://ybbond.id/posts/2020-06-interesting-links/</link>
      <pubDate>Tue, 30 Jun 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-06-interesting-links/</guid>
      <description>&lt;p&gt;The June&amp;rsquo;s issue is late, sorry. I&amp;rsquo;ve been busy at work.&lt;/p&gt;
&lt;h2&gt;Website&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://increment.com/&#34;&gt;Increment.com&lt;/a&gt;&lt;br /&gt;
Well designed site that contains good articles, updated per 3 month issues. They offer a printed edition that looks good too. I haven&amp;rsquo;t buy their printed edition yet, because the shipping to my country tagged twice the price of the books.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://jesseduffield.com/beginners-guide-to-abstraction/&#34;&gt;Beginner&amp;rsquo;s Guide to Abstraction&lt;/a&gt; - &lt;strong&gt;Jesse Duffield&lt;/strong&gt;&lt;br /&gt;
A complementary read to &lt;strong&gt;Bret Victor&lt;/strong&gt;&amp;rsquo;s &lt;em&gt;Up and Down the Ladder of Abstraction&lt;/em&gt; (you can &lt;a href=&#34;http://worrydream.com/LadderOfAbstraction/&#34;&gt;read it here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Highlight that I like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Duplication is far cheaper than the wrong abstraction.&lt;br /&gt;
&lt;a href=&#34;https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction&#34;&gt;&lt;em&gt;The Wrong Abstraction&lt;/em&gt;&lt;/a&gt; -&lt;strong&gt;Sandi Metz&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2&gt;Apps&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://apps.apple.com/us/app/boop/id1518425043&#34;&gt;Boop&lt;/a&gt;  &lt;small&gt;macOS App&lt;/small&gt;&lt;br /&gt;
Great utility app to process many kind of text, it can pretty format HTML, XML and JSON, convert HEX color to rgb, and more trivial stuff. It is a great tool as I often open a web tool to do those things. I &lt;a href=&#34;https://ybbond.id/hex2rgb.js&#34;&gt;made a custom script&lt;/a&gt; for Hex to RGB based on the placeholder script.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.orgroam.com/&#34;&gt;Org-roam&lt;/a&gt;&lt;br /&gt;
I think, this is the end of my quest to search the best note taking app (on desktop, at the very least). I&amp;rsquo;ve written about it &lt;a href=&#34;https://ybbond.id/posts/2020-06-org-mode-with-org-roam/&#34;&gt;on this post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gildas-lormeau/SingleFile&#34;&gt;SingleFile Browser Extension&lt;/a&gt;&lt;br /&gt;
Rotten link is one of my fear when bookmarking a site. &lt;strong&gt;SingleFile&lt;/strong&gt; is a good site saver that generates only an html file. It&amp;rsquo;s much easier and compact than &amp;ldquo;Save Page As&amp;hellip;&amp;rdquo; browser function.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://historio.us/&#34;&gt;historio.us&lt;/a&gt;&lt;br /&gt;
Related to my &lt;a href=&#34;https://ybbond.id/posts/2020-06-on-trial-refund-support&#34;&gt;rant post&lt;/a&gt;, I prefer historio.us as my site archiving service. Page caching system is better (i.e. not an &lt;code&gt;&amp;lt;iframe/&amp;gt;&lt;/code&gt;), and search is easier.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Inclusive Content Sharing</title>
      <link>https://ybbond.id/posts/2020-06-inclusive/</link>
      <pubDate>Sun, 28 Jun 2020 16:44:38 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-06-inclusive/</guid>
      <description>&lt;p&gt;This is a complicated world. Each individuals are different, and there are many factors to consider while interacting with others. People who don&amp;rsquo;t eat pork, or won&amp;rsquo;t eat meat. People who fond of talking about ghost, and the ones easily scared. You must leave the toilet seat closed in some house, in some others opened.&lt;/p&gt;
&lt;p&gt;Internet adds to that complexity. For instance you share a cute picture of a snake. There may be someone having &lt;em&gt;Ophidiophobia&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; who will block you. Not because they hate you, but only to get rid of that &amp;ldquo;horrible picture&amp;rdquo; of a scary creature.&lt;/p&gt;
&lt;h2&gt;On Inclusivity&lt;/h2&gt;&lt;p&gt;The awareness of inclusivity had spread wider day by day. There is &lt;strong&gt;Inclusive Design&lt;/strong&gt;, which concepts encourage you to think about &lt;strong&gt;diversity&lt;/strong&gt; and &lt;strong&gt;accessibility&lt;/strong&gt; when building products.&lt;/p&gt;
&lt;p&gt;Example of diversity: provide more gender dropdown choice knowing some people won&amp;rsquo;t feel comfortable sharing their gender. Or perhaps, make the gender dropdown choice non-mandatory. Better yet, don&amp;rsquo;t ask for it.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-inclusive/gender-selection.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Image&amp;#32;courtesy&amp;#32;of&amp;#32;post&amp;#32;from&amp;#32;Sarah&amp;#32;Dopp
    title=Image&amp;#32;courtesy&amp;#32;of&amp;#32;post&amp;#32;from&amp;#32;Sarah&amp;#32;Dopp
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Image courtesy of &lt;a rel=&#34;nofollow noreferrer&#34; href=&#34;http://www.sarahdopp.com/blog/2010/designing-a-better-drop-down-menu-for-gender/&#34;&gt;post from Sarah Dopp&lt;/a&gt;&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Example of accessibility: make your website content recognizable by text-to-speech software for those having difficulties reading. Other example of accessibility: provide certain color scheme on video game&amp;rsquo;s User Interface, for those having difficulties differentiating certain colors.&lt;/p&gt;
&lt;h2&gt;Content Sharing&lt;/h2&gt;&lt;p&gt;Back to the topic of content sharing. I gave you example about sharing picture of animal that some people may find disturbing. That is one thing.&lt;/p&gt;
&lt;p&gt;Other thing is to think about individuals that do extra effort to conceal their &lt;strong&gt;privacy&lt;/strong&gt;, even from Google&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;What is it about Google? Well, some people believe that accessing Google&amp;rsquo;s domains or endpoints may give off their privacy to that company. The obvious example is using Google Analytics for any website&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. That practice may give off visitors&amp;rsquo; data to Google. Other example is using Google Fonts, or embedding Youtube videos. Extreme example is linking a text to Youtube, like how I did in some of my posts.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-inclusive/2.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Previously,&amp;#32;I&amp;#32;share&amp;#32;Youtube&amp;#32;links&amp;#32;too
    title=Previously,&amp;#32;I&amp;#32;share&amp;#32;Youtube&amp;#32;links&amp;#32;too
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Previously, I share Youtube links too&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-inclusive/youtube-invidious.gif&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Changed&amp;#32;those&amp;#32;to&amp;#32;Invidious
    title=Changed&amp;#32;those&amp;#32;to&amp;#32;Invidious
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Changed those to Invidious&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;This practice may leads unaware readers to accidentally visit Youtube. They won&amp;rsquo;t like that. I replaced the links to &lt;a href=&#34;https://invidio.us&#34;&gt;Invidio.us&lt;/a&gt; though. Hope that helps.&lt;/p&gt;
&lt;p&gt;So we talked about disturbing content and privacy. I am also thinking about &lt;strong&gt;content availability&lt;/strong&gt;. The example is sharing great content that some people may not be able to retrieve, because it is hidden behind paywall. The example is some content on Medium, or NYTimes.&lt;/p&gt;
&lt;p&gt;I often encounter this on Hacker News, where the linked content is a paywalled post on Medium, or NYTimes. There is a work-around for this that I often use, because some of those great contents might only be available on that certain paywalled platform.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-inclusive/medium-paywall.gif&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=GIF&amp;#32;animation&amp;#32;of&amp;#32;Medium&amp;#32;Paywall,&amp;#32;also&amp;#32;an&amp;#32;irony
    title=GIF&amp;#32;animation&amp;#32;of&amp;#32;Medium&amp;#32;Paywall,&amp;#32;also&amp;#32;an&amp;#32;irony
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;GIF animation of Medium Paywall, also an irony&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;When sharing contents that I originally read on Medium, I train myself to take some time searching whether that post shared elsewhere and to share the alternative link instead.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;You cannot please everyone.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The topics I&amp;rsquo;ve written are not all. Others may think of other factors they find necessary to consider before writing post or sharing links on the internet.&lt;/p&gt;
&lt;p&gt;Easier written than said, even more done.&lt;/p&gt;
&lt;p&gt;Sometimes I forget about some factors, and I am willing to be stand corrected for that. Thank you for all of you taking your precious time for reminding me. Truly appreciate your good intention.&lt;/p&gt;
&lt;p&gt;As a closing statement: This is a complicated world. I can be a simpleton and ignoring all those complexity, but I choose the option that I think will make this world a more pleasant place to live. For me, and others.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Fear of snake. Even they may feel the fear only by reading the word of that animal. Sorry then :(&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://alirezahayati.com/2020/06/dont-trust-privacy-options/&#34;&gt;Don&amp;rsquo;t trust privacy options&lt;/a&gt; → &lt;strong&gt;Ali Reza Hayati&lt;/strong&gt; boldly written about how some companies may use your private informations for scary things. Not now, maybe, but might be in the future.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://vincent.bernat.ch/en/blog/2018-more-privacy-blog&#34;&gt;A more privacy-friendly blog&lt;/a&gt; → This is a great post by &lt;strong&gt;Vincent Bernat&lt;/strong&gt; listing privacy friendly alternatives for tools oft used on website.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Org-mode with Org-roam</title>
      <link>https://ybbond.id/posts/2020-06-org-mode-with-org-roam/</link>
      <pubDate>Sat, 27 Jun 2020 23:05:28 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-06-org-mode-with-org-roam/</guid>
      <description>&lt;p&gt;On a late night some twenty or more days ago, my friend &lt;a href=&#34;https://twitter.com/broerjuang&#34; title=&#34;Link to Juang&#39;s twitter profile&#34;&gt;Juang&lt;/a&gt; contacted me on Discord.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On Wed, Jun 03, 2020 at 01.20 AM @broerjuang wrote:&lt;br /&gt;
Dung&lt;/p&gt;
&lt;p&gt;On Wed, Jun 03, 2020 at 01.20 AM @ybbond wrote:&lt;br /&gt;
ju&lt;/p&gt;
&lt;p&gt;On Wed, Jun 03, 2020 at 01.20 AM @broerjuang wrote:&lt;br /&gt;
&lt;a href=&#34;https://github.com/org-roam/org-roam&#34;&gt;https://github.com/org-roam/org-roam&lt;/a&gt;&lt;br /&gt;
lol&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;He knew about me ranting on Twitter two days earlier for not getting invitation to try &lt;strong&gt;Roam Research&lt;/strong&gt;. He is also a fellow &lt;em&gt;Vimmer&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, and I think he knew that I will think twice before using Emacs. I decided to to try it today.&lt;/p&gt;
&lt;h2&gt;The Steps&lt;/h2&gt;&lt;p&gt;First, I installed Emacs. If you are on macOS, it is &lt;a href=&#34;https://github.com/hlissner/doom-emacs/blob/develop/docs/getting_started.org#with-homebrew&#34;&gt;highly recommended&lt;/a&gt; to use emacs-plus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew tap d12frosted/emacs-plus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install emacs-plus --with-modern-icon-cg433n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -s /usr/local/opt/emacs-plus/Emacs.app /Applications/Emacs.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then install Doom Emacs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/hlissner/doom-emacs ~/.emacs.d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.emacs.d/bin/doom install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I know from experience that I should try the vanilla version of any software before modding it. For Emacs, I have known its basic navigation key bindings. I even use the basic &lt;code&gt;C-b&lt;/code&gt;, &lt;code&gt;C-f&lt;/code&gt;, &lt;code&gt;C-n&lt;/code&gt;, &lt;code&gt;C-p&lt;/code&gt;, &lt;code&gt;C-a&lt;/code&gt; and &lt;code&gt;C-e&lt;/code&gt; instead of arrow keys to navigate most text editor that don&amp;rsquo;t support Vim key bindings. Even you can use Emacs bindings for the form in the internet with Web Browser. Doom Emacs use Evil mode key bindings by default, that means Vim-like key binding is usable from the start.&lt;/p&gt;
&lt;p&gt;I make myself comfortable with Doom Emacs for an hour, then installing Org-roam. With Doom Emacs, Org-mode is installed by default and I can add &lt;code&gt;+roam&lt;/code&gt; flag in &lt;code&gt;init.el&lt;/code&gt; to install Org-roam. You can also follow the main installation method from &lt;a href=&#34;https://github.com/org-roam/org-roam#installation&#34;&gt;the docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-org-mode-with-org-roam/1.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Add&amp;#32;&amp;#43;roam&amp;#32;flag&amp;#32;for&amp;#32;org
    title=Add&amp;#32;&amp;#43;roam&amp;#32;flag&amp;#32;for&amp;#32;org
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Add +roam flag for org&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I also installed the recommended packages &lt;code&gt;deft&lt;/code&gt; and &lt;code&gt;org-journal&lt;/code&gt;. The former is a tool to open any file by searching its title or content text. The later is a complementary framework to make a good timeline based journaling &lt;em&gt;à la&lt;/em&gt; Roam Research. With the tool ready, I try making a daily journal with the shortcut &lt;code&gt;C-c&lt;/code&gt; &lt;code&gt;n&lt;/code&gt; &lt;code&gt;j&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-org-mode-with-org-roam/3.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Example&amp;#32;of&amp;#32;daily&amp;#32;journal&amp;#32;with&amp;#32;Org-roam
    title=Example&amp;#32;of&amp;#32;daily&amp;#32;journal&amp;#32;with&amp;#32;Org-roam
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Example of daily journal with Org-roam&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;The Matter of Personal Preferences&lt;/h2&gt;&lt;p&gt;Evil mode is actually an acronym for &lt;em&gt;Extensible Vi Layer&lt;/em&gt;. Its key bindings really makes me feel at home, but it still has some quirks. My first problem is with soft wrapped text. I mapped &lt;code&gt;gj&lt;/code&gt; and &lt;code&gt;gk&lt;/code&gt; to replace default &lt;code&gt;j&lt;/code&gt; and &lt;code&gt;k&lt;/code&gt; in Vim, it enables &lt;strong&gt;per visual line&lt;/strong&gt; movement on wrapped text, instead of &lt;strong&gt;per line number&lt;/strong&gt;. &lt;code&gt;evil-mode&lt;/code&gt; provides &lt;code&gt;evil-respect-visual-line-mode&lt;/code&gt; option, but it doesn&amp;rsquo;t work in the case of delete whole line with &lt;code&gt;dd&lt;/code&gt; command. With that option enabled, &lt;code&gt;dd&lt;/code&gt; will only delete the current visual line. I installed &lt;a href=&#34;https://github.com/YourFin/evil-better-visual-line&#34;&gt;evil-better-visual-line&lt;/a&gt; that try to solve this issue. There is still some quirks, but better than before.&lt;/p&gt;
&lt;p&gt;My second problem is clipboard management. I expect a Vim-like environment to not mess with my system clipboard each time I delete, yank or change any text with Vim key bindings. I want the editor to use its internal register for Vim commands, and only use clipboard if I explicitly use &lt;code&gt;⌘+c&lt;/code&gt; and &lt;code&gt;⌘+v&lt;/code&gt;. For this issue, I asked on Doom Emacs&amp;rsquo; discord channel, and got the solution from this &lt;a href=&#34;https://github.com/midchildan/dotfiles/blob/master/home/.config/doom/config.org#cutting-and-pasting&#34;&gt;this guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A newbie Emacs user, I configure with Org-roam&amp;rsquo;s maintainer&amp;rsquo;s &lt;a href=&#34;https://github.com/jethrokuan/dots&#34;&gt;dotfiles&lt;/a&gt; as reference. You can see my Doom Emacs configuration files on my &lt;a href=&#34;https://github.com/ybbond/dotfiles/&#34;&gt;dotfiles repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Moving from FSNotes&lt;/h2&gt;&lt;p&gt;I use FSNotes to keep my notes. It is a great program inspired by nvALT and created by a single person (check out the &lt;a href=&#34;https://www.patreon.com/hlushchenko&#34;&gt;Patreon page&lt;/a&gt;!). It features wiki linking and I&amp;rsquo;ve tried using Zettelkasten paradigm, even though not too successful. I have 300+ good Markdown files in it, guides, personal notes, quotes from internet, many topics.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-org-mode-with-org-roam/2.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Example&amp;#32;of&amp;#32;product&amp;#32;note&amp;#32;on&amp;#32;Org-roam
    title=Example&amp;#32;of&amp;#32;product&amp;#32;note&amp;#32;on&amp;#32;Org-roam
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Example of product note on Org-roam&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-org-mode-with-org-roam/4.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Comparing&amp;#32;FSNotes&amp;#32;with&amp;#32;Org-roam
    title=Comparing&amp;#32;FSNotes&amp;#32;with&amp;#32;Org-roam
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Comparing FSNotes with Org-roam&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;My next move after creating journal with Org-roam is&amp;hellip; migrating the Markdown files to Org files. I migrated 2 files at first, then compared between my notes on Org-roam with the one in FSNotes. I actually liked the interface of FSNotes, but the automatic back links, and the Vim bindings&amp;hellip; I went &amp;ldquo;what the hell&amp;rdquo; and migrated all of those 300+ Markdown files. It took around 2 hours of my afternoon, but I enjoy it.&lt;/p&gt;
&lt;p&gt;There is still issue though.&lt;/p&gt;
&lt;h2&gt;The Org as in Mode and File Extension&lt;/h2&gt;&lt;p&gt;I like to do things on my Macbook Pro. I even bring the laptop everywhere. I use it like anyone else use smartphone, as communication tool, scrolling social medias&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, read articles and news. But I&amp;rsquo;d still like to be able to see my notes on my iPhone or iPad, and this weird *.org file format hindered me on doing so.&lt;/p&gt;
&lt;p&gt;FSNotes has iOS app that synchronizes instantly. Looking on the App Store, Reddit and DuckDuckGo, I only find this app called &lt;a href=&#34;https://beorgapp.com/&#34;&gt;Beorg&lt;/a&gt;. By itself, Beorg is a good TODO and Agenda manager based on Org-mode. It won&amp;rsquo;t accept *.org file outside its iCloud directory, so no go. Other alternative is to install terminal emulator app and Emacs within, but it won&amp;rsquo;t be a pleasant touch experience.&lt;/p&gt;
&lt;p&gt;Org-mode has a weird syntax to display verbatim text and it doesn&amp;rsquo;t have syntax for displaying inline code or block code. As a programmer that often store note related to coding, I think this is a minus.&lt;/p&gt;
&lt;p&gt;Thinking long and far, I decided to keep using Org-roam, while waiting to find a good iOS app that allow me to read my notes. Maybe it&amp;rsquo;s time to make my own iOS application that does just that? Interesting.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s &lt;a href=&#34;https://invidio.us/watch?v=JWD1Fpdd4Pc&#34;&gt;stop worrying and start loving&lt;/a&gt; &lt;del&gt;Emacs&lt;/del&gt; &lt;strong&gt;Org-mode&lt;/strong&gt;! It is overall a good framework to store notes, add Org-roam and it became many times better! Don&amp;rsquo;t worry, (Neo)Vim is still my daily driver.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Not sure if this is even a word, but you know&amp;hellip; A &lt;strong&gt;Vim&lt;/strong&gt; user?&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Even though I try to use social media as minimum as possible.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>On Free Trial, Refund, and Horrible Customer Support</title>
      <link>https://ybbond.id/posts/2020-06-on-trial-refund-support/</link>
      <pubDate>Wed, 17 Jun 2020 17:07:22 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-06-on-trial-refund-support/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Update per &lt;time title=&#34;Thursday, 18 June 2020 on 11:05 GMT+7&#34;&gt;June 18th, 2020&lt;/time&gt;:&lt;/p&gt;
&lt;p&gt;Mr. Maciej of Pinboard just replied to my email and by that, my refund is in process. My Pinboard account is closed now.&lt;/p&gt;&lt;/blockquote&gt;
&lt;br&gt;
&lt;hr /&gt;
&lt;p&gt;This is more of a rant than a proper blog post. You may call this is a &lt;strong&gt;Buyer&amp;rsquo;s Remorse&lt;/strong&gt;. I say, this is a biased review for &lt;strong&gt;Pinboard&lt;/strong&gt; and &lt;strong&gt;Feed Wrangler&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I am an avid app and SaaS&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; user who likes to look for any apps/services for certain use cases. I will try a set of apps with a more-or-less same feature before committing on one app. This method leads me to use iA Writer —writing app, BitWarden —password manager service, Fastmail —mail provider, FSNotes —note taking app, Canary Mail —email client. The afore mentioned apps and their competitors that I&amp;rsquo;ve tried beforehand offer free trial period that allow me to have a sneak peek of what I will be getting.&lt;/p&gt;
&lt;p&gt;But these services that I stuck with, &lt;a href=&#34;https://pinboard.in&#34;&gt;&lt;strong&gt;Pinboard&lt;/strong&gt;&lt;/a&gt; —bookmarking service, and &lt;a href=&#34;https://feedwrangler.net&#34;&gt;&lt;strong&gt;Feed Wrangler&lt;/strong&gt;&lt;/a&gt; —RSS backend. I was forced to use them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I was &lt;strong&gt;forced to use and pay them&lt;/strong&gt; while I was in progress of trying.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I was looking for good RSS backend after my instance of self hosted RSS broke, so I tried other services that is supported by Reeder. Most of them offer free trial, except Feed Wrangler. The same for Pinboard, one of the apps in my &amp;lsquo;&lt;em&gt;bookmark and arciving services to try&lt;/em&gt;&amp;rsquo; list. Other services are Pocket, Polar, Raindrop.io, Keep It, &lt;em&gt;etc.&lt;/em&gt; and they offer free trial.&lt;/p&gt;
&lt;p&gt;Both Feed Wrangler and Pinboard &lt;strong&gt;offer a no question asked refund policy&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, that cannot be claimed&lt;/strong&gt;. What is worse, they both &lt;strong&gt;only offer a one year&lt;/strong&gt; plan. I have contacted their support mail, and both have not responded to any of my refund request mail. Heck, I even contacted the developers&amp;rsquo; personal mail with a thoughtful and polite email content in a desperate effort to get their attention and response.&lt;/p&gt;
&lt;h2&gt;We are all in a difficult situation&lt;/h2&gt;&lt;p&gt;The new Covid-19 pandemic that has been going more than half a year makes our live difficult. Beside the &lt;a href=&#34;https://www.worldometers.info/coronavirus/coronavirus-death-toll/&#34;&gt;hundreds of thousands&lt;/a&gt; of death toll and people in hunger or homelessness, many people just got laid-off and unemployed. Those who are lucky and still employed (including me) got their sallary cut or got more work to do.&lt;/p&gt;
&lt;p&gt;I have great understandings if a service&amp;rsquo;s customer support got overwhelmed. But when I checked pinboard&amp;rsquo;s &lt;a href=&#34;https://twitter.com/pinboard&#34;&gt;twitter account&lt;/a&gt;, the account still actively tweets and replied at the same time I am waiting for their email reply. I even contacted Pinboard&amp;rsquo;s twitter account by mentioning and Direct Message.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/Pinboard?ref_src=twsrc%5Etfw&#34;&gt;@Pinboard&lt;/a&gt; I have emailed the support for 3 days but no response this far. I want to request refund and account deletion for my account &amp;quot;ybbond&amp;quot;&lt;/p&gt;&amp;mdash; Yohanes Bandung Bondowoso (@ybbond) &lt;a href=&#34;https://twitter.com/ybbond/status/1273099013693280256?ref_src=twsrc%5Etfw&#34;&gt;June 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;There is a chance my emails got detected as spam. I am well aware of that, so I write my refund requests as polite as possible:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On Wed, Jun 17, 2020 at 2:08 PM [REDACTED] wrote:&lt;/p&gt;
&lt;p&gt;I  want to refund for account &amp;ldquo;[REDACTED]&amp;rdquo;, on the email &amp;ldquo;[REDACTED]&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I have emailed since 3 days ago with my personal mail address, but no response. I even desperately contacted you via twitter.&lt;/p&gt;
&lt;p&gt;Thank you for your attention, I also have feedback to setup trial account, because your email support is not active, but in the FAQ you said there will be 3 days no question asked refund policy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The waiting game just began.&lt;/p&gt;
&lt;h2&gt;The Review&lt;/h2&gt;&lt;p&gt;So, a quick, biased review for Feed Wrangler and Pinboard, because they have basically the same feats:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;solid basic features&lt;/li&gt;
&lt;li&gt;good integration with third-party apps&lt;/li&gt;
&lt;li&gt;&amp;rsquo;no-nonsense&amp;rsquo; interface that don&amp;rsquo;t bloat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;their customer supports are horrible&lt;/li&gt;
&lt;li&gt;their &amp;rsquo;no-nonsense&amp;rsquo; interface are not very beautiful&lt;/li&gt;
&lt;li&gt;no official or reliable first-party mobile apps&lt;/li&gt;
&lt;li&gt;pinboard&amp;rsquo;s archival account won&amp;rsquo;t work for Medium and many developers&amp;rsquo; good site&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;On Paid Services&lt;/h2&gt;&lt;p&gt;I don&amp;rsquo;t mind paying&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; for apps or services, but I feel irritated because I am forced to pay for stuff I won&amp;rsquo;t use. Or forced to use, because that I have paid for one, I have to dismiss the alternatives.&lt;/p&gt;
&lt;p&gt;My purse is not that deep, you know?&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Software as a Service, see &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_as_a_service&#34;&gt;Wikipedia&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;See Feed Wrangler&amp;rsquo;s claim for their &lt;a href=&#34;http://archive.is/kljHb&#34; title=&#34;Link to archived feed wrangler landing page&#34;&gt;refund policy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-06-on-trial-refund-support/feed-wrangler.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=ZgotmplZ
    title=ZgotmplZ
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;See Pinboard&amp;rsquo;s FAQ on &lt;a href=&#34;http://archive.is/hXgBr#free_trial&#34; title=&#34;Link to archived pinboard faq page&#34;&gt;Is there a free trial?&lt;/a&gt; also on &lt;a href=&#34;http://archive.is/hXgBr#refund&#34; title=&#34;Link to archived pinboard faq page&#34;&gt;How do I get a refund?&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;This statement refers on how piracy is still a common thing. No scientific research concluded, it is just uncountable and unreliable common knowledge. I still try to pay my debts for the computer programs or games I pirated in my younger days. My pirating practice can be rationalized. Back then, my knowledge about software licensing and ownership was none. Access to credit card was rare even for adults. Seller of original licensed software was hard to found. At least in Indonesia.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on May, 2020</title>
      <link>https://ybbond.id/posts/2020-05-interesting-links/</link>
      <pubDate>Sun, 31 May 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-05-interesting-links/</guid>
      <description>&lt;h2&gt;Tech&lt;/h2&gt;&lt;p&gt;📠 &lt;a href=&#34;https://hyfen.net/memex/&#34;&gt;Building a Memex - Andrew Louis&lt;/a&gt;&lt;br /&gt;
Awesome project! I think the name is hilarious because it sounds like Indonesian slang word for vagina.&lt;/p&gt;
&lt;p&gt;🌳 &lt;a href=&#34;http://codemadness.org/git/stagit/&#34;&gt;stagit - codemadness&lt;/a&gt;&lt;br /&gt;
I like Luke Smith&amp;rsquo;s &lt;a href=&#34;https://git.lukesmith.xyz/&#34;&gt;git site&lt;/a&gt; and emailed him asking how it&amp;rsquo;s made.&lt;br /&gt;
He said it is stagit, and he mentioned list of other &lt;a href=&#34;https://suckless.org/rocks/&#34;&gt;awesome suckless tools&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Blog&lt;/h2&gt;&lt;p&gt;🎭 &lt;a href=&#34;https://vincent.bernat.ch/en/blog/2018-more-privacy-blog&#34;&gt;A More Privacy Friendly Blog - Vincent Bernat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🗣 &lt;a href=&#34;https://jvns.ca/blog/2020/05/08/metaphors-in-man-pages/&#34;&gt;Metaphors in man pages - Julia Evans&lt;/a&gt;&lt;br /&gt;
Linguistic fascinates me. This post points out the often used metaphors in programming area. Nicely written too.&lt;/p&gt;
&lt;h2&gt;App&lt;/h2&gt;&lt;p&gt;📝 &lt;a href=&#34;https://github.com/glushchenko/fsnotes&#34;&gt;FSNotes Mac &amp;amp; iOS App&lt;/a&gt;&lt;br /&gt;
I used nvALT for Zettelkasten, &lt;code&gt;FSNotes.app&lt;/code&gt; brings nvALT goodness and make it more stable, more pleasant UI and iOS app.&lt;/p&gt;
&lt;p&gt;🔒 &lt;a href=&#34;https://bitwarden.com&#34;&gt;Bitwarden&lt;/a&gt;&lt;br /&gt;
Ever since Indonesian eCommerce &lt;a href=&#34;https://securityaffairs.co/wordpress/102666/data-breach/tokopedia-hacked.html&#34;&gt;Tokopedia got hacked&lt;/a&gt;, I changed all my passwords, enable 2FA for most, and make all of them different and use Password manager for convenience. Bitwarden is good, cheap and available everywhere.&lt;/p&gt;
&lt;p&gt;👀 &lt;a href=&#34;https://github.com/samuelmeuli/glance&#34;&gt;Glance Mac App&lt;/a&gt;&lt;br /&gt;
A complementary for macOS&amp;rsquo;s &lt;code&gt;Finder.app&lt;/code&gt;. Add the ability to see most of source code and compressed file&amp;rsquo;s content.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>About The Web Analytics I Use</title>
      <link>https://ybbond.id/posts/2020-05-about-goatcounter/</link>
      <pubDate>Sat, 23 May 2020 00:47:36 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-05-about-goatcounter/</guid>
      <description>&lt;p&gt;I like to develop website. I also like to write blogs, poems, post mortem, thoughts, tutorial, anything. I enjoy doing those things that even if I cannot publish (some of) them, I&amp;rsquo;ve got more experience and I feel good.&lt;/p&gt;
&lt;p&gt;But.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s be real here. I have itches. Curiosity. Social needs? Maybe, but I try avoid social media, or &lt;a href=&#34;https://indieweb.org/silo&#34;&gt;silo&lt;/a&gt; — as the IndieWeb folks call it. I try to serve this site keeping my ethic&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and readers&amp;rsquo; privacy. I also want to know whether anyone read my posts, and I want my works to be assessed by fellow readers. The assessment can be as simple as likes and thumb-ups (Luke Smith hilariously calls them &lt;em&gt;upcummies&lt;/em&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;). The assessment can also be comments or text feedbacks, this is what I prefer the most.&lt;/p&gt;
&lt;p&gt;With the stuff I just told you in mind, I decided that I will implement analytic&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; and response system to this site. So I researched for the tools. The main requirements are lightweight and respects users&amp;rsquo; privacy.&lt;/p&gt;
&lt;p&gt;For the response system, I found &lt;a href=&#34;https://webmention.io/&#34;&gt;WebMention&lt;/a&gt;, which leads me to know more about &lt;a href=&#34;https://indieweb.org&#34;&gt;IndieWeb&lt;/a&gt;. The current candidate for the direct commenting system is &lt;a href=&#34;https://posativ.org/isso/&#34;&gt;Isso&lt;/a&gt;. The first I implemented is web analytics. Already suggested in this post&amp;rsquo;s title, I use GoatCounter.&lt;/p&gt;
&lt;h2&gt;About GoatCounter&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.goatcounter.com/&#34;&gt;GoatCounter&lt;/a&gt; is web analytics by Martin Tournoij or &lt;a href=&#34;https://www.arp242.net/goatcounter.html&#34;&gt;arp242&lt;/a&gt;. It is lightweight, it is easy to implement, and it &lt;strong&gt;respects users&amp;rsquo; privacy&lt;/strong&gt;. See its privacy policy &lt;a href=&#34;https://www.goatcounter.com/privacy&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One embarassing thing is that I follow Martin&amp;rsquo;s RSS Feed for so long, but I didn&amp;rsquo;t read about his latest project. Before GoatCounter, I tried &lt;a href=&#34;https://statcounter.com&#34;&gt;StatCounter&lt;/a&gt; and opted-out shortly because I think the settings page is clumsy. I searched for another good alternatives that results none. Just last monday I see Martin published a new post about GoatCounter update. I decided to check it and that day, I tried GoatCounter.&lt;/p&gt;
&lt;p&gt;You can see my instance of GoatCounter on &lt;a href=&#34;https://ybbond.goatcounter.com/&#34;&gt;ybbond.goatcounter.com&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I made it open for everyone and set obvious statement down in the footer, because I think however small the data I take from user visits, the users should be able to know about it.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A good post from iA, &lt;em&gt;&amp;ldquo;Ethics&amp;rdquo; and Ethics&lt;/em&gt; by &lt;strong&gt;Oliver Reichenstein&lt;/strong&gt;. &lt;a href=&#34;https://ia.net/topics/ethics-and-ethics&#34;&gt;Read it here&lt;/a&gt; on their site.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Reference is from video &lt;em&gt;Social Media: Anything for Upcummies! ⬆🍆💦💦&lt;/em&gt; by &lt;strong&gt;Luke Smith&lt;/strong&gt;. You can &lt;a href=&#34;https://invidio.us/watch?v=YjbyDU0WzYI&amp;amp;t=48&#34;&gt;watch it here&lt;/a&gt; on Invidio.us.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;I even stated in my &lt;a href=&#34;https://ybbond.id/posts/2020-04-migrating-my-blog-to-hugo/#current-features&#34;&gt;post&lt;/a&gt; about migrating to Hugo that I will implement &lt;em&gt;tracker&lt;/em&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Remove Specific Files from Old Git Commit</title>
      <link>https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/</link>
      <pubDate>Sat, 16 May 2020 13:01:19 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/</guid>
      <description>&lt;p&gt;tldr; &lt;a href=&#34;#how-tos&#34;&gt;Skip to solution »&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last week, I encountered a merge conflict while trying to sync my git working branch to latest remote &lt;code&gt;master&lt;/code&gt;. Merge conflicts is not a serious problem to me, I am used to resolving conflicts. But the conflict that I encountered is from an auto generated typings file from &lt;code&gt;Apollo Codegen&lt;/code&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Apollo Codegen&lt;/code&gt; file is &lt;code&gt;Flow&lt;/code&gt; or &lt;code&gt;TypeScript&lt;/code&gt; typings for the schema and queries in project that uses GraphQL. The generated file often has &amp;gt;10k lines of code. Trying to resolve conflict in that file will make the text editor unresponsive (even with Vim!).&lt;/p&gt;
&lt;p&gt;So I aborted the sync master (&lt;code&gt;git rebase --abort&lt;/code&gt;), then attempt to remove the changes for the auto-generated codegen file &lt;a href=&#34;#lazygit-way&#34;&gt;using lazygit&lt;/a&gt;. Afterwards, I do sync remote &lt;code&gt;master&lt;/code&gt; branch and the conflict don&amp;rsquo;t happen. Last thing I do is regenerate the codegen file before posting a Pull Request.&lt;/p&gt;
&lt;h2&gt;How-Tos&lt;/h2&gt;&lt;p&gt;Back to the post&amp;rsquo;s main topic, to remove specific file using plain old shell command.&lt;/p&gt;
&lt;p&gt;First, checkout to &lt;strong&gt;temporary branch&lt;/strong&gt; with the afore mentioned commit as &lt;code&gt;HEAD&lt;/code&gt; using the commit&amp;rsquo;s hash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout &amp;lt;commit-hash&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then do a &lt;strong&gt;soft reset&lt;/strong&gt; to uncommit with all files in staged status:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git reset --soft HEAD^
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make the desired file(s) unstaged using &lt;strong&gt;reset&lt;/strong&gt; command, and then commit with &lt;code&gt;-c ORIG_HEAD&lt;/code&gt; flag to use the previous commit message. The &lt;code&gt;--no-edit&lt;/code&gt; flag is optional.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git reset &amp;lt;path/to/file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -c ORIG_HEAD --no-edit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Discard the changes of the file you want to remove from unstaged area:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout -- .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Last, &lt;code&gt;rebase&lt;/code&gt; this &lt;strong&gt;temporary branch&lt;/strong&gt; to your branch, from the commit of &lt;code&gt;&amp;lt;commit-hash&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase --onto HEAD &amp;lt;commit-hash&amp;gt; &amp;lt;destination-branch-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you do this for already merged Pull Request, you need to &lt;code&gt;push &amp;lt;remote&amp;gt; &amp;lt;branch&amp;gt; --force&lt;/code&gt;. Mind you, doing this will be inconvenient for other people working on same project.&lt;/p&gt;
&lt;h2&gt;Lazygit Way&lt;/h2&gt;&lt;p&gt;As I mentioned above, I use &lt;a href=&#34;https://github.com/jesseduffield/lazygit&#34;&gt;lazygit&lt;/a&gt;. The process is more straight forward. For the following example, I accidentally committed build file, far before I &lt;code&gt;.gitignore&lt;/code&gt;d &lt;code&gt;build/&lt;/code&gt; folder. What I do is:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/1.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Navigate&amp;#32;to&amp;#32;desired&amp;#32;commit
    title=Navigate&amp;#32;to&amp;#32;desired&amp;#32;commit
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Navigate to desired commit&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/2.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Press&amp;#32;return&amp;#32;key,&amp;#32;and&amp;#32;navigate&amp;#32;to&amp;#32;file&amp;#32;to&amp;#32;be&amp;#32;removed
    title=Press&amp;#32;return&amp;#32;key,&amp;#32;and&amp;#32;navigate&amp;#32;to&amp;#32;file&amp;#32;to&amp;#32;be&amp;#32;removed
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Press return key, and navigate to file to be removed&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/3.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Press&amp;#32;x&amp;#32;will&amp;#32;prompt&amp;#32;command&amp;#32;list.&amp;#32;Turns&amp;#32;out&amp;#32;d&amp;#32;will&amp;#32;discard&amp;#32;the&amp;#32;file
    title=Press&amp;#32;x&amp;#32;will&amp;#32;prompt&amp;#32;command&amp;#32;list.&amp;#32;Turns&amp;#32;out&amp;#32;d&amp;#32;will&amp;#32;discard&amp;#32;the&amp;#32;file
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Press &lt;code&gt;x&lt;/code&gt; will prompt command list. Turns out &lt;code&gt;d&lt;/code&gt; will discard the file&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-05-remove-specific-files-from-old-git-commit/4.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=After&amp;#32;pressing&amp;#32;d,&amp;#32;the&amp;#32;Index.js&amp;#32;file&amp;#32;is&amp;#32;now&amp;#32;removed!
    title=After&amp;#32;pressing&amp;#32;d,&amp;#32;the&amp;#32;Index.js&amp;#32;file&amp;#32;is&amp;#32;now&amp;#32;removed!
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;After pressing &lt;code&gt;d&lt;/code&gt;, the &lt;code&gt;Index.js&lt;/code&gt; file is now removed!&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Do this way if you want to install lazygit before doing your intention.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lazygit&lt;/code&gt; way is easier. I also use &lt;a href=&#34;https://github.com/jonas/tig&#34;&gt;tig&lt;/a&gt; as a TUI for &lt;code&gt;git&lt;/code&gt;, but I don&amp;rsquo;t know the command to do the steps wit &lt;code&gt;tig&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Here is &lt;code&gt;Apollo Codegen&lt;/code&gt; &lt;a href=&#34;https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output&#34;&gt;Github&lt;/a&gt; page. As a frontend engineer, I consider &lt;code&gt;codegen&lt;/code&gt; as breakthrough because I can easily type the endpoint&amp;rsquo;s return value.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on April, 2020</title>
      <link>https://ybbond.id/posts/2020-04-interesting-links/</link>
      <pubDate>Thu, 30 Apr 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-04-interesting-links/</guid>
      <description>&lt;h2&gt;Tech&lt;/h2&gt;&lt;p&gt;🌏 &lt;a href=&#34;https://indieweb.org/&#34;&gt;IndieWeb&lt;/a&gt;&lt;br /&gt;
Led me to &lt;code&gt;IndieWebify&lt;/code&gt; this site.&lt;/p&gt;
&lt;p&gt;👠 &lt;a href=&#34;https://github.com/vime-js/vime/blob/master/README.md&#34;&gt;vime/README.md at master · vime-js/vime · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🛂 &lt;a href=&#34;https://xkcd.com/936/&#34;&gt;Password Strengh - xkcd #936&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Blog&lt;/h2&gt;&lt;p&gt;📰 &lt;a href=&#34;https://news.ycombinator.com/item?id=22800136&#34;&gt;Ask HackerNews: What is your blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🧮 &lt;a href=&#34;https://www.dannysalzman.com/2020/04/08/analyzing-hn-readers-personal-blogs&#34;&gt;Analyzing HN Reader&amp;rsquo;s Personal Blogs Part 1 - Danny Salzman, by Danny Salzman&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🌑 &lt;a href=&#34;https://xkcd.com/2293/&#34;&gt;RIP John Conway - xkcd #2293&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Knowledge&lt;/h2&gt;&lt;p&gt;An interesting &lt;a href=&#34;https://yihui.org/en/2018/02/career-crisis/&#34;&gt;post&lt;/a&gt; by Yihui Xie, maintainer of TinyTex, and its &lt;a href=&#34;https://yihui.org/en/2018/02/procrastination-techniques/&#34;&gt;follow-up&lt;/a&gt; that leads me to this naughty website:&lt;br /&gt;
🐒 &lt;a href=&#34;https://corrupt-a-file.net/&#34;&gt;Corrupt a file - Corrupt file online, deliver on time!&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why I Positioned Sidebar to the Right</title>
      <link>https://ybbond.id/posts/2020-04-why-i-positioned-sidebar-to-the-right/</link>
      <pubDate>Mon, 27 Apr 2020 04:57:12 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-04-why-i-positioned-sidebar-to-the-right/</guid>
      <description>&lt;p&gt;A few minutes ago, I opened twitter and scrolled the timeline.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;This is 🔥&lt;br&gt;(I love that you have the tree on the right side. @ybbond_ told me to do this a long time ago 🤣)&lt;/p&gt;&amp;mdash; Simon Sturmer (@sstur_) &lt;a href=&#34;https://twitter.com/sstur_/status/1254492579275526145?ref_src=twsrc%5Etfw&#34;&gt;April 26, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;I laughed when I read that tweet. It brings back so much memories of my previous workplace.&lt;/p&gt;
&lt;p&gt;Positioning the sidebar to the right reduces distraction when I toggle it. If the sidebar is on the left, the text shifts around whenever the sidebar is toggled on or off. Readjusting my eyes for the moved text creates disturbance to my logical thinking. &amp;ldquo;Why are you not just leave the sidebar open?&amp;rdquo;, you might be asking. I want to keep the screen real estate wide.&lt;/p&gt;
&lt;p&gt;Back then, I often toggle the sidebar because two reasons. First, the project I was working on uses &lt;strong&gt;Redux&lt;/strong&gt;-&lt;strong&gt;Saga&lt;/strong&gt;. Second, I used to use &lt;strong&gt;VSCode&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Redux-Saga is a great states and IO management for React, I was blown away when I was first using it. Sadly, cannot grok the Redux paradigm easily. I often need to see the file structure when I write new files or refactoring. My current project uses Apollo GraphQL and Domain Driven Development paradigm. I am comfortable using the current setup.&lt;/p&gt;
&lt;p&gt;In VSCode, manipulating file must be done with mouse. Using the built in &lt;strong&gt;Git&lt;/strong&gt; also done in the sidebar, with mouse. Nowadays I use &lt;strong&gt;NeoVim&lt;/strong&gt;. File management can be done easily with text command. If a more complex file management must be done, which is rare, I use &lt;strong&gt;NerdTree&lt;/strong&gt;. Versioning with Git is done with the help of &lt;strong&gt;vim-fugitive&lt;/strong&gt; which I found less disturbing.&lt;/p&gt;
&lt;p&gt;As a closing: if you often toggle the sidebar, try positioning it to the right. That is, if your editor supports that configuration. It might help reduce the distraction when you need it the most.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Migrating My Blog to Hugo</title>
      <link>https://ybbond.id/posts/2020-04-migrating-my-blog-to-hugo/</link>
      <pubDate>Wed, 15 Apr 2020 01:59:34 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-04-migrating-my-blog-to-hugo/</guid>
      <description>&lt;p&gt;In the start of 2020, I planned to expand my &lt;a href=&#34;https://old.ybbond.id/&#34;&gt;personal page&lt;/a&gt; to not only contain my &amp;ldquo;CV&amp;rdquo;, but also use it as my blog. That webpage is created with ReactJS, and my original idea was to make a new page that fetch data from GitHub Gist, then parse the Markdown file to HTML file&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. I also planned (and I will not drop this one, for the sake of learning) to make that webpage server rendered.&lt;/p&gt;
&lt;p&gt;After 20% progress of making Markdown to HTML parser, I got tired. Instead of reinventing the wheel, I thought that my time can be used to write my blog. So I researched for a static site generator. My primary writing tool, iA Writer boasts that it supports &lt;strong&gt;Ghost&lt;/strong&gt;, &lt;strong&gt;Wordpress&lt;/strong&gt; and &lt;strong&gt;Medium&lt;/strong&gt;. I omitted Medium because I want to self-host the site. I omitted Wordpress too, because I am not too good at PHP Language. Then I try searching for Ghost, turns out it&amp;rsquo;s a paid service.&lt;/p&gt;
&lt;p&gt;Other options I found was &lt;strong&gt;Jekyll&lt;/strong&gt;, &lt;strong&gt;Hugo&lt;/strong&gt;, &lt;strong&gt;nanoc&lt;/strong&gt; and &lt;strong&gt;Gatsby&lt;/strong&gt;. I tried Gatsby for work and side projects, and the two others just doesn&amp;rsquo;t fit my needs.&lt;/p&gt;
&lt;h2&gt;So I tried Hugo!&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;John Gruber, Creator of Markdown&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The main feature I like is that it parses &lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt; automatically. This allow me to make post with iA Writer, my currently favorite writing tool for iPad. It supports the flavor of Markdown that parses footnotes! I &lt;strong&gt;love footnotes&lt;/strong&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;!&lt;/p&gt;
&lt;p&gt;It also generates &lt;a href=&#34;https://ybbond.id/index.xml&#34;&gt;RSS&lt;/a&gt; for each page.&lt;/p&gt;
&lt;p&gt;It has native support for tables:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;This&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;is&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;an&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;example&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;of&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;table&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;cool&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;isn&amp;rsquo;t&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;it?&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I can also insert code snippets! Yeay!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;Example HTML5 Document&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;Test&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Current Features&lt;/h2&gt;&lt;p&gt;The default features from hugo itself already awesome, but my goal for this site is very opinionated. There are some features that I&amp;rsquo;d like to be implemented:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; &lt;strong&gt;Basic&lt;/strong&gt; &lt;em&gt;text&lt;/em&gt; &lt;del&gt;formats&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; This unordered task list (ordered version is available too!). I omit the &lt;code&gt;disabled&lt;/code&gt; property on purpose, because of a bug.&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; &lt;code&gt;Code&lt;/code&gt;, block code and block quote&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Footnotes!&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Responsiveness&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Dark mode toggler (if JavaScript enabled on browser)&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Replace default image to lazyloaded image&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Simple script to view footnotes on hover&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34; /&gt; Anonymous tracker (I always wonder whether anybody read my blog or not 🧐)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I have implemented GoatCounter analytics. Read &lt;a href=&#34;https://ybbond.id/posts/2020-05-socmed-and-goatcounter/&#34;&gt;my post&lt;/a&gt; about it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I am genuinely happy for using Hugo. I might keep using this for a while, before I&amp;rsquo;ll have an itch to try other static site  generators 😄&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The more original idea was to create this with ReasonReact, as written in my other &lt;a href=&#34;https://ybbond.id/posts/2020-03-trying-bs-json-and-bs-fetch-to-publish-my-gist-as-blog/&#34;&gt;post&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Like the one you probably noticed already. This is one.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>NuPhy NuType F1 Keyboard Review</title>
      <link>https://ybbond.id/posts/2020-04-nuphy-nutype-f1-keyboard-review/</link>
      <pubDate>Sun, 05 Apr 2020 18:23:12 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-04-nuphy-nutype-f1-keyboard-review/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;br /&gt;
NuPhy released firmware release for this keyboard that can be downloaded in their website. &lt;a href=&#34;https://nuphy.com/pages/firmwares-for-nutype-f1&#34;&gt;Click here for the download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the new feature this update enables is option to assign the upper-left most key as grave accent and tilde (&lt;code&gt;`&lt;/code&gt; and &lt;code&gt;~&lt;/code&gt;).&lt;br /&gt;
That one solves one of my issues described below.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I backed a project in &lt;a href=&#34;https://www.kickstarter.com/projects/nuphy/nutype-revolutionizing-the-laptop-typing-experience&#34;&gt;Kickstarter&lt;/a&gt; in January 2020. The project planned to create Bluetooth Mechanical keyboard that can be placed on top of Macbook&amp;rsquo;s keyboard. I backed as an &lt;strong&gt;Early Bird&lt;/strong&gt; backer, it costs me $89 and &lt;em&gt;Jenius&lt;/em&gt; charged me Rp980263. The waiting was interesting and then became worrying when the Covid-19 outbreak happened. I received the keyboard in late March, the DHL guy delivered it to my house and my father sprayed the package with disinfectant immediately.&lt;/p&gt;
&lt;p&gt;I enjoyed and genuinely happy that I have my first bluetooth mechanical keyboard. If you read my &lt;a href=&#34;https://ybbond.id/posts/2020-03-in-search-of-good-writing-app-bear-vs-ulysses/&#34;&gt;previous&lt;/a&gt; blog &lt;a href=&#34;https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/&#34;&gt;posts&lt;/a&gt;, you&amp;rsquo;d know that I have utilized this keyboard to write blog posts and journal on my iPad.&lt;/p&gt;
&lt;h2&gt;Aesthetic and Build&lt;/h2&gt;&lt;p&gt;My first Mechanical Keyboard is Ducky One 2 Mini 60%, a gift from my colleagues when I resigned from that office. They know that I never use arrow button, and rarely use mouse. The Ducky is compact enough and bringing it in my commuting from and to office is not a burden. The NuType F1 is even more compact, considering it has physical arrow keys.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t tested bringing it with me anywhere as this is a &amp;ldquo;Stay At Home&amp;rdquo; era. Nevertheless, I often bring it with my iPad to any part of my house with no hassle.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-04-nuphy-nutype-f1-keyboard-review/nutype-under-ipad.jpg&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Using&amp;#32;it&amp;#32;with&amp;#32;iPad
    title=Using&amp;#32;it&amp;#32;with&amp;#32;iPad
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Using it with iPad&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Included with the package is the keyboard case, that magnetically sticks to its bottom and the flap folds to cover the entire large side of the keyboard. The foldable flaps can also be shaped as my iPad&amp;rsquo;s stand. I like the case very much, the material feels like &lt;em&gt;alcantara&lt;/em&gt; and it looks premium.&lt;/p&gt;
&lt;p&gt;The finish of the keyboard is not as good as the case though. The black color feels plastic-y, and the orange color in the bottom does not satisfy my flavor.&lt;/p&gt;
&lt;p&gt;The build quality of the keyboard is good as if it can endure a small drop. It weights just right, and it has part of rubber to make it sticks to the glass table of my house&amp;rsquo;s pantry.&lt;/p&gt;
&lt;p&gt;The keyboard provides more than 5 RGB backlight variations. I am to lazy to count the exact number. My favorite is the ripple effect. I always choose ripple effect for all my keyboard that supports backlighting.&lt;/p&gt;
&lt;h2&gt;Functionality&lt;/h2&gt;&lt;p&gt;NuType F1 supports 3 separate bluetooth connections, I tested switching between MacBook, iPad and Phone with very little delay.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-04-nuphy-nutype-f1-keyboard-review/nutype-on-mac.jpg&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=Using&amp;#32;it&amp;#32;with&amp;#32;MacBook
    title=Using&amp;#32;it&amp;#32;with&amp;#32;MacBook
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;Using it with MacBook&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Speaking of delay, it is a bit hit and miss. Most of the time, and in most of the part of my house, the bluetooth connection is good and I don&amp;rsquo;t experience any typing delay. Sometimes, I experience a frustrating delay. I don&amp;rsquo;t know if it is when I open a heavy programming app and my laptop has difficulties keeping the bluetooth connection stable. The bluetooth connection also showing problems in one part of my house that the wall is made from steel. That so, I don&amp;rsquo;t know whether it is the device or the keyboard. I have no other bluetooth connected device to test, save for PS4 DualShock 4 controller and a Logitech bluetooth mouse with dongle.&lt;/p&gt;
&lt;h2&gt;White Switch&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;NuType F1&lt;/strong&gt; uses Kaihua Choc switches, and I ordered the white switch, because they claimed it is the most noisy. I like noisy keyboards, the people around me don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Typing on this keyboard is overall convenient. If I can compare, trying NuType F1 after Ducky One 2 Mini feels like trying MacBook&amp;rsquo;s butterfly keyboard after the scissor switch. The switches are short in travel, but it feels tactile. The key has flat surface, and sliding my fingers on top of them feels smooth.&lt;/p&gt;
&lt;p&gt;Unfortunately this keyboard only use one switch for its space bar. Sometimes I fail to press the &lt;code&gt;Space&lt;/code&gt; key if I press it at the left or right edge.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;br /&gt;
As stated above, new firmware update fixes the issue I wrote below.&lt;br /&gt;
You can &lt;a href=&#34;https://nuphy.com/pages/firmwares-for-nutype-f1&#34;&gt;download the binary on their site&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I also complains about the upper-left most key, that is the &lt;code&gt;Esc&lt;/code&gt; key. The &lt;strong&gt;NuPhy&lt;/strong&gt; team made the decision to make the escape as the main key, and you need to press &lt;code&gt;Fn&lt;/code&gt; with &lt;code&gt;Esc&lt;/code&gt; to trigger back tick, or &lt;code&gt;Fn&lt;/code&gt; with &lt;code&gt;Shift&lt;/code&gt; and &lt;code&gt;Esc&lt;/code&gt; to trigger tilde &lt;code&gt;~&lt;/code&gt;. I hardly press escape key. As a JavaScript developer, I press back tick more often for &lt;code&gt;string literal&lt;/code&gt;. I also need back tick to make &lt;code&gt;code&lt;/code&gt; text formatting when I write MarkDown or in Slack.&lt;/p&gt;
&lt;h2&gt;Overall&lt;/h2&gt;&lt;p&gt;This keyboard helped me boost my productivity in two areas. I am able to write on iPad. I can also also type faster on MacBook Pro, which butterfly keys had shown its infamous issue since 3 months ago. I can say that this &lt;em&gt;kickstarter&lt;/em&gt; keyboard helps to &lt;em&gt;kickstart&lt;/em&gt; my productivity. See what I did there? Kickstart?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>In Search of Good Writing App - Part 2, iA Writer vs iVim</title>
      <link>https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/</link>
      <pubDate>Wed, 01 Apr 2020 18:22:31 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Orang emang gak pernah puas!” - Indonesian colloquial sayings&lt;/p&gt;
&lt;p&gt;“People are never satisfied” - Paulo Coelho’s almost literal translation&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Part 2 of my previous post: &lt;a href=&#34;https://ybbond.id/posts/2020-03-in-search-of-good-writing-app-bear-vs-ulysses/&#34;&gt;In Search of Good Writing App - Bear vs Ulysses&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In the previous post, I compared &lt;a href=&#34;https://ulysses.app/&#34;&gt;Ulysses&lt;/a&gt; and &lt;a href=&#34;https://bear.app&#34;&gt;Bear&lt;/a&gt;. I ended up subscribing to Bear. Bear itself is a good writing app, with nice clean interface design, great synchronization between MacOS and iOS (or iPadOS) platform, and &lt;em&gt;just right&lt;/em&gt; MarkDown implementation.&lt;/p&gt;
&lt;p&gt;I feel satisfied with my three days of Bear usage. The subscription model does not bother me, but I found several aspect to reconsider:&lt;/p&gt;
&lt;h3&gt;Backup&lt;/h3&gt;&lt;p&gt;One thing I like from Ulysses is file versioning similar to MacOS&amp;rsquo;s &lt;em&gt;Time Machine&lt;/em&gt;. Bear lacks that feature, changes I made will replace the previous version of the file in iCloud. The only way to access file history in Bear is through undo. Yep, plain old undo.&lt;/p&gt;
&lt;h3&gt;File Storage&lt;/h3&gt;&lt;p&gt;Bear stores my notes in its own enclosed library. I have no option to store my notes in external folder. This issue makes me think about the continuity of this subscription. Other writer also stated &lt;a href=&#34;https://joseperez.fm/2019/goodbye-bear-hello-ia-writer/&#34;&gt;this issue&lt;/a&gt;, and his post gave me the idea to check &lt;strong&gt;iA Writer&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Modal Editing&lt;/h3&gt;&lt;p&gt;I came from modal editing world. The lack of &lt;strong&gt;Vim&lt;/strong&gt; keybinding annoys me. This aspect is of my very own opinion.&lt;/p&gt;
&lt;p&gt;Thus came other candidates&lt;/p&gt;
&lt;h2&gt;iA Writer&lt;/h2&gt;&lt;p&gt;I installed the trial version on Mac. The main takeaway is iA Writer gives the writer full control of its edited file. It uses iCloud to sync between devices. Mac version also has file versioning similar to &lt;em&gt;Time Machine&lt;/em&gt;. iA Writer also supports opening external folder, enabling me to edit markdown file from my GitHub Gist.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/ia-writer-headline.png&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=I&amp;#32;tried&amp;#32;iA&amp;#32;Writer&amp;#32;trial&amp;#32;on&amp;#32;Mac,&amp;#32;with&amp;#32;its&amp;#32;syntax&amp;#32;highlighting&amp;#32;on
    title=I&amp;#32;tried&amp;#32;iA&amp;#32;Writer&amp;#32;trial&amp;#32;on&amp;#32;Mac,&amp;#32;with&amp;#32;its&amp;#32;syntax&amp;#32;highlighting&amp;#32;on
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;I tried iA Writer trial on Mac, with its syntax highlighting on&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The app supports &lt;em&gt;focus mode&lt;/em&gt;, which consists of &lt;em&gt;typewriter mode&lt;/em&gt; similar to Ulysses&amp;rsquo; and &lt;a href=&#34;https://ia.net/topics/ia5_writer_features/syntax-highlight&#34;&gt;syntax highlighting&lt;/a&gt; that unique to iA Writer. The latter feature sounds unnecessary to me, because I thought highlighting non-code text will distracts me more than it helps me. I tried writing with &lt;em&gt;syntax highlighting&lt;/em&gt; on, and I realized it helps choosing good words and/or &amp;lsquo;refactoring&amp;rsquo; the written text. The app&amp;rsquo;s website has good &lt;a href=&#34;https://ia.net/writer/support/writing-tips/parts-of-speech&#34;&gt;blog posts&lt;/a&gt; that give tips to write well.&lt;/p&gt;
&lt;p&gt;iA Writer also has side-by-side preview feature. Plus point is this app has good shortcut to access its main features.&lt;/p&gt;
&lt;p&gt;I consider this app pricey. It uses single payment approach, the Mac version costs Rp450000 while the iOS (iPadOS included) version costs Rp120000. I use the iA Writer trial on Mac for a while, kinda like it, but it reminds me to one &amp;lsquo;writing app&amp;rsquo; that I consider home.&lt;/p&gt;
&lt;p&gt;That is Goyo plugin on Vim. Then I searched for Vim in iPadOS. I found it.&lt;/p&gt;
&lt;h2&gt;iVim&lt;/h2&gt;&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/ivim.jpg&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=iVim&amp;#32;with&amp;#32;Goyo&amp;#32;plugin&amp;#32;on
    title=iVim&amp;#32;with&amp;#32;Goyo&amp;#32;plugin&amp;#32;on
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;iVim with Goyo plugin on&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I thought Vim app in iOS will be limiting and can only edit the files in the app&amp;rsquo;s bundle file. I found iVim can edit file from other source. It also supports vimrc and plugins too! &lt;a href=&#34;https://www.reddit.com/r/vim/comments/9ki5g8/ivim_ios_howtos/&#34;&gt;This posts&lt;/a&gt; helps me a lot.&lt;/p&gt;
&lt;p&gt;I configured my iVim as a &lt;em&gt;Zen Writing Tool&lt;/em&gt;. I installed &lt;code&gt;Goyo&lt;/code&gt;, &lt;code&gt;vim-markdown&lt;/code&gt;, and Tim Pope&amp;rsquo;s essential shortcut plugins that have been accompanying my typing journey for 2 years. The result is satisfying:&lt;/p&gt;
&lt;p&gt;I use all of Bear, iA Writer (on Mac) and iVim for a while, eliminated Bear because of its low I mentioned above, and feel that the lack of preview makes iVim lacky. I read from reddit and other &amp;ldquo;this app vs. that app&amp;rdquo; posts that iA Writer for iOS is a worth buy. I decided to try purchasing iA Writer for iOS.&lt;/p&gt;
&lt;p&gt;The iOS version of iA Writer has all the great features of its Mac version. It has some quirks though. It  doesn&amp;rsquo;t have built in support to bookmark or scrape website contents (Bear has it), the keyboard shortcut for iPadOS lacks feature to focus on editor. The solution for the first problem is to use Apple&amp;rsquo;s Shortcut. For the second problem, I have to tap the iPad screen each time I opened the menu, inconvenient for keyboard person like me.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;&lt;figure&gt;
  &lt;center&gt;
  &lt;img
    src=&#34;https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/ia-writer-portrait.jpg&#34;
    style=&#34;max-width: 100%; height: auto;&#34;
    alt=iA&amp;#32;writer&amp;#32;for&amp;#32;iPadOS,&amp;#32;portrait&amp;#32;mode
    title=iA&amp;#32;writer&amp;#32;for&amp;#32;iPadOS,&amp;#32;portrait&amp;#32;mode
  /&gt;
  &lt;figcaption&gt;
    &lt;em&gt;iA writer for iPadOS, portrait mode&lt;/em&gt;
  &lt;/figcaption&gt;
  &lt;/center&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;In the end, I prefer iA Writer to iVim and Bear. I like the preview mode, I like the syntax highlighting, I like when I succeed scripting the shortcut to bookmark or scrape website.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t like the lack of good keyboard shortcut and no modal editing, but the good side overcome the bad side easily.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on March, 2020</title>
      <link>https://ybbond.id/posts/2020-03-interesting-links/</link>
      <pubDate>Tue, 31 Mar 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-03-interesting-links/</guid>
      <description>&lt;h2&gt;Tech&lt;/h2&gt;&lt;p&gt;📓 &lt;a href=&#34;https://atypeofprogramming.com/&#34;&gt;A Type of Programming WIP Book about Haskell&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🤪 &lt;a href=&#34;http://vimdoc.sourceforge.net/htmldoc/autocmd.html#UserGettingBored&#34;&gt;Vim Doc’s Joke - UserGettingBored&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🆅 &lt;a href=&#34;https://www.reddit.com/r/vim/comments/9ki5g8/ivim_ios_howtos/&#34;&gt;iVim setup&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Knowledge&lt;/h2&gt;&lt;p&gt;🗣 &lt;a href=&#34;https://ia.net/writer/support/writing-tips/parts-of-speech&#34;&gt;Using Parts of Speech to Improve Your Writing Style - William Strunk Jr.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🧠 &lt;a href=&#34;https://dev.to/desi/book-review-don-t-make-me-think-329k&#34;&gt;Book Review: Don&amp;rsquo;t Make Me Think! - Desi&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>In Search of Good Writing App - Bear vs Ulysses</title>
      <link>https://ybbond.id/posts/2020-03-in-search-of-good-writing-app-bear-vs-ulysses/</link>
      <pubDate>Fri, 27 Mar 2020 21:01:33 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-03-in-search-of-good-writing-app-bear-vs-ulysses/</guid>
      <description>&lt;p&gt;The fourth day after I started my subscription with the result of this article, I found the best Writing App and I stick with it. You can read it here &lt;a href=&#34;https://ybbond.id/posts/2020-04-in-search-of-good-writing-app-part-2-ia-writer-vs-ivim/&#34;&gt;In Search of Good Writing App - Part 2, iVim&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I just got my new NuType F1 keyboard that I have waited for 4 months from &lt;a href=&#34;https://www.kickstarter.com/projects/nuphy/nutype-revolutionizing-the-laptop-typing-experience&#34;&gt;Kickstarter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was quite surprised when the man from DHL courier service called me. I got the delivery tracking code 3 days before, and didn’t expect the keyboard got delivered from Hong Kong to Jakarta, Indonesia in that short time.&lt;/p&gt;
&lt;p&gt;After I tried the keyboard on My Office’s MacBook Pro (MBP), and tried connecting it to my iPad mini, I feel the need of a good &lt;em&gt;writing app&lt;/em&gt; that syncs between my Apple Devices (screw you Bandung, you despised Apple before you got your first Mac!). Previously, I thought my trusty programming text editor — &lt;strong&gt;NeoVim&lt;/strong&gt; in &lt;strong&gt;Kitty&lt;/strong&gt;, will suffice the need. I can just make a folder in my iCloud folder that contains all my markdown note files. I also thought that I will not tolerate the lack of modal editing in regular writing app.&lt;/p&gt;
&lt;p&gt;With each part NeoVim excels at, it falls short in other. I cannot sync my work easily with it. Even if I can store the blog post files in iCloud directory in the MBP, I must find a good writing app for the iPad.&lt;/p&gt;
&lt;p&gt;My eyes locked between two options: &lt;strong&gt;Bear&lt;/strong&gt; and &lt;strong&gt;Ulysses&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Bear&lt;/h2&gt;&lt;p&gt;I personally find Bear to be a semi WYSIWYG Markdown editor. Bear use real life MarkDown syntax that can be directly copy-pasted to GitHub Gist as my blogging CMS.&lt;/p&gt;
&lt;p&gt;Bear uses tags to manage Notes, where each tags represent container, and tags can be nested to represent containers inside container. If that sounds messy for you, try to remember how the tags in website works, and how the nested tags are like the breadcrumbs of website navigation. I will use the writing app for my blog, so the management system of Bear satisfy me enough.&lt;/p&gt;
&lt;p&gt;Bear on iPad has a good website &lt;em&gt;scraping&lt;/em&gt; &amp;amp; &lt;em&gt;bookmarking&lt;/em&gt; system. The Bear share plugin on Safari can append/prepend the link to a dedicated Note, or create new Note with the web’s content scraped.&lt;/p&gt;
&lt;p&gt;Bear on iPad doesn’t have search feature inside the Note editor, even though it has system-wide search. Weird.&lt;/p&gt;
&lt;h2&gt;Ulysses&lt;/h2&gt;&lt;p&gt;The main catch point that I like from Ulysses is that it shows the heading marks (the &lt;em&gt;number sign&lt;/em&gt; “#”) in the left, as how I want my website layout to look like. Unlike Bear, this app won’t enlarge the Headings section, but as I told you, it change the Headings’ color and added marks.&lt;/p&gt;
&lt;p&gt;Ulysses also have a great system wide search, it allows you to search words and can be narrowed by keywords (Ulysses’s version of Bear’s tags), even by Markdown formatting! Ulysses provides MacOS’s Spotlight like search.&lt;/p&gt;
&lt;p&gt;Ulysses on Mac has focus mode that includes &lt;em&gt;typewriter mode&lt;/em&gt;. The mode makes the position of cursor location fixed, as if you are typing with a typewriter. It also has&lt;/p&gt;
&lt;h2&gt;Theming&lt;/h2&gt;&lt;p&gt;Both of them has great theming, Ulysses allows you to modify each markup color individually. Bear on Mac has ‘focus mode’ on by default if you omit all the sidebar, while Ulysses allow you to hide the top toolbar to have ‘focus mode’.&lt;/p&gt;
&lt;p&gt;Ulysses has line number (or paragraph number, to be exact) to the right of texts, maybe that can be your consideration point. Not for me, though.&lt;/p&gt;
&lt;h2&gt;Price&lt;/h2&gt;&lt;p&gt;Ulysses’s subscription fee is more expensive than Bear, at &lt;strong&gt;Rp459000/year&lt;/strong&gt; compared to &lt;strong&gt;Rp199000/year&lt;/strong&gt;. That’s one consideration point.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;I am writing this section on Ulysses, but I know that I will stick to Bear. Personally, I find Bear’s interface to be cleaner and more pleasant to type on. I will always liked Ulysses’s displaying marks to the left of Headings, but that slightly major point can be ignored. &lt;em&gt;sigh&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Trying bs-json and bs-fetch to Publish My Gist as Blog</title>
      <link>https://ybbond.id/posts/2020-03-trying-bs-json-and-bs-fetch-to-publish-my-gist-as-blog/</link>
      <pubDate>Tue, 03 Mar 2020 01:47:12 +0000</pubDate>
      
      <guid>https://ybbond.id/posts/2020-03-trying-bs-json-and-bs-fetch-to-publish-my-gist-as-blog/</guid>
      <description>&lt;p&gt;&lt;strong&gt;disclaimer: this is not a tutorial&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I read an interesting article (from a website that features a great function to see its articles&amp;rsquo; revisions) about using GitHub Gist as a Blogging CMS. Here is &lt;a href=&#34;https://bit.ly/2UForoW&#34;&gt;the post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Back then, my website was written in ReasonReact, and back then, I thought that implementing my own blog by fetching my Gist is a nice way to learn &lt;code&gt;bs-fetch&lt;/code&gt; and &lt;code&gt;bs-json&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tldr; the result can be seen here &lt;a href=&#34;https://reason.ybbond.id/blog&#34;&gt;reason.ybbond.id/blog&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2&gt;Fun Moment&lt;/h2&gt;&lt;p&gt;Implementing &lt;code&gt;bs-fetch&lt;/code&gt; was the easier of both, because I follow the example of HackerNews built with ReasonReact.&lt;/p&gt;
&lt;p&gt;Implementing &lt;code&gt;bs-json&lt;/code&gt; was the one that had me stuck for more than 3 months, and made me laugh at myself because the culprit was just an &lt;strong&gt;underscore&lt;/strong&gt; that I used to prevent using ReasonML&amp;rsquo;s reserved keyword.&lt;/p&gt;
&lt;p&gt;So, here the story goes&amp;hellip;&lt;/p&gt;
&lt;p&gt;When I first writing the code for parsing the return JSON value to valid ReasonML record, I was in a bit of a hurry. I wrote the kickstarting code in a cafe while my friend is ordering something. I encountered an error that I fixed easily. What a pity that I forgot what that error was. More of a pity is if I remember I encountered that error, I will not stuck for so long.&lt;/p&gt;
&lt;p&gt;GitHub Gist endpoint gives verbose information about the gists, one of them is the type of the file&amp;rsquo;s programming language. The return value store the file type as a value with object key &lt;code&gt;type&lt;/code&gt;. ReasonML doesn&amp;rsquo;t want its record key as string &lt;code&gt;type&lt;/code&gt;, because it is a reserved keyword. So I made the key as &lt;code&gt;type_&lt;/code&gt;. Error gone.&lt;/p&gt;
&lt;p&gt;Then I stopped writing code for that time, and I forget the progress that I&amp;rsquo;ve made.&lt;/p&gt;
&lt;p&gt;Not so long, I return to continue the progress. After coding for several LoCs and minutes, I feel happy because the fetch can be done successfully. The weird thing is the JSON cannot be parsed, and there is no error.&lt;/p&gt;
&lt;p&gt;I try to log the parsed value part-by-part, try to reread the code up-and-down, but cannot find the culprit of the bug.&lt;/p&gt;
&lt;h2&gt;Solution!&lt;/h2&gt;&lt;p&gt;After 3 months or so, I tried to rewrite the code, side-by-side. The old code on the left, the new code on the right, and when I reached to the position of &lt;code&gt;type_&lt;/code&gt; key, I realized that I am a stupid.&lt;/p&gt;
&lt;p&gt;The record value expects &lt;code&gt;type_&lt;/code&gt; key, while I forgot to parse the Gist&amp;rsquo;s return value as &lt;code&gt;type_&lt;/code&gt;. 😿&lt;/p&gt;
&lt;p&gt;Okay, I got bored writing this. Straight to the &lt;strong&gt;conclusion&lt;/strong&gt; then!!&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Debugging code is hard.&lt;/p&gt;
&lt;p&gt;If you cannot find the bug in the first hour, try to have a rest for 15 minutes, make coffee! It&amp;rsquo;s called &lt;em&gt;pomodoro&lt;/em&gt;. It supposed to refresh your mind and allow you to find the bug.&lt;/p&gt;
&lt;p&gt;If it doesn&amp;rsquo;t work, try to rewrite the code. Side-by-side.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s like rereading the code, but with thrice the concentration because you have to read carefully to retype it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I am currently not too good at blogging. Small chance is that in the future, I will edit this article, and maybe you will submit this certain article to HackerNews.&lt;/p&gt;
&lt;p&gt;For now, please enjoy my writings :D&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Links I Found on February, 2020</title>
      <link>https://ybbond.id/posts/2020-02-interesting-links/</link>
      <pubDate>Sat, 29 Feb 2020 23:59:59 +0700</pubDate>
      
      <guid>https://ybbond.id/posts/2020-02-interesting-links/</guid>
      <description>&lt;h2&gt;Tech&lt;/h2&gt;&lt;p&gt;🗣 &lt;a href=&#34;https://dev.to/davidkpiano/no-disabling-a-button-is-not-app-logic-598i&#34;&gt;No, disabling a button is not app logic. - David K. 🎹&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Knowledge&lt;/h2&gt;&lt;p&gt;👃 &lt;a href=&#34;https://www.newyorker.com/science/elements/from-bats-to-human-lungs-the-evolution-of-a-coronavirus&#34;&gt;From Bats to Human Lungs, the Evolution of a Coronavirus - Carolyn Kormann&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
