How To Make Firefox Font Rendering Better

Make firefox show webpage better

When I use both firefox and chrome, I realize chrome show website better than firefox in many cases. The font firefox used is the default font Sans and Sans-Serif of Linux, it is not good as TimeNewRoman and Arial of Window where chrome used. So we can change this to have better rendering. This tricks also can be used in Fedora and Ubuntu.

Bloom-Filter technique in checking element if existed

Khi ở VCCorp, mình được tiếp cận với một hệ thống khá lớn sử dụng Hadoop Ecosystem. Công việc ở đây khá là thoải mái và họ có một văn hóa rất hay, đó là văn hóa tạm ứng niềm tin, đó là thấy ai chỉ cần có tiềm năng thôi, là sẽ được giao phó và tin tưởng trong công việc. Từ khi vào đây, mình được chủ động tìm hiểu, đưa ra giải pháp cho bài toán được giao một cách tự do, khiến mình cảm nhận và tiến bộ lên khá nhiều.

Bài toán mình phải làm ở đây đó là phải xây dựng một hệ thống A/B testing. Các tác vụ test ở đây có thể là test trên các tập user (guid) đã được xây dựng sẵn, gọi là các tập Audience. Mục đích của hệ thống này là test everything, test giữa các tập audience xem phù hợp với campaign nào và ngược lại. Một trong những điểm quan trọng của hệ thống này là phải có latency cực thấp. Lí do là khi 1 người dùng view đến trang web, hệ thống phải qua các bước xử lý, check người dùng này có trong tập audience ta cần test không, đưa ra lựa chọn và log lại, trả về cho người dùng thông tin cần thiết. Sau đó ta có thể analytic realtime trên cơ sở dữ liệu đã được log lại.

Do để có latency thật thấp nên mình đã xem xét các stage và nhận thấy có 2 stage tốn thời gian nhất: - Random phương án cho người dùng (Việc này do thư viện Planout của Glassdoor). - Check xem người dùng có trong tập audience không. Một tập audience có số lượng rất lớn, từ 1 triệu cho đến 5 triệu. Việc này sẽ còn tăng khi số lượng test nhiều lên.

Để xử lý phương án thứ nhất, mình đã xem code của Planout. Code này chậm vì nó quá cồng kềnh, có nhiều đoạn cần cast object, và nhiều phần random mình cứ nghĩ họ dùng cái thuật toán nào lạ lạ, hóa ra cũng chỉ sử dụng phân phối Multinomial để cần random 1 option theo tỉ lệ. Ví dụ bạn muốn random 1 button màu gì theo 2 options là đỏ - 0.2 và xanh - 0.8 thì phân phối Multinomial sẽ giúp bạn làm việc này. Chính vì vậy, mình đã quyết định viết lại 1 thư viện A/B Testing nhỏ gọn của mình, phù hợp với bài toán của mình và để hiệu năng cao hơn.

Ở phần check người dùng có trong tập audience hay không, ta có thể hiểu như thế này. Một người dùng sẽ được định nghĩa bằng 1 guid, và 1 tập audience chính 1 tập các guid. Việc sử dụng database thậm chí cả In-memory database đều không thể đáp ứng latency đủ thấp cho 1 tác vụ như thế này. Thật may trước đó mình đã đọc được slide về Probability Data Model của 1 anh bên VNG trên slideshare của ITLC Leader, có nhắc đến Bloom-Filter(BF) có rất nhiều ứng dụng cho các bài toán counting và check existing. Về cơ bản như sau:

Một BF là một dãy các bit có độ dài là m, ban đầu đều là 0 hết. Cùng với đó là k hàm hashing khác nhau. Mỗi 1 phần tử được đưa vào BF sẽ được hash bằng k hàm hashing này vào các vị trí trên dãy bit. Với mỗi phần tử đưa vào được hashing vào các vị trí đó thì các vị trí đó sẽ được set giá trị bằng 1.

Khi kiểm tra một phần tử có tồn tại trong BF không thì ta làm theo các tương tự, hash phần tử này bởi k hàm hashing khác nhau và check xem các vị trí thu được có giá trị bằng 1 không. Nếu tất cả bằng 1 thì phần tử đó thuộc BF, còn nếu không thì phần tử đó có thể thuộc BF với sác xuất khá thấp, gọi là sác xuất false-positive. Về cơ sở lý thuyết mình cũng được học trên lớp thầy Văn ở BK, nhưng ngại viết ra đây, mọi người có thể xem qua

Tức là ta sẽ chấp nhận có thể sai số, 1 user sẽ được nhận diện sai trong 1 audience là không có với 1 sác xuất rất thấp. Để chọn sác xuất thấp này thì mọi người xem qua trong 2 link mình gửi, do sác xuất thấp nên ta có thể chấp nhận được, và do đặc thù logic, ở nghiệp vụ A/B testing nhận diện sai như vậy không vấn đề gì cả do sác xuất quá bé.

Công việc của ta là hàng ngày xây dựng các Bloom Filter cho các tập user. Mặc dù các tập này rất lớn, được lưu trên Hbase nhưng khi xây dựng các Bloom Filter thì chỉ mất tầm 500MB cho khoảng 600 bloom-filters. Và tất nhiên quá trình Hash rất nhanh, đặc biệt là sử dụng hàm hash Murphur nên việc đáp ứng latency là một điểm giải pháp này đảm bảo.

