<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Rowanto Luo</title><link>https://log.rowanto.com/posts/</link><description>Recent content in Posts on Rowanto Luo</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 03 Sep 2026 09:59:54 +0200</lastBuildDate><atom:link href="https://log.rowanto.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Git Fundamentals</title><link>https://log.rowanto.com/posts/git-fundamentals/</link><pubDate>Thu, 03 Sep 2026 09:59:54 +0200</pubDate><guid>https://log.rowanto.com/posts/git-fundamentals/</guid><description>
&lt;p&gt;It is not uncommon to meet fellow developers who are able to use git, we are ones ourselves. Most of us are able to commit, push, resolve conflicts, etc. However, how many would be still comfortable to use it when things deviate from a normal workflow? E.g., hotfix, recover deleted branch, fixing our local branch if the remote is squashed, detached HEAD, etc.&lt;/p&gt;
&lt;p&gt;These are all symptoms of learning git usage through surface level commands without understanding git itself. I was in the same boat, and many developers I spoke to share the same experience, especially the new ones. Hopefully, this article will give us an improved understanding about git to be able to leverage it more.&lt;/p&gt;</description></item><item><title>KDE in wsl2</title><link>https://log.rowanto.com/posts/kde-in-wsl2/</link><pubDate>Sun, 13 Jun 2021 22:32:38 +0200</pubDate><guid>https://log.rowanto.com/posts/kde-in-wsl2/</guid><description>
&lt;p&gt;Cheers 🍻 to those who owns a surface pro x and tries to do some development work on it.&lt;/p&gt;
&lt;p&gt;By now, most is probably regretting why they didn&amp;rsquo;t buy a normal non-ARM surface pro or just an M1. Although wsl2 is very nice, it is not really mature enough. It has some nasty bugs such as &lt;a href="https://github.com/microsoft/WSL/issues/4946"&gt;slow network&lt;/a&gt; and &lt;a href="https://github.com/microsoft/WSL/issues/4197"&gt;slow filesystem&lt;/a&gt;, which leads to a big pain when development code is running on WSL while being accessed from a browser or IDE in windows. This pain explodes further by the fact that almost no IDE except VS Code runs on the windows ARM platform.&lt;/p&gt;</description></item><item><title>JavaScript, filling an array with empty array.</title><link>https://log.rowanto.com/posts/javascript-filling-an-array-with-empty-array/</link><pubDate>Thu, 09 Feb 2017 19:39:51 +0000</pubDate><guid>https://log.rowanto.com/posts/javascript-filling-an-array-with-empty-array/</guid><description>
&lt;p&gt;I love JavaScript, however very often, it doesn&amp;rsquo;t love me back.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;const dataBuffers = new Array(4);
dataBuffers.fill([]);
for (let i = 0; i &amp;lt; 4; i += 1) {
dataBuffers[i].push(7);
}
console.log(JSON.stringify(dataBuffers));
// guess what is the answer?
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you guess the answer would be &lt;code&gt;[[7],[7],[7],[7]]&lt;/code&gt;, then think again.&lt;/p&gt;
&lt;p&gt;The problem is that &lt;code&gt;dataBuffers.fill([])&lt;/code&gt; will create you a single array, and fills the dataBuffers with the reference of the array. It is actually pretty clear if you have done JavaScript or any language long enough, but one might be stuck with the impression that the dataBuffers is filled with an empty array. In actuality, they all reference to the single same array, which means, the result of the above is.&lt;/p&gt;</description></item><item><title>Adding New Currency in Java 8</title><link>https://log.rowanto.com/posts/adding-new-currency-in-java-8/</link><pubDate>Thu, 17 Nov 2016 01:50:48 +0000</pubDate><guid>https://log.rowanto.com/posts/adding-new-currency-in-java-8/</guid><description>
&lt;p&gt;If you are using the &lt;code&gt;java.lang.Currency&lt;/code&gt; as part of your entity, most likely you are already regretting it now. Most of the time, a currency is a three letter word, and we don&amp;rsquo;t need the logic to be bundled in there. Keeping things simple and mapping these currencies as a String or own custom class is the way to go.&lt;/p&gt;
&lt;p&gt;For people who did use &lt;code&gt;java.lang.Currency&lt;/code&gt;, the pain will arrive when a country changed its currency or added a new one. As example, Belarus changed its currency from BYR to BYN at July 1st, 2016. If you are using &lt;code&gt;java.lang.Currency&lt;/code&gt;, you prolly already know by now that &lt;code&gt;Currency.getInstance(&amp;quot;BYN&amp;quot;)&lt;/code&gt; will throw you an exception. Most likely you have also google around, and most likely again, you will stumble upon &lt;a href="http://stackoverflow.com/questions/9982537/how-do-i-add-the-new-currency-code-to-java"&gt;this&lt;/a&gt; or &lt;a href="http://docs.oracle.com/javase/7/docs/technotes/guides/intl/enhancements.7.html#currency"&gt;this&lt;/a&gt;. It&amp;rsquo;s basically telling you that there is this new feature in java 7, which lets you overwrite the currency. You will happily overwrite BYR to BYN, and now it starts working. This happyness doesn&amp;rsquo;t last long as you realize that now that you support BYN, but not BYR anymore. You might also stumble upon some pages which write that we can&amp;rsquo;t support both currency at the same time.&lt;/p&gt;</description></item><item><title>To Lead, and to Serve</title><link>https://log.rowanto.com/posts/to-lead-and-to-serve/</link><pubDate>Wed, 29 Jun 2016 23:30:57 +0000</pubDate><guid>https://log.rowanto.com/posts/to-lead-and-to-serve/</guid><description>
&lt;p&gt;Around last week, I was listening to &lt;a href="https://en.wikipedia.org/wiki/Stephen_Tong"&gt;Rev. Stephen Tong&lt;/a&gt;&amp;rsquo;s Masterclass (basically like a Seminar). He said something which really struck me deeply. It&amp;rsquo;s something along this line:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Woe to you who wants to become a leader because you want people to serve you! Woe to you if you want to be a leader because you think you will have many people helping you!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A leader is the one who serves all his people! He should be the one who works the hardest! The one with the heaviest responsibility!&lt;/p&gt;</description></item><item><title>Event Driven Architecture</title><link>https://log.rowanto.com/posts/event-driven-architecture/</link><pubDate>Thu, 09 Jun 2016 23:35:11 +0000</pubDate><guid>https://log.rowanto.com/posts/event-driven-architecture/</guid><description>
&lt;h2 id="why-do-we-need-it"&gt;
Why do we need it?
&lt;a href="#why-do-we-need-it" class="h-anchor" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In the early stages of the development, event driven architecture is not needed since everything is still small and could still be contained in one place. Unfortunately, as the system grows bigger and bigger, putting everything in one place is not a very good way to scale (a.k.a monolith). The logic of the whole system will also keep increasing in complexity, and eventually there will arise the need to separate the giant system into domains.&lt;/p&gt;</description></item><item><title>Spring Boot Actuator + Dropwizard + Cloudwatch</title><link>https://log.rowanto.com/posts/spring-boot-actuator-dropwizard-cloudwatch/</link><pubDate>Sun, 10 Jan 2016 23:29:48 +0000</pubDate><guid>https://log.rowanto.com/posts/spring-boot-actuator-dropwizard-cloudwatch/</guid><description>
&lt;p&gt;Exporting spring boot metrics to cloudwatch may not be that straightforward. Since I&amp;rsquo;ve done that for my project, I will show how we can do it easily with the help of a couple of libraries.&lt;/p&gt;
&lt;p&gt;First, spring boot is using its own metrics mechanism. The first step to do that is to swap it with dropwizard&amp;rsquo;s metrics library which is more powerful and has more feature. Thankfully, the actuator has complete support for the library from what it&amp;rsquo;s written in the &lt;a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-metrics.html#production-ready-dropwizard-metrics"&gt;documentation&lt;/a&gt;. Spring will just swap its interface to use the implementation which wraps the dropwizard metrics.&lt;/p&gt;</description></item><item><title>Docker and (Console) Logs Problem</title><link>https://log.rowanto.com/posts/docker-console-logs-problem/</link><pubDate>Fri, 30 Oct 2015 00:05:16 +0000</pubDate><guid>https://log.rowanto.com/posts/docker-console-logs-problem/</guid><description>
&lt;p&gt;Anyone who used docker before and care about quality will have to deal with the logs problem. As we all know, docker runs in a container, and if we don&amp;rsquo;t handle the logs in a special way, the logs will be lost when the container is restarted.&lt;/p&gt;
&lt;p&gt;In order to deal with this, usually we will map the logs folder of our application to the parent host of the container, so that the logs don&amp;rsquo;t get lost when the container is restarted or changed.&lt;/p&gt;</description></item><item><title>Broken Docker in Debian Jessie</title><link>https://log.rowanto.com/posts/broken-docker-in-debian-jessie/</link><pubDate>Tue, 01 Sep 2015 21:19:41 +0000</pubDate><guid>https://log.rowanto.com/posts/broken-docker-in-debian-jessie/</guid><description>
&lt;p&gt;So after a few dist-upgrades, docker is not running anymore in my debian Jessie. A quick run of sudo service docker status shows me:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2015-09-02 00:03:18 CEST; 8min ago
Docs: https://docs.docker.com
Process: 22770 ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS (code=exited, status=1/FAILURE)
Main PID: 22770 (code=exited, status=1/FAILURE)
Sep 02 00:03:18 rowanto-mdeb systemd[1]: Started Docker Application Container Engine.
Sep 02 00:03:18 rowanto-mdeb docker[22770]: time=&amp;quot;2015-09-02T00:03:18.434820725+02:00&amp;quot; level=error msg=&amp;quot;[graphdriver] prior storage driver \&amp;quot;aufs\&amp;quot; failed: driver not supported&amp;quot;
Sep 02 00:03:18 rowanto-mdeb docker[22770]: time=&amp;quot;2015-09-02T00:03:18.434912173+02:00&amp;quot; level=fatal msg=&amp;quot;Error starting daemon: error initializing graphdriver: driver not supported&amp;quot;
Sep 02 00:03:18 rowanto-mdeb systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Sep 02 00:03:18 rowanto-mdeb systemd[1]: docker.service: Unit entered failed state.
Sep 02 00:03:18 rowanto-mdeb systemd[1]: docker.service: Failed with result 'exit-code'.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ops, problem with aufs. A quick fix would be to delete it. You might lose some data, so please do it with care.&lt;/p&gt;</description></item><item><title>KDE is fully broken in Debian Jessie/Testing</title><link>https://log.rowanto.com/posts/kde-is-fully-broken-in-debian-jessietesting/</link><pubDate>Fri, 31 Jul 2015 20:05:09 +0000</pubDate><guid>https://log.rowanto.com/posts/kde-is-fully-broken-in-debian-jessietesting/</guid><description>
&lt;p&gt;I use Debian Jessie, and I am the type who do this command frequently:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get dist-upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now I am suffering from the consequences. The desktop is completely broken. I googled around, and there was nothing. So I thought something in my laptop is broken at first.&lt;/p&gt;
&lt;p&gt;Well, if you are a long enough linux user, this kind of stuff is kind of normal. It always happens once in a blue moon. It happened once when I was upgrading Fedora. It happened once when Debian removed ati driver. This stuff is normal, it&amp;rsquo;s also Debian Testing anyway. One just need to keep calm and fix the problem.&lt;/p&gt;</description></item><item><title>Why Datanode is Denied Communication With Namenode</title><link>https://log.rowanto.com/posts/why-datanode-is-denied-communication-with-namenode/</link><pubDate>Thu, 07 May 2015 17:55:50 +0000</pubDate><guid>https://log.rowanto.com/posts/why-datanode-is-denied-communication-with-namenode/</guid><description>
&lt;p&gt;So for those trying to setup HDFS out there, and are struggling with this kind of error where it said datanode denied communication with namenode:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2015-05-07 08:04:19,694 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool BP-1184863888-172.17.0.3-1430984962919 (Datanode Uuid null) service to dockernamenode.zanox.com/172.17.0.3:8020 beginning handshake with NN
2015-05-07 08:04:19,697 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool BP-1184863888-172.17.0.3-1430984962919 (Datanode Uuid null) service to dockernamenode.zanox.com/172.17.0.3:8020 Datanode denied communication with namenode because hostname cannot be resolved (ip=172.17.0.5, hostname=172.17.0.5): DatanodeRegistration(0.0.0.0, datanodeUuid=f8c97ad9-3cb3-49a1-9e4e-bc2341779f19, infoPort=50075, ipcPort=50020, storageInfo=lv=-56;cid=CID-9ab30cb5-ada8-4201-9d94-6400e83af6e4;nsid=1471492370;c=0)
at org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager.registerDatanode(DatanodeManager.java:904)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.registerDatanode(FSNamesystem.java:5042)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.registerDatanode(NameNodeRpcServer.java:1069)
at org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolServerSideTranslatorPB.registerDatanode(DatanodeProtocolServerSideTranslatorPB.java:92)
at org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos$DatanodeProtocolService$2.callBlockingMethod(DatanodeProtocolProtos.java:27329)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1060)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2044)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2040)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2038)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It could actually be because of many configurations problem, but in the end it boils to one thing and that&amp;rsquo;s what I am going to tell you. It costed me one day just to fix this problem when I was running test-kitchen to provision hadoop servers.&lt;/p&gt;</description></item><item><title>The Difference between For-Each Loop and forEach()</title><link>https://log.rowanto.com/posts/the-difference-between-classic-foreach-and-java-8-functional-foreach-loop/</link><pubDate>Wed, 06 May 2015 17:06:16 +0000</pubDate><guid>https://log.rowanto.com/posts/the-difference-between-classic-foreach-and-java-8-functional-foreach-loop/</guid><description>
&lt;p&gt;People who have played enough with the brand new Java 8 will be familiar with the new &lt;a href="https://docs.oracle.com/javase/tutorial/collections/streams/"&gt;forEach(fn(x))&lt;/a&gt; loop in lambda. This syntax is quite popular among developers because it&amp;rsquo;s easier and prettier to use than the normal &lt;a href="https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html"&gt;For-Each&lt;/a&gt; loop. It is also popular in other languages, especially JavaScript.&lt;/p&gt;
&lt;p&gt;The problem is, I&amp;rsquo;ve seen a very specific bug, which is related to this &amp;ldquo;functional&amp;rdquo; forEach() loop, quite a few times, again and again. People tend to think that these two kinds of loop are 100% identical, which is not. Although Java 8&amp;rsquo;s type-safety make it harder for people to make this mistake because of its compilation error, it&amp;rsquo;s still not 100% safe.&lt;/p&gt;</description></item><item><title>Java 8 - Turning off SSL Certificate Check</title><link>https://log.rowanto.com/posts/java-8-turning-off-ssl-certificate-check/</link><pubDate>Sat, 21 Mar 2015 09:11:56 +0000</pubDate><guid>https://log.rowanto.com/posts/java-8-turning-off-ssl-certificate-check/</guid><description>
&lt;p&gt;There&amp;rsquo;s usually no good reason to turn off SSL certificate check. So this is actually wrong in many ways, but maybe we&amp;rsquo;re still developing in an isolated dev environment and somehow the dev machine of another application you&amp;rsquo;re depending on only allows SSL connection even though it doesn&amp;rsquo;t have a valid certificate. The correct solution is actually to self sign a certificate or add it in the system, so that if your application go live, you will still have ssl certificate check turned on. If not, you might forgot to turn the ssl certificate check back on when launching the stuff and it will be bad. So, use this on your own risk.&lt;/p&gt;</description></item><item><title>AWS Eb CLI (v3): How to fix ssl_wrap_socket error in Debian Jessie</title><link>https://log.rowanto.com/posts/aws-eb-cli-v3-how-to-fix-ssl_wrap_socket-error-in-debian-jessie/</link><pubDate>Mon, 26 Jan 2015 20:11:28 +0000</pubDate><guid>https://log.rowanto.com/posts/aws-eb-cli-v3-how-to-fix-ssl_wrap_socket-error-in-debian-jessie/</guid><description>
&lt;p&gt;This is the first time I&amp;rsquo;m deploying stuff to elasticbeanstalk, and when I&amp;rsquo;m trying to deploy my private project, I realized the eb cli I download is the version 2 and has different syntax. I installed the version 3, and it seems like it can only be installed using python package manager pip. After installing it, this is what I get:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rowanto@Rowanto-Deb ~ $ eb
Traceback (most recent call last):
File &amp;quot;/usr/local/bin/eb&amp;quot;, line 9, in &amp;lt;module&amp;gt;
load_entry_point('awsebcli==3.0.10', 'console_scripts', 'eb')()
File &amp;quot;/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py&amp;quot;, line 519, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File &amp;quot;/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py&amp;quot;, line 2630, in load_entry_point
return ep.load()
File &amp;quot;/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py&amp;quot;, line 2310, in load
return self.resolve()
File &amp;quot;/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py&amp;quot;, line 2316, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/core/ebcore.py&amp;quot;, line 23, in &amp;lt;module&amp;gt;
from ..controllers.initialize import InitController
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/controllers/initialize.py&amp;quot;, line 16, in &amp;lt;module&amp;gt;
from ..core.abstractcontroller import AbstractBaseController
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/core/abstractcontroller.py&amp;quot;, line 21, in &amp;lt;module&amp;gt;
from ..core import io, fileoperations, operations
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/core/operations.py&amp;quot;, line 25, in &amp;lt;module&amp;gt;
from ..lib import elasticbeanstalk, s3, iam, aws, ec2, elb
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/lib/elasticbeanstalk.py&amp;quot;, line 25, in &amp;lt;module&amp;gt;
from ..lib import aws
File &amp;quot;/usr/local/lib/python2.7/dist-packages/ebcli/lib/aws.py&amp;quot;, line 17, in &amp;lt;module&amp;gt;
import botocore_eb.session
File &amp;quot;/usr/local/lib/python2.7/dist-packages/botocore_eb/session.py&amp;quot;, line 27, in &amp;lt;module&amp;gt;
import botocore_eb.credentials
File &amp;quot;/usr/local/lib/python2.7/dist-packages/botocore_eb/credentials.py&amp;quot;, line 27, in &amp;lt;module&amp;gt;
from botocore_eb.utils import InstanceMetadataFetcher, parse_key_val_file
File &amp;quot;/usr/local/lib/python2.7/dist-packages/botocore_eb/utils.py&amp;quot;, line 22, in &amp;lt;module&amp;gt;
from botocore_eb.vendored import requests
File &amp;quot;/usr/local/lib/python2.7/dist-packages/botocore_eb/vendored/requests/__init__.py&amp;quot;, line 53, in &amp;lt;module&amp;gt;
from .packages.urllib3.contrib import pyopenssl
File &amp;quot;/usr/local/lib/python2.7/dist-packages/botocore_eb/vendored/requests/packages/urllib3/contrib/pyopenssl.py&amp;quot;, line 55, in &amp;lt;module&amp;gt;
orig_connectionpool_ssl_wrap_socket = connectionpool.ssl_wrap_socket
AttributeError: 'module' object has no attribute 'ssl_wrap_socket'
rowanto@Rowanto-Deb ~ $
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And I&amp;rsquo;m like, what? Googling around the last line returns you many result, but not those relevant with the eb cli v3. There&amp;rsquo;s also a post which suggest that we use the bundle version (it&amp;rsquo;s a zip file) of aws cli, but I can&amp;rsquo;t find a bundle version of eb cli. Long story short, I found &lt;a href="https://github.com/boto/botocore/issues/266"&gt;this post&lt;/a&gt; which helped me to fix the problem. Thanks to @guss77!&lt;/p&gt;</description></item><item><title>How Positive Thinking and Negative Thinking Could Go Wrong</title><link>https://log.rowanto.com/posts/how-positive-and-negative-thinking-could-go-wrong/</link><pubDate>Wed, 03 Dec 2014 22:03:49 +0000</pubDate><guid>https://log.rowanto.com/posts/how-positive-and-negative-thinking-could-go-wrong/</guid><description>
&lt;p&gt;Pretty much every people who I met understood the concept of positive thinking wrong. Usually what happens is, they are confronted with a problem, and they will say, &amp;ldquo;Don&amp;rsquo;t worry. Everything will be fine&amp;rdquo;. Afterwards, they said it&amp;rsquo;s positive thinking. The problem here is, we have a problem in front of us, so how is everything fine? The problem will not magically go away. We have to deal with it. Let&amp;rsquo;s have another example. Deadline is in one week, and there&amp;rsquo;s still three week&amp;rsquo;s worth of work. One of your colleague said, &amp;ldquo;Don&amp;rsquo;t worry. We will make it.&amp;rdquo;. This might sounds ok at first, but it&amp;rsquo;s actually denying the truth, and it&amp;rsquo;s giving false hope to the other colleagues.&lt;/p&gt;</description></item><item><title>How to fix libgdbm3 update problem in Debian</title><link>https://log.rowanto.com/posts/how-to-fix-libgdbm3-update-problem-in-debian/</link><pubDate>Thu, 13 Nov 2014 19:22:33 +0000</pubDate><guid>https://log.rowanto.com/posts/how-to-fix-libgdbm3-update-problem-in-debian/</guid><description>
&lt;p&gt;In case you recently tried to update your debian system, and got an error related to libgdbm3 like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Preparing to unpack .../libgdbm3_1.8.3-13+b1_i386.deb ...
Unpacking libgdbm3:i386 (1.8.3-13+b1) over (1.8.3-13) ...
dpkg: error processing archive /var/cache/apt/archives/libgdbm3_1.8.3-13+b1_i386.deb (--unpack):
trying to overwrite shared '/usr/share/doc/libgdbm3/changelog.Debian.gz', which is different from other instances of package libgdbm3:i386
Errors were encountered while processing:
/var/cache/apt/archives/libgdbm3_1.8.3-13+b1_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can fix this easily by deleting the libdgbm3 changelog file.&lt;/p&gt;</description></item><item><title>Lessons learned in Øredev 2014</title><link>https://log.rowanto.com/posts/lessons-learned-in-oredev-2014/</link><pubDate>Wed, 12 Nov 2014 00:41:47 +0000</pubDate><guid>https://log.rowanto.com/posts/lessons-learned-in-oredev-2014/</guid><description>
&lt;p&gt;Recently I visited the Øredev 2014 conference. I must say that it&amp;rsquo;s a pretty good one. Some of the talks are pretty boring, but most of them are actually pretty nice.&lt;/p&gt;
&lt;p&gt;I was in the security training, and the three days conference. I tried to avoid going to the talks whose content I can just read up somewhere in the internet. I want the experiences from the speakers. That&amp;rsquo;s why if you see the points below, most of them is about how to do something best. Sometimes I don&amp;rsquo;t really have much choices, but when something like that happened, I will just switch rooms randomly. :)&lt;/p&gt;</description></item><item><title>Add automatic code or syntax highlighting in your ghost blog</title><link>https://log.rowanto.com/posts/add-automatic-code-or-syntax-highlighting-in-your-ghost-blog/</link><pubDate>Fri, 31 Oct 2014 01:02:52 +0000</pubDate><guid>https://log.rowanto.com/posts/add-automatic-code-or-syntax-highlighting-in-your-ghost-blog/</guid><description>
&lt;p&gt;Recently, I switched to the Ghost blogging platform. I must say that it&amp;rsquo;s actually quite nice. Well, it&amp;rsquo;s still young, and some stuff needs to be taken care of. You need to use &amp;ldquo;forever&amp;rdquo; or an init.d script and monitoring to make sure it will stay running. You have to take care of setting up the mail service because it still can&amp;rsquo;t do it automatically like other platform, etc, etc. Well, you can also pay them to host it for you and forgot all those stuffs though.&lt;/p&gt;</description></item><item><title>Why your cancel button submit the html form</title><link>https://log.rowanto.com/posts/why-your-cancel-button-submit-the-html-form/</link><pubDate>Fri, 31 Oct 2014 00:38:51 +0000</pubDate><guid>https://log.rowanto.com/posts/why-your-cancel-button-submit-the-html-form/</guid><description>
&lt;p&gt;One of the mistake which I see often during development on the frontend side is the cancel button, which actually submits the form when clicked. Saw it once, wait a while, saw it again, wait a while, saw it again, and the loop continues. Some people doesn&amp;rsquo;t even realize.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the problem? Let&amp;rsquo;s take a look at a normal html form in AngularJS.
HTML Code&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-app=&amp;quot;MyApp&amp;quot;&amp;gt;
&amp;lt;div ng-controller=&amp;quot;MyController&amp;quot;&amp;gt;
&amp;lt;form ng-submit=&amp;quot;submitTheForm()&amp;quot;&amp;gt;
&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;
&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Name&amp;lt;/label&amp;gt;
&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; ng-model=&amp;quot;someone.name&amp;quot; id=&amp;quot;name&amp;quot; placeholder=&amp;quot;Enter name&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button class=&amp;quot;btn btn-default&amp;quot; ng-click=&amp;quot;cancel()&amp;quot;&amp;gt;Cancel&amp;lt;/button&amp;gt;
&amp;lt;button type=&amp;quot;submit&amp;quot; class=&amp;quot;btn btn-default&amp;quot;&amp;gt;Submit&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JavaScript Code&lt;/p&gt;</description></item><item><title>Playing with AWS Redshift - Sum of 1.2 billion rows took 8 seconds</title><link>https://log.rowanto.com/posts/playing-with-aws-redshift-sum-of-1-2-billion-rows-took-8-seconds/</link><pubDate>Tue, 14 Oct 2014 23:23:33 +0000</pubDate><guid>https://log.rowanto.com/posts/playing-with-aws-redshift-sum-of-1-2-billion-rows-took-8-seconds/</guid><description>
&lt;p&gt;One of the think which makes zanox. an exciting place to work at is because of the innovation time. We used to always have 20% of our work time to be innovation time, where we can learn new stuff which makes life a whole lot interesting. About a month before the writing of this, the format of the innovation time was changed, instead of doing whatever we want on friday, we need to make it transparent what we&amp;rsquo;re learning, and the company will support them by giving you the required stuff. And that&amp;rsquo;s when we got the idea with redshift.&lt;/p&gt;</description></item><item><title>CVE-2014-6271: what is it and how to check if you're vulnerable and fix it</title><link>https://log.rowanto.com/posts/cve-2014-6271-what-is-it-and-how-to-check-if-youre-vulnerable-and-fix-it/</link><pubDate>Thu, 25 Sep 2014 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/cve-2014-6271-what-is-it-and-how-to-check-if-youre-vulnerable-and-fix-it/</guid><description>
&lt;p&gt;What is actually CVE-2014-6271?&lt;/p&gt;
&lt;p&gt;Actually redhat did a very good job describing it: &lt;a href="https://access.redhat.com/articles/1200223"&gt;https://access.redhat.com/articles/1200223&lt;/a&gt;
From what I&amp;rsquo;ve understood, it&amp;rsquo;s basically a bug that allows you in bash to do some other command after the function declaration in a variable.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s change the example a little bit, so that it&amp;rsquo;s more easier to read:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; env your_function='() { echo &amp;quot;your function do something&amp;quot;;}; echo &amp;quot;but I can still add other command after your function&amp;quot;' bash -c &amp;quot;echo this is a test&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you system is affected with the bug, if you run that command, you will see the text &amp;ldquo;but I can still add other command after your function&amp;rdquo;.&lt;/p&gt;</description></item><item><title>How to Solve Grunt Imagemin GLIBC_2.14 Not Found Problem</title><link>https://log.rowanto.com/posts/how-solve-grunt-imagemin-glibc214-not-found-problem/</link><pubDate>Sat, 20 Sep 2014 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/how-solve-grunt-imagemin-glibc214-not-found-problem/</guid><description>
&lt;p&gt;So one day, out of the blue, my grunt build job started failing in jenkins. I was quite confused why. Because it was working fine if I did it from my dev machine. I have a PC, a personal laptop, a work laptop, and two home servers (which are just old laptops converted to do various stuffs), and it worked fine in all, except in one of the home server which is running jenkins. Everytime I did grunt build there, I got:&lt;/p&gt;</description></item><item><title>Java Application Server is dead, so is Docker?</title><link>https://log.rowanto.com/posts/java-application-server-is-dead-so-is-docker/</link><pubDate>Tue, 16 Sep 2014 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/java-application-server-is-dead-so-is-docker/</guid><description>
&lt;p&gt;So lately, a lot of people in my circle is talking about why java application server is dead. The reason why is explained in the slides &lt;a href="http://de.slideshare.net/ewolff/java-application-servers-are-dead"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically what I get is that because nowdays people only deploy one artifact in one application server, it beats the point of the application server. It&amp;rsquo;s more like that the application server is already part of the application. So, it would be better to treat the application server as part of the application and ship them together as a package.&lt;/p&gt;</description></item><item><title>Excellence</title><link>https://log.rowanto.com/posts/excellence/</link><pubDate>Sun, 14 Sep 2014 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/excellence/</guid><description>
&lt;p&gt;What does excellence means?
I checked some source in the internet, and the first result that I got was, &amp;ldquo;The state, quality, or condition of excelling; superiority&amp;rdquo; When I check the meaning of excellent, I got as the first result &amp;ldquo;Of the highest or finest quality; exceptionally good of its kind&amp;rdquo;. So if somebody is an excellent guy, it would mean that he&amp;rsquo;s of the highest or finest quality, and he&amp;rsquo;s exceptionally good of its kind.&lt;/p&gt;</description></item><item><title>Management Lesson Everyone Should Know</title><link>https://log.rowanto.com/posts/management-lesson-everyone-should-know/</link><pubDate>Sat, 13 Sep 2014 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/management-lesson-everyone-should-know/</guid><description>
&lt;p&gt;A turkey was chatting with a bull.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I would love to be able to get to the top of that tree,&amp;rdquo; sighed the turkey, &amp;ldquo;but I haven&amp;rsquo;t got the energy.&amp;rdquo; &amp;ldquo;Well, why don&amp;rsquo;t you nibble on some of my droppings?&amp;rdquo; replied the bull. &amp;ldquo;They&amp;rsquo;re packed with nutrients.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The turkey pecked at a lump of dung and found that it actually gave him enough strength to reach the lowest branch of the tree.&lt;/p&gt;</description></item><item><title>Hibernate Soft Delete and Optimistic Locking Problem</title><link>https://log.rowanto.com/posts/hibernate-soft-delete-and-optimistic-locking-problem/</link><pubDate>Tue, 11 Feb 2014 11:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/hibernate-soft-delete-and-optimistic-locking-problem/</guid><description>
&lt;p&gt;Sometimes, in the database, we will want to not delete stuff because the data might still be needed later. Maybe some other process in the company will have to generate an invoice by the end of the month. That&amp;rsquo;s also one of the reason in my workplace, why there won&amp;rsquo;t be any hard delete in the database except when we&amp;rsquo;re sure it&amp;rsquo;s really necessary.&lt;/p&gt;
&lt;p&gt;One solution for this, in hibernate, is to overwrite the sql delete command using the @SqlDelete annotation:&lt;/p&gt;</description></item><item><title>AngularJs and VideoJs problem: Video only loaded on hard refresh, not on switching page</title><link>https://log.rowanto.com/posts/angularjs-and-videojs-problem-video-only-loaded-on-hard-refresh-but-not-on-switching-page/</link><pubDate>Sat, 08 Feb 2014 11:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/angularjs-and-videojs-problem-video-only-loaded-on-hard-refresh-but-not-on-switching-page/</guid><description>
&lt;p&gt;So I was working on a private project with angular js and video js, and I am loading videojs dynamically after I got the source of the video, and there&amp;rsquo;s this very interesting problem where videojs will only be loaded only if you hard-refresh the page (f5-button). If you navigate to the page where it contains the video, or if you were on the page, go somewhere else, then come back again, the video won&amp;rsquo;t be loaded anymore and you&amp;rsquo;ll only get your old html5 video from the browser.&lt;/p&gt;</description></item><item><title>Monitor resolution not properly detected in Linux (Debian 7 or Wheezy)</title><link>https://log.rowanto.com/posts/monitor-resolution-not-properly-detected-linux-debian-7-or-wheezy/</link><pubDate>Fri, 09 Aug 2013 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/monitor-resolution-not-properly-detected-linux-debian-7-or-wheezy/</guid><description>
&lt;p&gt;So I have an ATI HD5xxx graphic card in my desktop personal computer. It&amp;rsquo;s a nice and quite fast card. It also has three display adapters: HDMI, DVI, DisplayPort. On my desk, there are two monitors. One of them have a DVI and a VGA adapter. The other however, only have VGA adapter. Do you see the problem here?&lt;/p&gt;
&lt;p&gt;My graphic card has no VGA adapter, because of this, I need to use some adapter, and because I used an adapter, the resolution of the monitor is not detected properly. The native resolution of that monitor is 1920x1080 pixels, but I can only set it to 1440x900 when I use the adapter (which looks quite ugly). This problem is easily solveable in Windows 8. The windows&amp;rsquo; ATI Cataylst has an option to force a resolution on the monitor. So I can just force 1920x1080 and it works perfectly. Debian (or other distribution like Fedora) however, does not have this option..&lt;/p&gt;</description></item><item><title>Installing Skype on 64-bit Debian 7 (codename: Wheezy)</title><link>https://log.rowanto.com/posts/installing-skype-on-64-bit-debian-7-codename-wheezy/</link><pubDate>Thu, 08 Aug 2013 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/installing-skype-on-64-bit-debian-7-codename-wheezy/</guid><description>
&lt;p&gt;So it was when I was trying to install Skype on my brand new Debian 7 (Wheezy) when I encountered this problem:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package architecture (i386) does not match system (amd64)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Actually I was a little shocked. I just downloaded the Skype package for Debian from the official website then tried to install it normally using &amp;ldquo;dpkg -i &lt;!-- raw HTML omitted --&gt;&amp;rdquo;, and it used to always work (normally). Actually I came from the rpm world (Fedora and CentOS) and have been only using Windows 8 for the past few months for my thesis, so I am actually wondering whether I&amp;rsquo;m the one who is a little out of date, or this is just a deb thingie, or I&amp;rsquo;m just too thick and dumb. But really, I never encountered this kind of problem. This is a first for me.&lt;/p&gt;</description></item><item><title>Factorial function of 10000!</title><link>https://log.rowanto.com/posts/factorial-function-of-10000/</link><pubDate>Fri, 10 May 2013 09:00:00 +0000</pubDate><guid>https://log.rowanto.com/posts/factorial-function-of-10000/</guid><description>
&lt;p&gt;I have a friend who asked me to teach him Java programming. About a few days ago, he told me :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Programmers should work fast and efficient. Please give me a task which has a time limit. I&amp;rsquo;m not used to fast programming.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The part about fast and efficient is always universally true. It doesn&amp;rsquo;t apply to only programming, but I am more in the direction of doing something right instead of fast. It&amp;rsquo;s better to do it right, but slow, instead of fast, but horrible. Of course it&amp;rsquo;s depending of the context also, but generally it should be like that in my opinion.&lt;/p&gt;</description></item></channel></rss>