Chủ Nhật, 8 tháng 11, 2015
RomajiDesu has been updated with smart Japanese word decomposition
Chủ Nhật, 11 tháng 10, 2015
Wind visualization for meteorologist
Thứ Tư, 11 tháng 3, 2015
New feature with RomajiDesu Kanji dictionary
Thứ Ba, 13 tháng 1, 2015
A simple example of Delegate Pattern in Swift
Thứ Ba, 28 tháng 10, 2014
A little girl can help preserving Vietnamese traditional folk art?
Back to Vietnamese traditional art, "Chầu Văn" is a similar example. Originated around 16th century, it purpose is to serve Vietnamese traditional religious ritual (Đạo Mẫu), the genre once became a very popular kind of art. Now a day, Chầu văn is one of the national heritages of traditional culture. And again, not many people, especially young people, understand this genre. I've watched and listened to Chau Van many times before, but I didn't understand or enjoyed it either. Most other people simple don't care about this special art.
Until one day, this little kid showed up in the finale of Vietnamese's The Voice kid, 2014. Her beautiful performance and maybe her innocence, some how made the Chau Van song "Cô Đôi Thượng Ngàn" became so lively and enjoyable. Countless of young people gave whole hearted compliment to the performance and started to be interested in this type of art. Thien Nhan (the girl) became the champion of the show, and somehow give out this kind of art to many people, especially youngsters.
If you have no idea of what Chau Van is, then enjoy watching this
Thứ Sáu, 27 tháng 6, 2014
A new Japanese Translator and Morphological Analyser
It's been a while since I meet Mecab, (Yet Another Part-of-Speech and Morphological Analyzer), and it's time I put back the converter, now called RomajiDesu Online Japanese Translator. The formula is:
The result is as follows (Figure 1):
![]() |
| Figure 1. A screen short from RomajiDesu's Japanese translator. The text is a paragraph from the song "Mirai e", (to the future) by Kiroro. |
![]() |
| Figure 2. As figure 1 but when the mouse is over. |
Thứ Tư, 26 tháng 3, 2014
How to remember the Kanji: Sakura 桜.
Has the Sakura (桜) season started in Japan?
I took this photo Osaka Castle (大坂城 - Ōsaka-jō) in Sakura season last year. Sadly I am not staying in Japan currently, but I can imagine the pink sakura blossoms start lighting up the country, from the south to the north.
So how do you remember the Kanji 桜? To me, there's a woman (女) on the right who is enjoying the
sakura petals (⺌) falling from above near a sakura tree (木) on the left. It seems to be logical, right? ;)
How about you?
I miss Kyoto, Japan!
Thứ Ba, 10 tháng 9, 2013
How to log MySQL slow queries
# touch /var/log/slow
# chown mysql:mysql /var/log/slowqueries
# mysql -e 'SET GLOBAL slow_query_log=1;'
# mysql -e 'SET GLOBAL slow_query_log_file="/var/log/slowqueries";'
# mysql -e 'SET GLOBAL long_query_time=5;'
Or I can add these lines to my.cnf:
slow_query_log=1
slow_query_log_file=/var/log/slowqueries
long_query_time=2
To test if it is working correctly, try:
# mysql -e 'SELECT SLEEP(6);'
Chủ Nhật, 1 tháng 9, 2013
Romajidesu is back!
Thứ Ba, 23 tháng 7, 2013
Audio pronuciation on RomajiDesu
![]() |
| A sample search for "恋人" (Lover) using RomajiDesu dictionary |
Thứ Năm, 28 tháng 2, 2013
Farewell Paypal, never see you ever again!
Just after the a second donation was made, I received two email said that my account was limited again because:
Feb 26, 2013: We need a bit more information about some money you recently received or withdrew.(Your case ID for this reason is PP-002-223-472-153.)
Feb 26, 2013: We've noticed some changes to your usual account activity. As a security precaution, we'll need a little more information about you and your account.
(Your case ID for this reason is PP-002-223-472-236.)
Well, it seems that I just need to log into the resolution center and choose the case ID and provide them answer or proof, right? There are nothing to choose there. There is a section to verify a credit card, but I need to add another card and verify again! WTF?
So I chose email contact and provided them information of the two above cases. They did kindly answer an email said that give time 01 day for reviewing my account. Then, after 02 days, this is what I received:
For the safety and security of the PayPal network, we often review accounts for potential risks. After reviewing your account, we have decided to close it because of security issues. We are making every effort to minimize any disruption to your business. If your PayPal account balance is zero, and you have no unresolved buyercomplaints or chargebacks, your account will remain limited.
-----------------------------------Disbursement options------------------------------ -----
Option 1. If you owe refunds to any of your buyers, you can use the money in your PayPal account to refund them.To refund your buyers:1. Log in to your PayPal account.2. Click "Contact Us" at the bottom of any page.3. Click "Contact Customer Service."4. Under "Choose a Topic," select "Sending/Receiving Money."5. Under "Choose a Subtopic," select "Refund/Cancel a Payment."6. Click "Continue" and follow the instructions to refund payments.
Option 2. Money in your PayPal account will be held for 180 days. After 180days, we'll email you information on how to receive your funds.We regret any inconvenience this may cause.
It's so dissapointing, but of course I chose Option 1. However, again, there is no "Contact Customer Service"!!. I took me sometimes to figure out that should be "email us" section.
It can be understandable cares must be taken especially with countries which have many suspicious activities. But it is so disappointing since they just close a account with no clear reason. And the process was also confusing and annoying. I've had the most horrible experience I've ever had.
Well, thank you and farewell Paypal.
Thứ Bảy, 24 tháng 11, 2012
How to Redirect Mobile Users to Your Mobile Site using PHP
PHP mobile detection or JavaScript detection?
There are some considerations, the first one is you can use a client-side (javascript) or server-side redirection (PHP). Some people say that redirection using javascript is more accurate. However to me, loading the whole website until it redirect is a waste of time users and server resources, that's why I choose PHP redirection.The PHP mobile detection techniqe
The second consideration is how to detect if a user is on a device or not. Of course I wouldn't re-invented the wheel, I googled for several techniques out there. Basically, all detection code based on some global variables, notably $_SERVER['HTTP_USER_AGENT'], to determine if a request is from a mobile device or not. There are some way to check using regular expression, array checking or just regularly if-block. To determine which one is faster, I write a code to benchmark it. The code is somewhat like this:
$start_time=microtime_float();
if (is_mobile()){
echo '<br/> mobile';
}else{
echo '<br/> not mobile';
}
echo "<br/>".(microtime_float()-$start_time);
$start_time=microtime_float();
if (is_mobile1()){
echo '<br/> mobile';
}else{
echo '<br/> not mobile';
}
echo "<br/>".(microtime_float()-$start_time);
Where is_mobile is a function using normal if-block checking and is_mobile1 is a function regular expression technique. The out put of the program is as follows:So in generally, the first function perform about 2x faster than the second one. I adopt the function from Russell Beattie's blog with just few modification as follows:not mobile 8.1062316894531E-5 not mobile 0.00014901161193848
function is_mobile(){
$op = isset($_SERVER['HTTP_X_OPERAMINI_PHONE'])?1:'';
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
$ac = strtolower($_SERVER['HTTP_ACCEPT']);
if (strpos($ac, 'application/vnd.wap.xhtml+xml') !== false
|| $op != ''
|| strpos($ua, 'sony') !== false
|| strpos($ua, 'symbian') !== false
|| strpos($ua, 'nokia') !== false
|| strpos($ua, 'samsung') !== false
|| strpos($ua, 'mobile') !== false
|| strpos($ua, 'windows ce') !== false
|| strpos($ua, 'epoc') !== false
|| strpos($ua, 'opera mini') !== false
|| strpos($ua, 'nitro') !== false
|| strpos($ua, 'j2me') !== false
|| strpos($ua, 'midp-') !== false
|| strpos($ua, 'cldc-') !== false
|| strpos($ua, 'netfront') !== false
|| strpos($ua, 'mot') !== false
|| strpos($ua, 'up.browser') !== false
|| strpos($ua, 'up.link') !== false
|| strpos($ua, 'audiovox') !== false
|| strpos($ua, 'blackberry') !== false
|| strpos($ua, 'ericsson,') !== false
|| strpos($ua, 'panasonic') !== false
|| strpos($ua, 'philips') !== false
|| strpos($ua, 'sanyo') !== false
|| strpos($ua, 'sharp') !== false
|| strpos($ua, 'sie-') !== false
|| strpos($ua, 'portalmmm') !== false
|| strpos($ua, 'blazer') !== false
|| strpos($ua, 'avantgo') !== false
|| strpos($ua, 'danger') !== false
|| strpos($ua, 'palm') !== false
|| strpos($ua, 'series60') !== false
|| strpos($ua, 'palmsource') !== false
|| strpos($ua, 'pocketpc') !== false
|| strpos($ua, 'smartphone') !== false
|| strpos($ua, 'rover') !== false
|| strpos($ua, 'ipaq') !== false
|| strpos($ua, 'au-mic,') !== false
|| strpos($ua, 'alcatel') !== false
|| strpos($ua, 'ericy') !== false
|| strpos($ua, 'up.link') !== false
|| strpos($ua, 'vodafone/') !== false
|| strpos($ua, 'wap1.') !== false
|| strpos($ua, 'wap2.') !== false)
{return true;}
else{ return false;}
}
The redirection code
$arr = explode('.', $_SERVER['SERVER_NAME'], 2);
$sub=$arr[0];
$need_redirect=false;
if (!isset($_SERVER['HTTP_REFERER'])){
$need_redirect=true;
}else{
$domain = parse_url($_SERVER['HTTP_REFERER']);
$host = $domain['host'];
if (!preg_match('/romajidesu\.com/', $host)){
$need_redirect=true;
}
}
if ($need_redirect && ($sub!='m') && is_mobile() ){
$old_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$new_url='http://'.str_replace('www.', 'm.', $old_url);
header("Location:".$new_url);die();
}
Thứ Tư, 21 tháng 11, 2012
RomajiDesu mobile version 1.0
The design of the mobile version is much simpler and clearer to ensure best experience on smart phones and even tablets. It features a responsive design that automatically choose the appropriate font sizes for different resolutions.
Of course you can always switch back the the standard version anytime you want.
Thứ Tư, 10 tháng 10, 2012
Minor updates on RomajiDesu
- Improvement of look up speed thanks to caching mechanism.
- A social twitter button has been added, now you can share to your friends fast and easily.
- A Bookmarklet button is added, you drag the bookmarklet to your toolbar, select any word on any website, and click on it to look up the word.
It's almost two months since RomajiDesu version 2.0 has been officially launched. Since then, the traffic to Romajidesu has almost tripled from around 500 visits per day to 1400 visits per day. I am so happy today when I saw RomajiDesu appeared on a review on Lifehacker.jp. The article was announced by a lot of people which then immediately drew a lot of attention to the dictionary.
Thứ Bảy, 18 tháng 8, 2012
Romajidesu 2.0 has officially launched!
So what's new about the new version? The first innovation is the new English Japanese dictionary, the former dictionary result has been replaced by a much richer content with related words, relevant examples and a beautiful layout (Fig. 1). The performance also increases dramatically thanks to the intelligent caching.
| Figure 1. A sample result page |
A brand new Kanji dictionary has been included. The Kanji dictionary is empowered with an advanced Kanji search form and a multiple Kanji lookup methods. Without complicated input as other dictionary out there, here you can search for a Kanji directly, or by English meaning, or number of strokes, or a specific grade, etc. The result page will high-light popular (joujou) Kanji and put the English meaning there for you (Figure 2).
| Figure 2. A sample result page for Kanji Lookup. |
| Figure 3. A sample result page for Kanji Lookup. |
![]() | |
|
Chủ Nhật, 1 tháng 7, 2012
RomajiDesu Japanese dictionary - a major update
The most importance improvement is the inclusion of the large example sentence database of Tanaka Corpus.
To look for meaning of Japanese word and example sentences, you only need to type in a single input! And as before, you can type in Original Japanese, or Hiragana, or Romaji, or English!
The result page now may contains up to two tabs: Words (definition) and Sentences (examples contain the searched word). Each record of examples sentences is beautifully rendered with clickable word and hiragana pronunciation if available (Furigana style). You can click on "more" for more results also being loaded and displayed gracefully.
If you are a Japanese learner, you definitely should check out, for example, the meaning of love in Japanese.
Source: RomajiDesu.
Thứ Bảy, 30 tháng 6, 2012
About exporting/importing MySQL database via SSH
Step 1. Export A MySQL Database
It is a good idea to export your data as often as possible for backup or for moving data from localhost to server.From SSH or command shells, execute the following command:
mysqldump -u username -p database_name > dbname.sqlYou will be prompted for a password, type in the password for the username and press Enter. Replace username, password and database_name with your MySQL username, password and database name.
File dbname.sql now holds a backup of your database and is ready for download to your computer or upload to server. If you just want to backup a specific table, use this command:
mysqldump -u username -p database_name table_name > dbname.sqlOne more thing you can do is gzip the file to save the upload/download time, I find gzipping reduces the file size 6 times in my case. From SSH, execute the following command:
gzip dbname.sqlThe final file will has the form dbname.sql.gz
Step 2. Import A MySQL Database
In case you used gzipped file, you need to ungzip in as the importing file must be in .sql format. From SSH, navigate to the directory where your .gz file is and execute the following command:gunzip dbname.sql.gzWhen you have your .sql file, run this command:
mysql -p -u username database_name < file.sql
Thứ Năm, 7 tháng 6, 2012
Look up Japanese word on Romajidesu!
Romajidesu have just added an unique dictionary for looking up Japanese word. I am really happy with the simple, clear and effective interface of it. The cool thing about the dictionary is that you can type in Japanese words (Kanji/Hiragana/Katakana) or even Romaji and English to look up the meaning.
Check it about at English/Romaji Japanese dictionary and brave yourself for more cool stuffs to come!
Chủ Nhật, 22 tháng 4, 2012
RomajiDesu version 1.0b released
- Romaji to Hiragana: Basically you can type or copy Romaji (e.g. an Japanese song) to convert to Hiragana script. You can also translate it into English (I use Google translate engine). The translation of course is far from perfect, but sometimes it's useful to get the general meaning.
- Romaji to Katakana: Convert Romaji to Katakana, basically you just use to get the foreign words (like: hotel->hoteru->ホテル).
Thứ Năm, 17 tháng 2, 2011
Cài đặt Zendframework với Xampp trên windows XP
Cài đặt ZendFramework
- Cài XAMPP, vd dụ vào C:\xampp
- Giải nén zend framework vào trong thư mục cài đặt xampp, ví dụ: C:\xampp\php\ZendFramework-1.11.3
- Thêm vào biến môi trường Path của windows:
o C:\xampp\php";C:\xampp\php\ZendFramework-1.11.2\bin;
(Bằng cách chuột phải vào My Computer à Properties à Advanced à Enviroment Variables)
- Thêm vào php.ini:
o include_path = ".;C:\xampp\php\ZendFramework-1.11.3\library"
Lưu ý
- Không có dấu cách giữa các path
- Có thể cần xóa zf.bat cũ trong C:\xampp\php
Sử dụng công cụ zf.bat
Xem thông tin phiên bản, hướng dẫn sử dụng
Vào Start à Run: cmd,
zf show version
zf --help
Tạo project
Di chuyển đến thư mục của project, ví dụ:
cd C:\xampp\htdocs\projects\
Gõ lệnh
zf create project [tên thư mục project]
Ví dụ
zf create project funstir.com
Sẽ tạo cài đặt một nền tảng trống vào C:\xampp\htdocs\projects\funstir.com
Khi khởi động localhost, vào địa chỉ http://localhost/projects/funstir.com/public
Sẽ hiển ra trang chủ của project mới tạo