Lambda Architecture

Lambda Architecture Resources

Fix Breeze Theme Of Libreoffice In Kde 5

Libreoffice

Libreoffice cung cấp các look-and-feel theo rất nhiều UI khác nhau như GTK, QT4, QT5,... Kể từ bản KDE 5, trên libreoffice đã có 1 look-and-feel cho QT nhưng vẫn còn rất xấu và nhìn rất khó chịu, nhất là các checkbox trên toolbar. Ta có thể khiến LibreOffice trông dễ nhìn hơn mà trông vẫn đồng bộ với giao diện breeze của toàn hệ thống bằng cách sửa trong file libreoffice-still.sh:

sudo kate /etc/profile.d/libreoffice-still.sh

Uncomment dòng:

export SAL_USE_VCLPLUGIN=gtk

và restart. Mọi người sẽ thấy giao diện mới trông dễ nhìn và trang nhã hơn rất nhiều.

Introduction To Docker

Introduction to Docker

I heard about Docker many months ago, but recently i have started to learn it because some fellows in my company remains about it. Docker is simply an engine which we can combine all dependencies of a software and itself in to an image. The difference between Docker and Virtual Machine is that Docker have common kernel with the host OS, and the methods of managing resources are different. You can imagine that Docker is like virtualenv, but in virtualenv, we have own python interpreter which are different in Docker, we share kernel with the host OS. This means that Docker have better performance than VM.

Lets begin with the installation. In Ubuntu:

sudo apt-get install docker.io

Now you can check if the installation is successful by the command line: sudo docker --help

Pull an image from internet to our computer:

sudo docker pull ubuntu

In the above, instead of pulling an ubuntu image, you can replaced ubuntu by other distro name such as fedora, debian. Docker also provide an hub that we can sharing out images like Github. It is really interesting ?

Access to an image:

sudo docker run -i -t ubuntu /bin/bash

The result in my computer: root@6f93ffb044df:/#

Ok, we finished the introduction of installation docker. More information and configurations will be posted in later articles. Hope you enjoy it ! :)

Introduction to asynchronous in NodeJS !

NodeJS is an asynchronous event driven framework, which removes many things of related frontend in Javascript and adds many libraries such as http,.. which supports to build web applications in the server side. Asynchronous is the most interesting features of NodeJS and it make many websites built in NodeJS have high responsibility and handle more requests than other frameworks. The benchmarks can be seen in [1]. In this introduction, I will explain in the simplest way about Asynchronous.

Asynchronous I/O, or non-blocking I/O can be understood that an process do one job while other jobs can run concurrent and not wait until first job complete. The first job can have a callback that can be a function called after it finish.

An attractive example of callback function is the built-in function setTimeout:

setTimeout(function(){
    console.log("5s later");
}, 5000)

console.log("Start to count 5s")

Output:

Start to count 5s
5s later

As you can see, the line Start to count 5s normally will be showed after the function setTimeout finish, but now is the world of Nodejs, the console.log("Start to count 5s") will start after setTimeout started.

The function in the parameter of setTimeout is called by callback function, it will run after the setTimeout finished. Through 2 examples, I guess you can imagine the big picture of Asynchronous and CallBack function yet :)

Things I learned from programming

When I was a child, I was very lucky because my father always encouraged me to learn new things in many fields. From origin, not only I was a mathematically gifted student who always reach the highest score in any mathematical exam in my school but also I started coding from very early. When I was ten years old, my father bought to me an old computer with a CPU Pentium I (its clock's frequency is 233MHZ) 64 MB of RAM and only 6GB hard-disk. My father told me that: "You can do anything with it even you can make it wrong. When you finish struggling with it is the time you are mature enough to use a new one". My father also took me to chess and it becomes one of the most favourite things I love alongside with programming and mathematic.

In my opinion, Mathematic and Information is two things that the most intelligent people in the world come to learn them. Because of that, everything we learn from Information is all very bright things. Developers create git which are the most intelligent management system I ever seen. How to become a hacker is the most interesting manual about learning and mindset skills in the world.

Brain Storming

carefully, everything is important even the smallest. structure, complex, hacking, knowledge is gigantic and we must try hard everyday, always improve efficient productivity, always motivate yourself.

learn from the smartest human in the world. Learn teamwork and how to work in a team with a high efficient. How to manage a team by tool. How to lead a team.

think different (in programming, in creativity). Hello world, learning skills, reading knowledge must read a book, learn using tools should read a tutorial.

Welcome to my new house !

Phew ! That is done, i have completely create a github sites for my own :)

After a long time, i shared my posts at http://dangchienhsgs.wordpress.com. As a junior coder come in the road to be a professional programmer, i must blame my self that why i could live with the wordpress blog for a long time even it can not edit and add something crazy of my self at that :) I decided to try jekyll blog and it is so simple and technical, which are very suitable for me.

Now i will release my posts at here, all the posts mention about tech and my life. Now, i think i still have many things to do with this blog to make it is of my self, right ?

Hanoi, 14/6/2015.