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.

Thứ Bảy, 18 tháng 8, 2012

Romajidesu 2.0 has officially launched!

I am really happy to announce that RomajiDesu English Japanese dictionary version 2.0 has officially launched after several weeks of hard working! The new version is really a out-standing one with a lot of new features and stuffs which are optimized in terms of look-and-feel and performance.

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.

The Kanji Detail page is real deal with lots of useful information such as ON reading and KUN reading, related Japanese words and meanings,...and a nicely rendered stroke order diagram. (Fig. 3).

    Figure 3. A sample result page for Kanji Lookup. 

      Figure 4. A fast and useful methods of looking up Kanji by selecting multiple Kanji radicals 
    Last but not least, the Kanji dictionary includes a powerful Multiple Kanji radical lookup methods. The result page is also use the smart card display which include a short English discription (Fig. 4). So if you are a Japanese learner, check it out and I strongly believe that you will love it. But if you have any suggestion of how to improve the dictionary, please leave a comment here.

    P/S. The section Japanese to Romaji has been remove from the homepage temporarily because I want to improve it in terms of accuracy and performance. If you are capable of implement such thing, please contact me.

Chủ Nhật, 1 tháng 7, 2012

RomajiDesu Japanese dictionary - a major update

RomajiDesu website has been updated to a new version (1.1).

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

I used to use phpMyAdmin to do everything related to MySQL. However, now I am coding the website Romajidesu, which contains large dabase of Japanese dictionary with example sentences, importing/Exporting MySQL data using only phpMyAdmin alone seems to be very slow if not impossible. So here's the ways to do it (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.sql 
You 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.sql 
One 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.sql 
The 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.gz 
When 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!

To all Japanese language lovers! 
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

I am so excited to launch my latest website - RomajiDesu. It's is a free website which has several tools for assist Japanese learners. Currently (Version 1.0b), RomajiDesu has three tools:
  • 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->ホテル).

Developing it is a lot of fun because it combines two of my hobbies: programming and learning Japanese :)