Thứ Ba, 10 tháng 9, 2013

How to log MySQL slow queries

Since I upgraded mywebsite to VPS, I can analyse the slow queries by loggin them into a file without restarting mysql as follows:

# 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!

After three days upgrading, RomajiDesu Japanese dictionary is back on a new powerful VPS server. After one year, Romajidesu steady gain the trust from Japanese leaner community and the traffic reach approximately 3000 visits per days, or nearly 20000 page views per day. Another great upgrade of RomajiDesu before that is the website framework. The underline framework is also upgraded to a more powerful and extensible one, which cannot be seen from the surface.


Thứ Ba, 23 tháng 7, 2013

Audio pronuciation on RomajiDesu

If you are a frequent users of the RomajiDesu English - Japanese dictionary, you must have noticed the difference, there are a small speaker icons next to Kana definition of each dictionay entry. Click on that, and you will hear the audio pronunciation for the word. For example:
A sample search for "恋人" (Lover) using RomajiDesu dictionary
Have fun learning Japanese!

Thứ Năm, 28 tháng 2, 2013

Farewell Paypal, never see you ever again!

I opened my Paypal account in 2007 but haven't used it since then until recently we have a charity cause to help a friend who has a brain tumor. Our friends oversea offered help and I thought Paypal is a the best way for them to send money to help. I logged in to my Paypal account and got account verification. The verification itself was not comfortable because they seemed not to recognize the security number on my Visa debit card, so they charge $1.95 and I had to call my bank to get the verification code.

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

Recently, I've developed the mobile version of the English Japanese Dictionary with the subdomain m.romajidesu.com, now I want an effective way to redirect mobile users to mobile version.

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:
not mobile
8.1062316894531E-5
not mobile
0.00014901161193848
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:
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 

Now come to the fun part, which I haven't seen many people posted on the internet. What I want is, if a user visit www.romajidesu.com for the first time, he/she will be redirected to m.romajidesu.com, but if he/she somehow doesn't like the mobile version and go black to the standard website by click on the link on the bottom, he/she should not be redirected. The flowchart is somewhat as the image bellows
The following is the actually code, which can be included at the beginning of any page you want to be redirect automatically (of course you have to change the domain name)
$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

Finally RomajiDesu Japanese features a dedicated mobile version! When enter romajidesu.com on a mobile device, you will be redirected to the mobile version at (m.romajidesu.com). 

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

There are some minor updates to get to the version 2.1 today. Some updates includes:
- 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.