Languages Benchmark on Printing Hello World

Just got a spare time to do some benchmarking on programming languages.
P.S. This is just for fun. So I ran this test only once. I don't really care about the accuracy.


  1. C
  2. Bash
  3. Perl
  4. Mono
  5. Node
  6. Java
  7. Python
  8. Ruby
Version used:
gcc 4.8.1
perl 5.14.2
node.js 0.10.15
java 1.7.0_51
python 2.7.5
ruby 1.9.3

Source code

#include <stdio.h>
    printf("Hello World!\n");
    return 0;
class A{
    public static void main(String[] args){
        System.out.printf("Hello World!\n");
print "Hello World!";

printf "Hello World!\n"

console.log("Hello World!");
printf "Hello World!\n"

using System;
public class A{
    static public void Main(){
        Console.WriteLine("Hello World!");


Hunting for Zyxel rom-0 file decrypter

I stumbled upon this link today
This is a vulnerability on TP-Link router (which using Zyxel firmware), that anyone can access to the configuration backup page without using any authentication and be able to download the configuration file (file name "rom-0"). Moreover, the configuration file, somehow, contains clear-text username and password.

However, the website the author mentioned that it can decrypt the "rom-0" data is on an external server and it doesn't even have a domain name. To be honest, I don't really trust any website like that.

I started looking for a way to decrypt the file "rom-0" with some keywords that he mentioned in the paper, like "lzs", "zynos", "", ...

I found many links pointing to a website at, which should contain the source code of how to decrypt rom-0 file. Unfortunately, it was down and I can't even find exists.

Further investigation, I found that the previous website was owned by the person named Kender Arg, I then later found his related work about hacking Zyxel gateway at

and an article about decrypting rom-0 file (which I want) was mirrored at this website

This describes how he is able to understand the "rom-0" file and how he decrypt it. This article also has a link to the source code to decrypt the file, but it links to again which is not currently existed.

Since the implemented one doesn't work, the other way is to backtracking to the source of encryption algorithm as in this paper

Luckily, I found another implementation of LZS decrypter online, so I don't have to read and implement it myself. It's the project called "Zyxel-revert" which is hosted at;a=summary

What I need to do is grab the latest snapshot and compile it then run.

Here is the result
 At the end of the decompressing process, it crashed, but anyway the result is still readable and enough for me.

That's what I needed.

I also found that the owner of the page www has wrote a program to automate this, with GUI and source code, called "Huawei-rom-0.exe" (
It works with the sample inside the zip file, but it doesn't work for the rom-0 file I have.

One of my search result links to a file named "ZyXEL-Firmware.exe" ( which does the same things (decrypt .lzs file, and find strings in spt.dat). I tried it with my rom-0 and it crashed. I guess this is using the same engine as in the previous program.

One last thing, I found that this is not the new vulnerability. According to this, Kender has published this since 2008.
And I found that the website/tool named which published on 2011 (according to this has included this vulnerability.

Update 2013-01-20:
Sleepya has analyzed the result, and found the specific location for the password for router inside the decompressed file. It's starting at location 0x14 (or 20 in decimal). Therefore, we can use tools like, dd, hexdump, tail to skip the first 20 bytes and get the password which is the first string ending with \0.


First Post in 2014

Happy New Year 2014

Let this year begin with a good motivation.

I found this video in Youtube and it's very inspirational.

Below here is the transcript of the video:
I don't know what that dream is that you have.
I don't care how disappointing it might've been as you've been working toward that dream,
but that dream that you're holding in your mind,
That it's possible!
That some of you already know.
That it's hard,
it's not easy.
It's hard changing your life.
That in the process, of working on your dreams,
you are going to incur in a lot of disappointment,
a lot of failure,
a lot of pain.
There are moments when you're gonna doubt yourself.
You said God, why, why is this happening to me?
I'm just trying to take care of my children and my mother, I'm not trying to steal or rob from anybody
How does this have to happen to me?
For those of you that have experience some hardships,
don't give up on your dream.
The rough times are gonna come, but they have not come to stay, they have come to pass.
Greatness, is not this wonderful, esoteric, illusive,
god-like feature that only the special among us will ever taste.
It's something that truly exists, in all of us.
It's very important for you to believe, that you are the one.
Most people, they raise a family, they earn a living and then they died.
They stop growing, they stop working on themselves, they stop stretching, they stop pushing themselves.
Then a lot of people like to complain but they don't wanna do anything about their situation.
And most people don't work on their dreams, why?
One is because of fear, the fear of failure, "what if things don't work out"?
And the fear of success, "what If they do and I can't handle it"?
These are not risk takers.
You spent so much time with other people, you spent some much time trying to get people to like you,
you know other people more than you know yourself,
you studied them, you know about them, you want hang out like them, you want to be just like them.
And you know what?
You've invested so much time on them, you don't know who you are.
I challenge you to spend time by yourself.
It's necessary, that get the losers out of your life, if you want to live your dream.
But people who are running towards their dreams, life have a special kind of meaning.
When you become the 'right-person', what you do is you start separating yourself from other people
you begin to have a certain uniqueness,
as long as you follow on other people, as long as you being a 'copy-cat',
you will never, ever be the best 'copy-cat' in the world,
but you will be the best you could be,
I challenge you to define your value.
That everybody won't see it, that everybody won't join you, that everybody won't have the vision...
it's necessary to know that.
That you are an uncommon breed.
It's necessary that you align yourself with people and attract people into your business,
who are hungry!
People who are unstoppable and unreasonable,
people who are rebuilding to live life just as it is and who want more!
The people that are living their dreams, of party winners, to attach themselves to.
the people that are living their dreams, are the people that know
that if it's gonna happen it's up to them
If you want to be more successful,
if you want have and do stuff you never done before,
I'm asking you, to Invest in you!
To Invest in you!
Someones opinion of you, does not have to become your reality.
That you don't have to go through life, being a victim.
And even though you face disappointments, you have to know within yourself...
that I can do this, even if no one see it for me , I've must see it for myself.
This is what I believe and I'm willing to die for it. Period.
No matter how bad it is or how bad it gets,
I'm going to make it!
I wanna represent an idea. I wanna represent possibilities.
some of you right now, you want to go to next level.
'I want a council, I want to be a engineer, I want to be a doctor." Listen to me:
You can't get to that level.
You can't get to that level economically where you want to be, until you start invest in your mind.
You are not reading books.
I challenge you all to go to the conference.
I dare you to invest time!
I dare you to be alone!
I dare you to spent an hour to get to know yourself.
When you Become who you are,
when you Become the person that you are created to be, designed to be who you were designed to be.
When you become an individual.
What you do is: take yourself and you start separating yourself from other people.
I'm challenging you, to get to the place where people do not like you or do not even bother you no more. Why? Cause you are not concerned to make them happy.
Because you try to blow, you try to the next level.
I need you to invest in your mind.
If you still taking about your dream.
If you still taking about your goals.
But you have not done anything
You can make your parent proud,
you can make your school proud,
you can touch millions of people lives and the word will never be the same again,
because you came this way.
Don't let nobody steal your dream!
After we face a rejection and a "NO" or we have a meeting and no one shows up,
or somebody said, you can count on me, and they don't come through
what if we had that kind of attitude that cause reposses, nobody believes in you, you扉e lost again, and again, and again! the lights are cut off
but you still looking at your dream, reviewing it every day and saying to yourself:
You can live your dream!


My Note About Git

Git Config

  • ดู configuration ปัจจุบันของ git ได้ด้วย : git config -l
  • เซ็ตค่าสำหรับเฉพาะ git repo นั้น : git config --local  .........
  • เซ็ตค่าสำหรับทุกๆ git repo : git config --global  ........

Git Remote

  • ดู remote repo ทั้งหมด : git remote -v
  • เพิ่ม remote : git remote add origin username@server_ip:path_name.git
  • ลบ remote : git remote remove origin
  • แก้ URL ของ git remote : git remote set-url origin username@server_ip:path_name.git
  • แก้ URL ของ git remote #2 : git remote set-url origin ssh://username@server_ip/path_name.git

Git Bare & Git Non-Bare

Git repository สามารถสร้างได้ 2 แบบคือ แบบ bare กับ แบบ non-bare
  1. bare repository คือ repository ที่ข้างใน folder นั้นมีแค่ folder ".git" อย่างเดียว
    1. สร้างโดย 
      1. mkdir repo_name; cd repo_name; git init --bare 
      2. หรือ git clone --bare repo_name repo_path
    2. สามารถ config ให้ repo ใดๆที่มีอยู่แล้ว เป็น bare หรือไม่ได้ 
      1. โดยเข้าไปแก้ไฟล์ repo_path/.git/config ให้มีบรรทัด bare=true 
      2. หรือ git config --bool core.bare true
    3. ข้อดี: 
      1. ไม่ต้องเก็บโค้ดอยู่ในตัว folder ที่เก็บ repository
      2. ไม่ต้องคอยสั่ง git reset --hard HEAD บน repo directory เหมือนกับแบบ non-bare
      3. เวลา client จะ push ก็จะขึ้นมาได้เลย เนื่องจากว่าบน server ไม่ได้ checkout โค้ดอะไรไว้เลย
      4. เหมาะกับการใช้บน server
    4. ข้อเสีย
      1. เนื่องจากไม่มีโค้ดของตัวเอง ทำให้ไม่เห็นโค้ดได้ง่ายๆ ต้อง clone/checkout ออกมาก่อน
      2. การใช้ git status และ คำสั่ง git ที่ใช้ในการจัดการไฟล์ จะใช้ไม่ได้ใน directory นี้
  2. non-bare repository คือ repository ปกติ ที่ข้างในจะมีทั้ง ".git" และ ไฟล์อื่นๆที่ commit ขึ้นมา
    1. สร้างโดยคำสั่งแบบเดียวกับ bare แต่ต้องไม่มี "--bare"
    2. ถ้าอยากจะปรับให้ repo ที่เป็น bare ให้เป็น non-bare ต้องปรับค่า bare=false
    3. ข้อดี: บน server จะสามารถเห็นไฟล์และแก้ไขไฟล์ได้  ก็เหมือน checkout ออกมาดูตลอดเวลา
    4. ข้อเสีย: 
      1. เวลาที่ client สั่ง git push ขึ้นมา จะไม่สามารถเอาขึ้นมาได้ โดยจะขึ้นว่า 
        remote: error: refusing to update checked out branch: refs/heads/master
        remote: error: By default, updating the current branch in a non-bare repository
        remote: error: is denied, because it will make the index and work tree inconsistent
        remote: error: with what you pushed, and will require 'git reset --hard' to match
        remote: error: the work tree to HEAD.
        remote: error: 
        remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
        remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
        remote: error: its current branch; however, this is not recommended unless you
        remote: error: arranged to update its work tree to match what you pushed in some
        remote: error: other way.
        remote: error: 
        remote: error: To squelch this message and still keep the default behaviour, set
        remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'

        โดยจะต้องไปตั้งค่า receive.denyCurrentBranch ก่อน ถึงจะ push ขึ้นมาได้
      2. เวลาจะ update โค้ดบนฝั่ง server ( directory นี้ ) จะใช้ git pull ไม่ได้ เพราะมันบนเครื่องตัวเอง  ให้ใช้ git reset --hard HEAD แทน

Git Post-Receive Hook

ในการ deploy บน git server เองนั้น  สามารถใช้ hook ได้ ซึ่งหมายถึงว่า เราสามารถตั้งให้ เมื่อใดก็ตามที่ developer สั่ง git push ขึ้นมาบน server ใน branch "master"  เหตุการณ์นี้ก็จะสั่ง hook ที่ชื่อ post-receive เพื่อทำการรัน shell script ที่อยู่ข้างในได้

  1. เข้าไปใน ".git" directory ของ directory ที่เป็น repository หลัก ( repository ที่ตั้งไว้ตอน ssh หรือ git clone)
  2. สร้างไฟล์ชื่อ post-receive ภายใน path "hook/"
  3. ข้างในเขียนเป็น shell script โดยมีตัวแปรให้ตั้งสองตัวคือ
    1. GIT_DIR  : ตัวแปรที่ต้องตั้งเพื่อบอกว่า ".git" ที่จะใช้ อยู่ path อะไร
    2. GIT_WORKING_TREE : ตัวแปรที่บอกว่า path ที่จะดึงโค้ดออกมา อยู่ที่ path ไหน
  4. ตัวอย่าง: เมื่อมี push ขึ้นมา ให้เอาโค้ดล่าสุด(HEAD)จาก master ไปลงใน /var/www/myproject
    export GIT_DIR=~/myproject/.git
    export GIT_WORKING_TREE=/var/www/myproject
    git checkout -f master
    git reset --hard HEAD
  5. chmod u+x post_receive


แอป Money Lover สำหรับจัดการการเงินส่วนตัว

วันนี้จะขอมาแนะนำ Android App สำหรับจดบันทึกรายการค่าใช้จ่ายประจำวัน

App นี้มีชื่อว่า "Money Lover"

ความสามารถหลักต่างๆ เช่น

  • จดบันทึกรายจ่าย (แน่นอนอยู่แล้ว)
  • จดบันทึกรายรับ (บาง app ถึงจะมี)
  • รายจ่ายสามารถแยกเป็นกลุ่มการใช้จ่ายได้ พร้อมทั้งเลือก icon สำหรับกลุ่มนั้นๆได้ด้วย  ปล. สามารถ download icons เพิ่มได้แต่ต้องเสียเงิน
  • ตั้งรายรับ/รายจ่าย แบบเป็นรอบอัตโนมัติได้
  • มีภาษาไทย!
  • มีเครื่องคิดเลขให้ตอนบันทึกรายรับ/รายจ่าย เพื่อจะใช้คำนวนต่างๆเช่นหารต่อหัว, รวมรายการ, ฯลฯ มีประโยชน์มาก
  • มีสรุปประจำเดือนได้  โดยแยกการใช้จ่ายเป็นกลุ่มต่างๆ ได้อย่างชัดเจน
  • มีการจดบันทึกและคำนวนการใช้หนี้ได้
  • มีการตั้งแพลน/งบประมาณ สำหรับการใช้จ่ายได้
  • มีโหมด travel สำหรับ รวบรวมการใช้จ่ายในช่วงเวลาท่องเที่ยวนั้นอยู่ในกลุ่มเดียวกันได้
  • มีการคำนวนอัตราแลกเปลี่ยนโดยดึงอัตราแรกเปลี่ยน ณ เวลาปัจจุบันมาได้
  • มีการ backup/restore ลงไฟล์ได้ และ ลง Dropbox ได้
  • สามารถตั้ง auto-backup ได้ พร้อมทั้งช่วงเวลาการ auto-backup ได้
  • กำลังจะมีเมนู sync ขึ้นมา (ใน version หน้า)
  • และสุดท้ายนี้...  แอปนี้ สวยมาก :)
หลังจากได้ทดลองใช้ app "Expense Manager" ของ Bishinews, และ "Expense Manager" ของ Markus Hintersteiner มา คิดว่า app นี้ดีกว่าสองตัวนี้ที่เคยใช้มามาก ทั้งด้าน features และ user experience. และที่สำคัญคือ เคยมีประสบการณ์ข้อมูลหายมาหลายรอบแล้ว ดังนั้นเลยเห็นความสำคัญของ auto-backup มากๆ 

ต่อไปนี้เป็นภาพตัวอย่าง จากการใช้งานจริง :)

เปิดมามีให้เลือกภาษา และ สกุลเงิน ซึ่งก็มี ไทย บาท ด้วย



ในหน้าการกรอกตัวเงิน สามารถใช้เครื่องคิดเลขได้ด้วย

หน้าหมวดหมู่ มีรายการหมวดหมู่ พร้อมไอคอนมาให้สังเกตได้ง่าย 

พอจดบันทึกแล้ว ก็จะมีสรุปเป็นรายวัน เรียงลงไปข้างล่าง

พอดูรายงานประจำเดือน ก็จะเห็นสรุปรายรับ และ รายจ่าย


สำหรับถ้าใครอยากใช้งานแบบ ไม่มีโฆษณา สามารถเลือกจ่ายประมาณ 64 บาท โดยเลือกจากในเมนูในโปรแกรมได้เลย
แต่ถ้าจ่าย License ก็จะได้ app แบบไม่มีโฆษณา และสามารถใช้ได้หลายบัญชี(หลายประเป๋าตังค์)พร้อมกันได้ ราคาเพียง 161 บาทเท่านั้น