<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7731436080983282128</id><updated>2011-10-19T21:06:31.008+07:00</updated><category term='hack'/><category term='Free-Libre-OpenSource'/><category term='project-management-plan'/><category term='Web2.0-PageRank-SEO'/><category term='OperatingSystem'/><category term='Social-Career-SoftSkill'/><category term='economy'/><category term='top5'/><category term='Hardware-Device-HandHeld'/><category term='event'/><category term='Encode-Encrypt-Hash'/><category term='MySql-PostgreSql-SqLite'/><category term='Java-Groovy-Scala'/><category term='blog'/><category term='Interview'/><category term='OpenSource'/><category term='Lisp-Scheme-Arc'/><category term='Python-Ruby'/><category term='VietnameseCharacter'/><category term='Perl-PHP'/><category term='Flex-ActionScript-Flash'/><category term='JavaScript-CSS-DOM'/><category term='SoftwareEngineering'/><category term='SoftSkill'/><category term='top5-bestTool-performance'/><category term='coding'/><category term='OOP'/><category term='design'/><category term='performance'/><category term='C-Cpp'/><category term='Vietnamese'/><category term='fun'/><category term='Linux-BSD-Unix'/><category term='management'/><title type='text'>Mediocre Ninja webLog</title><subtitle type='html'>Some online notes (coding/OSS/hack) from a Ninja team</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default?start-index=101&amp;max-results=100'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>127</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1874761379216529928</id><published>2010-10-03T22:44:00.028+07:00</published><updated>2010-10-03T23:11:35.175+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><title type='text'>WebSphere no charge</title><content type='html'>IBM offers WebSphere Application Server "no-charge" edition (registration required): &lt;br /&gt;&lt;br /&gt;Version 6.1:&lt;br /&gt;&lt;a href="https://www14.software.ibm.com/webapp/iwm/web/reg/download.do?source=swg-wsasfd&amp;amp;S_TACT=109BH2HW&amp;amp;S_CMP=web_dw_rt_swd&amp;amp;lang=en_US&amp;amp;S_PKG=v61&amp;amp;cp=UTF-8&amp;amp;&amp;amp;dlmethod=http"&gt;https://www14.software.ibm.com/webapp/iwm/web/reg/download.do?source=swg-wsasfd&amp;amp;S_TACT=109BH2HW&amp;amp;S_CMP=web_dw_rt_swd&amp;amp;lang=en_US&amp;amp;S_PKG=v61&amp;amp;cp=UTF-8&amp;amp;&amp;amp;dlmethod=http&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Version 7.0:&lt;br /&gt;&lt;a href="https://www14.software.ibm.com/webapp/iwm/web/reg/download.do?source=swg-wsasfd&amp;amp;S_TACT=109BH2HW&amp;amp;S_CMP=web_dw_rt_swd&amp;amp;lang=en_US&amp;amp;S_PKG=v61&amp;amp;cp=UTF-8&amp;amp;&amp;amp;dlmethod=http"&gt;https://www14.software.ibm.com/webapp/iwm/web/reg/download.do?source=swg-wsasfd&amp;amp;S_TACT=109BH2HW&amp;amp;S_CMP=web_dw_rt_swd&amp;amp;lang=en_US&amp;amp;S_PKG=v61&amp;amp;cp=UTF-8&amp;amp;&amp;amp;dlmethod=http&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that this edition is not the "WAS Community Edition", which is basically the Apache Genorimo :-) .&lt;br /&gt;Actually, this edition is the new "Developer" edition. The old Developer edition is the "AE" edition, which can be consider "heavier" than the Base ("Express") edition, but "lighter" than Network Deployment ("AES") edition. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Đang lúc chán mấy tay Tomcat/JBoss giờ nghịch ngợm với Jetty, có thêm WAS sẽ fun lắm đây . Khoái nhất là có phiên bản Linux , khỏi phải đụng tới Windoze :)&lt;br /&gt;&lt;br /&gt;./.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1874761379216529928?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1874761379216529928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1874761379216529928' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1874761379216529928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1874761379216529928'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/10/websphere-no-charge.html' title='WebSphere no charge'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1276776464887911445</id><published>2010-09-17T09:53:00.000+07:00</published><updated>2010-09-17T09:53:41.605+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><title type='text'>GWTDesigner and WindowBuilder become free</title><content type='html'>Google rulz ! &lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.dzone.com/articles/instantiations-tools-free-all"&gt;http://java.dzone.com/articles/instantiations-tools-free-all&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java is not very good at UI design, especially desktop applications. But now it may become the past, since the best tools for it became free !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1276776464887911445?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1276776464887911445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1276776464887911445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1276776464887911445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1276776464887911445'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/09/gwtdesigner-and-windowbuilder-become.html' title='GWTDesigner and WindowBuilder become free'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8320255027393662870</id><published>2010-09-13T19:01:00.003+07:00</published><updated>2010-09-13T20:03:26.489+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Vietnamese typing on Linux</title><content type='html'>For the list of other platforms, please see my old post: &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/vietnamese-typing.html"&gt;Vietnamese typing&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This entry is mostly for Ubuntu Linux, yet it can be applied on other Debian-based distributions, and probably some RedHat-based distro too.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;X-unikey&lt;/b&gt; : (Phạm Kim Long) &lt;br /&gt;Download:&lt;br /&gt;&lt;a href="https://sites.google.com/site/quoc383011/x-unikey_1.0.4-5_i386.deb"&gt;https://sites.google.com/site/quoc383011/x-unikey_1.0.4-5_i386.deb&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://sites.google.com/site/wangjihoan/xvnkb-scim-unikey"&gt;http://sites.google.com/site/wangjihoan/xvnkb-scim-unikey&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Xvnkb&lt;/b&gt; : (Đào Hải Lâm) &lt;br /&gt;Download:&lt;br /&gt;&lt;a href="https://sites.google.com/site/quoc383011/xvnkb-0.2.9a-utf_i386.deb"&gt;https://sites.google.com/site/quoc383011/xvnkb-0.2.9a-utf_i386.deb&lt;/a&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/quoc383011/xvnkb_0.3-4ubuntu810_i386.deb"&gt;https://sites.google.com/site/quoc383011/xvnkb_0.3-4ubuntu810_i386.deb&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://wangji.hoan.googlepages.com/xvnkb-revisited"&gt;http://wangji.hoan.googlepages.com/xvnkb-revisited&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SCIM&lt;/b&gt;&lt;br /&gt;Download:&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://code.google.com/p/scim-unikey/"&gt;http://code.google.com/p/scim-unikey/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IBus&lt;/b&gt;&lt;br /&gt;Download:&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://code.google.com/p/ibus-unikey/"&gt;http://code.google.com/p/ibus-unikey/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's all (^o^) ,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8320255027393662870?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8320255027393662870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8320255027393662870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8320255027393662870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8320255027393662870'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/09/vietnamese-typing-on-linux.html' title='Vietnamese typing on Linux'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3119980903415211215</id><published>2010-07-31T10:59:00.000+07:00</published><updated>2010-07-31T10:59:41.012+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Recommended reading 4 developers</title><content type='html'>Besides the &lt;a href="http://mediocre-ninja.blogspot.com/2009/06/books-for-programmers.html"&gt;recommended books&lt;/a&gt;, there are also some interesting online articles I wish I had known them to talk to developers around me. Thus I would like to highlight some of those posts: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ericsink.com/No_Programmers.html"&gt;No Programmers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.techrepublic.com.com/10things/?p=262"&gt;10 types of programmers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://samizdat.mines.edu/howto/HowToBeAProgrammer.html#id2793056"&gt;How to be a Programmer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://joelonsoftware.com/articles/fog0000000332.html"&gt;Getting Things Done to be come invaluable&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scottberkun.com/essays/35-how-to-give-and-receive-criticism/"&gt;How to give and receive criticism&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fun to read, isn't it ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3119980903415211215?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3119980903415211215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3119980903415211215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3119980903415211215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3119980903415211215'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/07/recommended-reading-4-developers.html' title='Recommended reading 4 developers'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6118459193267034569</id><published>2010-07-07T19:20:00.003+07:00</published><updated>2010-07-07T20:40:56.219+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><title type='text'>Disable Vista services</title><content type='html'>ok, Windows Vista is a PITA (Pain In The Ass) ! Especially the "Ultimate" which has about 134 services running . Hey guys, this is serious, I'm not exaggerating at all. I don't care the stupidity or ambition of M$ guys, but the performance of Windows Vista is ridiculous, and they should fix it before the customers &lt;a href="http://idioms.tfd.com/vote+with+feet"&gt;vote with feet&lt;/a&gt;. &lt;br /&gt;(not kind of "fix" by requiring customer spends some hundred bucks to upgrade to Windows 8, though) &lt;br /&gt;&lt;br /&gt;Ok, before somebody helps us, we should try our best first ;-) . One of the &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/which-software-to-install-after-windows.html"&gt;first things I do when touching a Windows PC&lt;/a&gt; is to disable the services, and that surely &lt;a href="http://mediocre-ninja.blogspot.com/2010/03/cyber-station-experience.html"&gt;helps performance&lt;/a&gt;. Here are some services I recommend to change to "disabled" or "manual" : &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LV1: STUPIDITY&lt;/b&gt; (should be disabled ASAP)&lt;br /&gt;# Application Experience&lt;br /&gt;# Diagnostic Policy Service&lt;br /&gt;# Distributed Link Tracking Client&lt;br /&gt;# Function Discovery Resource Publication&lt;br /&gt;# IP Helper&lt;br /&gt;# Messenger Sharing Folders USN Journal Reader Service&lt;br /&gt;# Offline Files&lt;br /&gt;# Program Compatibility Assistant&lt;br /&gt;# Tablet PC Input Service&lt;br /&gt;# Web Client&lt;br /&gt;# Windows Defender&lt;br /&gt;# Windows Error Reporting Service&lt;br /&gt;# Windows Media Center Service Launcher&lt;br /&gt;# Windows Media Player Network Sharing Service&lt;br /&gt;# Windows Search&lt;br /&gt;# WinHTTP Web Proxy Auto-Discovery Service&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LV2: AMBITION&lt;/b&gt; (should be changed to "manual" ASAP)&lt;br /&gt;# IKE and AuthIP IPsec Keying Modules&lt;br /&gt;# IPsec Policy Agent&lt;br /&gt;# Network List Service&lt;br /&gt;# Portable Device Enumerator Service&lt;br /&gt;# Readyboost&lt;br /&gt;# Remote Access Connection&lt;br /&gt;# Shell Hardware Detection&lt;br /&gt;# Windows Driver Foundation - User-mode Driver Framework&lt;br /&gt;# Windows Image Acquisition (WIA)&lt;br /&gt;# Windows Update&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LV3: ARROGANCE&lt;/b&gt; (should be tweaked to "manual" or "disabled", YMMV)&lt;br /&gt;# Background Intelligent Transfer Service&lt;br /&gt;# Cryptographic Services&lt;br /&gt;# Human Interface Device Access&lt;br /&gt;# Network Location Awareness&lt;br /&gt;# Print Spooler&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Disclaimer: disable those services at your own risk !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;./.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6118459193267034569?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6118459193267034569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6118459193267034569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6118459193267034569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6118459193267034569'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/07/disable-vista-services.html' title='Disable Vista services'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6547428683296051883</id><published>2010-05-30T23:12:00.011+07:00</published><updated>2010-09-15T22:00:22.205+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Ubuntu Lucid Lynx</title><content type='html'>My upgrade from Hardy Heron (8.04) to &lt;a href="http://forum.ubuntu-vn.org/viewtopic.php?f=58&amp;t=9451"&gt;Lucid Lynx&lt;/a&gt; (10.04) went &lt;a href="http://tutroc77.blogspot.com/2010/05/toi-lam-gi-sau-khi-cai-ubuntu-1004-phan_10.html"&gt;smoothly on desktop&lt;/a&gt; PC, but on laptop there were some small issues. &lt;br /&gt;&lt;br /&gt;Here are 2 major issues then and how I solved them:&lt;br /&gt;&lt;br /&gt;1/ &lt;a href="http://www.quantrimang.com.vn/hedieuhanh/linux/60670_Khac-phuc-su-co-khoi-dong-Linux-voi-GRUB.aspx"&gt;Grub&lt;/a&gt; error: boot into text mode only, could not get GUI by &lt;b&gt;startx&lt;/b&gt; or &lt;b&gt;xstart&lt;/b&gt; command&lt;br /&gt;==&gt; SOLUTION STEPS: fix the &lt;a href="http://www.quantrimang.com.vn/hedieuhanh/linux/59706_Sua-loi-BootLoader-cho-Ubuntu.aspx"&gt;old grub&lt;/a&gt; (not grub2) &lt;b&gt;menu.lst&lt;/b&gt; (or edit boot menu directly)&lt;br /&gt;* Change root partition from by-uuid ("root=UUID=asdf...") to by-path ("root=/dev/sda7") &lt;br /&gt;* Change kernel version from old Hardy (2.6.14-19-generic) to new Lucid (2.6.32-22-generic)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ Sound error: could not hear sound, conflict sound system of YouTube/StarDict/VLC/MPlayer&lt;br /&gt;==&gt; SOLUTION STEPS: a little painful &lt;br /&gt;* Run &lt;b&gt;gnome-volume-control&lt;/b&gt; to uncheck "Mute" options, try changing sound theme (Ubuntu/NoSound/...)&lt;br /&gt;* Install &lt;b&gt;gnome-alsamixer&lt;/b&gt; or &lt;b&gt;pavu&lt;/b&gt;, adjust the options and volume&lt;br /&gt;* Resolve the &lt;i&gt;&lt;b&gt;libflashplayer.so&lt;/b&gt; location&lt;/i&gt; for Flash and &lt;i&gt;&lt;b&gt;libnpjp2.so&lt;/b&gt; location&lt;/i&gt; for Java RE.&lt;br /&gt;* For StarDict, use &lt;b&gt;aplay&lt;/b&gt; as command for playing sound files (usually in &lt;i&gt;/usr/share/WyabdcRealPeopleTTS/&lt;/i&gt; )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some minor issues may be possible:&lt;br /&gt;- (Gnome) combination (Alt+F2) does not work ==&gt; SOLUTION: enable the "Gnome compatibility" plugin in CompizConfig S Manager (&lt;b&gt;ccsm&lt;/b&gt;) &lt;br /&gt;- Postgresql 8.3 startup failed due to memory segmentation ==&gt; SOLUTION: open file &lt;b&gt;postgresql.conf&lt;/b&gt; in &lt;i&gt;/etc/postgresql/8.3/main/&lt;/i&gt; and reduce value of the variable &lt;i&gt;shared_buffers&lt;/i&gt; (for example 32M -&gt; 16M)&lt;br /&gt;- Some custom launchers' icons are changed ==&gt; SOLUTION: find alternatives in &lt;i&gt;/usr/share/pixmaps/&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6547428683296051883?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6547428683296051883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6547428683296051883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6547428683296051883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6547428683296051883'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/05/ubuntu-lucid-lynx.html' title='Ubuntu Lucid Lynx'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6970694259249477866</id><published>2010-03-11T21:50:00.004+07:00</published><updated>2010-04-05T23:31:45.770+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Y!M pager server</title><content type='html'>is down for Y!M 6.5 and prior versions:&lt;br /&gt;&lt;br /&gt;( &lt;a href="http://mediocre-ninja.blogspot.com/2009/06/pidgin-ym-connection.html"&gt;http://mediocre-ninja.blogspot.com/2009/06/pidgin-ym-connection.html&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;Compatible clients such as Pidgin and Kopete suffers, too. But if you upgrade to the recent versions, it should be fine.&lt;br /&gt;&lt;br /&gt;For pidgin (on Ubuntu), you need to &lt;a href="http://ubuntumanual.org/posts/240/install-or-upgrade-to-pidgin-2-6-1-in-ubuntu-jaunty-intrepid-hardy-the-easy-way"&gt;upgrade pidgin-data&lt;/a&gt; to 2.5.7+ to work with new Y!M protocol.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6970694259249477866?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6970694259249477866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6970694259249477866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6970694259249477866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6970694259249477866'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/03/ym-pager-server.html' title='Y!M pager server'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-227022896960586226</id><published>2010-03-09T18:01:00.001+07:00</published><updated>2010-07-07T20:41:59.829+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><title type='text'>Cyber Station experience</title><content type='html'>Some experience with Windows when consulting for a few Cyber Station sites. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;A. PARTITION HDD&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;B. REPLACE IE ON XP&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;by FireFox or Chrome.&lt;br /&gt;&lt;br /&gt;1/ Download Firefox/Chrome and some plugins (JRE, FlashPlayer, IETab)&lt;br /&gt;&lt;br /&gt;2/ Install Flash Player&lt;br /&gt;&lt;br /&gt;3/ Install JRE&lt;br /&gt;&lt;br /&gt;4/ Install Firefox/Chrome&lt;br /&gt;&lt;br /&gt;5/ Launch Firefox/Chrome, install IETab and configure it&lt;br /&gt;&lt;br /&gt;6/ Restart Firefox/Chrome, customize it (homepage, download, more plugins)  &lt;br /&gt;&lt;br /&gt;7/ Hide IE icon from desktop&lt;br /&gt;&lt;br /&gt;8/ Change IE icon in QuickLaunch bar to launch Firefox (but still use IE picture)&lt;br /&gt;&lt;br /&gt;9/ (rename the icon title to "Browser" and) Copy that "fake" icon to Desktop&lt;br /&gt;&lt;br /&gt;Done ! &lt;a href="http://mediocre-ninja.blogspot.com/2010/07/disable-vista-services.html"&gt;Bye bye&lt;/a&gt; IE 6 :-) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recently tested: &lt;br /&gt;* Firefox 2.0.20 + FlashPlayer 10.0.22 + JRE 1.6.0_07 ( + IETab 1.3)&lt;br /&gt;* Firefox 3.5.2 + FlashPlayer 10.0.45 + JRE 1.6.0_15 ( + IETab 1.5)&lt;br /&gt;* Chrome 4.x + FlashPlayer 10.0.45 + JRE 1.6.0_15 ( + IETab for Chrome)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-227022896960586226?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/227022896960586226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=227022896960586226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/227022896960586226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/227022896960586226'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/03/cyber-station-experience.html' title='Cyber Station experience'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6160016565973940299</id><published>2010-02-27T00:23:00.008+07:00</published><updated>2010-09-12T13:02:30.226+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><title type='text'>Shorten URL sites</title><content type='html'>So với các trang từ xưa như &lt;b&gt;tinyUrl.com&lt;/b&gt; hay &lt;b&gt;easyUri.com&lt;/b&gt; thì các trang mới vừa ngắn hơn, vừa giao diện đơn giản và ít Ads hơn :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thử nghiệm Mediocre-Ninja.blogSpot.com : (http://mediocre-ninja.blogspot.com)&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;a href="http://3.ly/IMDw"&gt;http://3.ly/IMDw&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tr.im/Q1od"&gt;http://tr.im/Q1od&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nn.nf/912b"&gt;http://nn.nf/912b&lt;/a&gt;&lt;br /&gt;&lt;a href="http://8byf.gu.ma"&gt;http://8byf.gu.ma&lt;/a&gt;&lt;br /&gt;&lt;a href="http://is.gd/9fJD3"&gt;http://is.gd/9fJD3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ow.ly/1bFm8"&gt;http://ow.ly/1bFm8&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sn.im/12t2u6"&gt;http://sn.im/12t2u6&lt;/a&gt;&lt;br /&gt;&lt;a href="http://smal.ly/1K2"&gt;http://smal.ly/1K2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://su.pr/31NNQU"&gt;http://su.pr/31NNQU&lt;/a&gt;&lt;br /&gt;&lt;a href="http://url.ie/57y0"&gt;http://url.ie/57y0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://go2.vg/7OkuF"&gt;http://go2.vg/7OkuF&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bit.ly/ckUrCp"&gt;http://bit.ly/ckUrCp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cli.gs/1NZ9PH"&gt;http://cli.gs/1NZ9PH&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pnt.me/x8qz0P"&gt;http://pnt.me/x8qz0P&lt;/a&gt;&lt;br /&gt;&lt;a href="http://yep.it/ms7xje"&gt;http://yep.it/ms7xje&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fly2.ws/wi51iNe"&gt;http://fly2.ws/wi51iNe&lt;/a&gt;&lt;br /&gt;&lt;a href="http://smal.ly/1K2"&gt;http://smal.ly/1K2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sova.in/3mh"&gt;http://sova.in/3mh&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nsfw.in/aab13f"&gt;http://nsfw.in/aab13f&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.x.se/brty"&gt;http://www.x.se/brty&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twurl.nl/gnzgo2"&gt;http://twurl.nl/gnzgo2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://adjix.com/xprh"&gt;http://adjix.com/xprh&lt;/a&gt;&lt;br /&gt;&lt;a href="http://snipurl.com/uj2i2"&gt;http://snipurl.com/uj2i2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://clockurl.com/Fi"&gt;http://clockurl.com/Fi&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;==== DEPRECATED (acquired by bit.ly or pending the service for various reasons)&lt;br /&gt;&lt;br /&gt;http://k.vu/dt&lt;br /&gt;http://j.mp/aw3E6y&lt;br /&gt;http://bt.gd/1zP&lt;br /&gt;http://kl.am/7OS3&lt;br /&gt;http://zi.ma/6f0425&lt;br /&gt;http://zud.me/1y&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Theo các bạn thì site nào là tốt nhất ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6160016565973940299?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6160016565973940299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6160016565973940299' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6160016565973940299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6160016565973940299'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/02/shorten-url-sites.html' title='Shorten URL sites'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2662324910488733103</id><published>2010-02-07T16:50:00.000+07:00</published><updated>2010-02-07T16:50:57.497+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftSkill'/><title type='text'>Presenting in English</title><content type='html'>18 things make you a better presenter, especially when presenting in English : &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1/ LEAVE NOTHING TO CHANCE &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ KNOW EXACTLY HOW TO START &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3/ GET STRAIGHT TO THE POINT &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4/ TALK TO YOUR AUDIENCE &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5/ KNOW WHAT WORKS &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6/ BE CONCISE &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;(to be continued)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2662324910488733103?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2662324910488733103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2662324910488733103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2662324910488733103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2662324910488733103'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/02/presenting-in-english.html' title='Presenting in English'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7480774298669856037</id><published>2009-12-15T23:06:00.004+07:00</published><updated>2009-12-26T23:34:08.191+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Xmarks for Chrome</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Lâu nay thằng FF 3 trên Ubuntu (lappy) cứ bị &lt;a href="http://mediocre-ninja.blogspot.com/2009/08/ubuntu-firefox-sucks.html"&gt;lỗi ì ạch&lt;/a&gt;, chuyển sang 3.5 vẫn chậm, 2.0 thì chạy được nhưng nhiều add-on ko compatible, thế là phải xài &lt;a href="http://www.konqueror.org/"&gt;Konqueror&lt;/a&gt; và &lt;a href="http://www.readwriteweb.com/archives/how_to_install_chrome_and_chromium_side-by-side.php"&gt;Chromium&lt;/a&gt; . &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Hai cái này xài được, chỉ vướng 2 chỗ là bookmark (Xmarks) và zoom. May quá bây giờ Google đã release &lt;a href="http://www.google.com.vn/chrome"&gt;Chrome&lt;/a&gt; bản chính thức cho Linux , không những chạy Flash phe phé, mà còn zoom khá hơn, và Xmarks cũng đã hỗ trợ :&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;a href="https://chrome.google.com/extensions/detail/ajpgkpeckebdhofmmjfgcjjiiejpodla"&gt;https://chrome.google.com/extensions/detail/ajpgkpeckebdhofmmjfgcjjiiejpodla&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;bye bye FireFox@lappy ! &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7480774298669856037?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7480774298669856037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7480774298669856037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7480774298669856037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7480774298669856037'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/12/xmarks-for-chrome.html' title='Xmarks for Chrome'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-359863252775610682</id><published>2009-10-18T11:33:00.004+07:00</published><updated>2010-09-12T13:09:28.224+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Smart technical Questions</title><content type='html'>If you want a technical support online, you should know how to ask properly: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;a href="http://newbielearnlinux.googlepages.com/smartquestions"&gt;http://newbielearnlinux.googlepages.com/SmartQuestions&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;(&lt;a href="http://sites.google.com/site/newbielearnlinux2/smartquestions"&gt;http://sites.google.com/site/newbielearnlinux2/SmartQuestions&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Warning&lt;/b&gt;: this style should NOT be applied when talking with girls, unless you are trying to dump her :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-359863252775610682?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/359863252775610682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=359863252775610682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/359863252775610682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/359863252775610682'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/10/smart-technical-questions.html' title='Smart technical Questions'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2568701762433702866</id><published>2009-09-07T22:17:00.056+07:00</published><updated>2010-10-02T11:42:25.924+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><title type='text'>Eclipse WTP Hotswap</title><content type='html'>One of the reason why &lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-2.html"&gt;JavaEE&lt;/a&gt; does not have many succesful projects is that its development time is usually longer than other competitors' time (PHP, Ruby, Python, ASP.NET, ...) . Ok, we all know the burden of overly &lt;a href="http://www.jroller.com/cpurdy/entry/the_seven_habits_of_highly2"&gt;complicated design&lt;/a&gt; and over-engineered implementations from Sun, so let's skip them and go to the one to be resolved: the Hot-Deploy time. In other words, the time for developers to see the web-page refreshed with their changes applied. &lt;br /&gt;&lt;br /&gt;The word "hot deploy" used above may not reflect its original meaning, not only because my poor English, but also because (Vietnamese) developers have different concepts of it: "automatic hot swap", "automatic redeploy webapp", "automatic restart container" .&lt;br /&gt;&lt;br /&gt;This is how I understand the differences:&lt;br /&gt;1/ Hot deploy container: automatic restart whole servlet container (Tomcat)&lt;br /&gt;2/ Hot deploy webapp: automatic reload context root and all classes of respective webapp.&lt;br /&gt;3/ Hot deploy classes: hot-swap only the re-compiled classes (runtime)&lt;br /&gt;It is obvious that #1 is slower than #2 and #2 is slower than #3: Hot-swap or hot-code replacing .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok, now what? Let's try to reduce the hot-deploy time in Java developement in the well-known combination: Eclipse + WTP plugins + Tomcat. Assumed that you already have an Eclipse with WTP/WST plugins installed (e.g. Eclipse JavaEE version).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create a New Server WTP for your web application&lt;/b&gt;&lt;br /&gt;From the New menu, select Other… -&gt; Server -&gt; Server. For your server type (probably "Apache Tomcat 6"), specify the path to your Tomcat installation directory, e.g. "/opt/apache-tomcat-6.0.18" or "D:\USR\apache-tomcat-6.0.18" . Add your web project as a 'Resource' to this server (you may modify the context root first).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adjust the server's settings&lt;/b&gt;&lt;br /&gt;Double click on the Server in your Server view (its name is something like "Tomcat v6.0 Server at localhost-config"), it will display the "Overview" tab:&lt;br /&gt;- Server location: Use Tomcat installation (actually, either "workspace metadata" or "custom location" can work as well, but let's use the most simple for beginners)&lt;br /&gt;- Port: modify the HTTP port from 8080 to the one you desire. You may also modify the remaining 2 ports respectively to avoid port conflicts between Tomcat instances.&lt;br /&gt;- Timeout: better increase them 100 or 200 seconds more.&lt;br /&gt;- Server options: not necessary to check any options.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Enable classes hot-swap&lt;/b&gt;&lt;br /&gt;Ok, the main settings for hot-deploy here:&lt;br /&gt;- Publishing: Auto publish when resources changes (to hot-deploy text resources like .properties, .html, .jsp, ... and packaged resources like .jar, .zip ) , the interval should be small (1 or 0 sec).&lt;br /&gt;- Switch to "Modules" tab, since you already added the web app to the server, there should be at least a "module" with the specified context root (path URL). Select that module, then click "Edit" button, uncheck the "Auto reloading enabled" checkbox, click OK. Now your module should have "Auto Reload" setting as &lt;b&gt;disabled&lt;/b&gt; (equivalence to &amp;lt;Context reloadable="false" ... /&amp;gt; in server.xml/context.xml of Tomcat)&lt;br /&gt;- Save the changes (at least make sure the two above has been applied already).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Start the server in Debug mode&lt;/b&gt;&lt;br /&gt;Once you started the web-app in Debug (right click -&gt; choose "Debug..."), Changes you make to your JSPs or inside Java methods will be instantly hotswapped into your running webapp, therefore reduce the development time (at least the wasted time looking at console when reloading web-app).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;br /&gt;Since Java 1.4.2 , the &lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/jpda/enhancements.html"&gt;JPDA supports hot-swap classes&lt;/a&gt; on debug mode, by manipulateing class loaders at runtime. Eclipse makes use of it via WTP under the name &lt;a href="http://wiki.eclipse.org/FAQ_What_is_hot_code_replace%3F"&gt;Hot Code Replace&lt;/a&gt; . Setting auto-publish helps replacing text files and recompiled jar, but not for classes. By default, Tomcat's context reloading will reload all classes using its class loaders and therefore does not take advantage of hot-deployed classes. &lt;br /&gt;Note that JPDA is not the best for hot code replacing, the number one here must be &lt;a href="http://www.zeroturnaround.com/jrebel/comparison/"&gt;JRebel&lt;/a&gt;. Some web frameworks (Tapestry, Stripes, Wicket, Grails, Roo) also has their own classloader handlings to support quick reload. They're all inspired by some standalone JAR files around which I don't remember (probably the pioneers for JRebel). And FYI, Tomcat Sysdeo plugin and Jetty can also support HCR , in case you don't want to use Tomcat WTP.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some more recommended settings&lt;/b&gt;&lt;br /&gt;Running Tomcat in Eclipse (via WTP plugin) is a bit slower than via external command, and running in Debug mode is somehow resource-hogging, which may result in errors like hot-swap failure or OutOfMemoryError . To avoid those issues, you may try some JVM options via Tomcat JRE params: Double-click on your server in the "Servers" view, switch to the "Overview" tab, click on the "Open launch configuration" link, switch to the Arguments tab; there you can add relevant memory settings to the "VM Arguments" section &lt;br /&gt;&lt;i&gt;-client -Djava.awt.headless=true&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-Xmx1024m&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-Xms512m&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-XX:MaxPermSize=1024m&lt;/i&gt;&lt;br /&gt;&lt;i&gt;-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Limitations&lt;/b&gt;&lt;br /&gt;JPDA HCR not applied: to change the signature of a class (add/remove methods or fields) or to add new classes on the fly. Additionally, some method calls (“stack frames”) can’t be modified, including the main method or any method invoked via reflection, that is, by using java.lang.reflect.Method.invoke().&lt;br /&gt;(JRebel can overcome those limitations)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Good luck &amp; have fun :-) ,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;./.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2568701762433702866?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2568701762433702866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2568701762433702866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2568701762433702866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2568701762433702866'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/09/eclipse-wtp-hotswap.html' title='Eclipse WTP Hotswap'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6331899188708563139</id><published>2009-09-01T10:20:00.002+07:00</published><updated>2010-04-18T11:36:09.351+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Maven Archetype quick notes</title><content type='html'>&lt;a href="http://maven.apache.org/archetype/maven-archetype-plugin/"&gt;maven-archetype-plugin&lt;/a&gt; allows the user to create a Maven 2 project from an existing template caled an &lt;b&gt;archetype&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;If you just use an IDE to generate Maven project, you can be familiar with default project structure of Maven:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's consider an example using it to create a "todo-list" project which contains 2 sub-projects: todo-core and todo-web&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-quote&gt;cd workspace&lt;br /&gt;&lt;br /&gt;mkdir -p todo-list&lt;br /&gt;&lt;br /&gt;cd todo-list&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Old-fashioned way:&lt;br /&gt;&lt;div class=ninja-quote&gt;mvn archetype:create -DartifactId=todo-core -DgroupId=org.vnoss&lt;br /&gt;&lt;br /&gt;mvn archetype:create -DartifactId=todo-web -DgroupId=org.vnoss -DarchetypeArtifactId=maven-archetype-webapp&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;New way:&lt;br /&gt;&lt;div class=ninja-quote&gt;mvn archetype:generate&lt;br /&gt;&lt;br /&gt;mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now we can edit the pom.xml to get desired result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6331899188708563139?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6331899188708563139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6331899188708563139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6331899188708563139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6331899188708563139'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2010/04/maven-archetype-quick-notes.html' title='Maven Archetype quick notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-9200195458971686729</id><published>2009-08-17T21:10:00.004+07:00</published><updated>2009-09-07T22:22:36.574+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Gnome theme collection</title><content type='html'>&lt;span class="post_text"&gt;Some nice themes for GNOME (mostly Ubuntu) on gnome-look.org .&lt;br /&gt;Download and install what you like the most !&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://www.techiesouls.com/wp-content/uploads/2008/11/untitled.jpg"&gt;&lt;img class="alignnone size-thumbnail wp-image-781" title="untitled" src="http://www.techiesouls.com/wp-content/uploads/2008/11/untitled-150x150.jpg" alt="untitled 150x150 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="150" width="150" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;(&lt;span style="color: rgb(255, 0, 0);"&gt;you have to click on thumbnails to view larger image of screenshot&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/93022-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme_1" src="http://www.techiesouls.com/wp-content/uploads/2008/11/93022-1.jpg" alt="93022 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Progex+Official+Themes?content=93022" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/92992-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme_3" src="http://www.techiesouls.com/wp-content/uploads/2008/11/92992-1.jpg" alt="92992 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Dust+Cold?content=92992" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/92795-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/92795-1.jpg" alt="92795 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/UbuntuBlueMod?content=92795" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/92681-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/92681-1.jpg" alt="92681 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Dust+Mac?content=92681" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/91399-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/91399-1.jpg" alt="91399 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/xl_Monochrome?content=91399" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/89831-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/89831-1.jpg" alt="89831 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Mira?content=89831" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/86844-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/86844-1.jpg" alt="86844 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/willibex?content=86844" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/86717-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/86717-2.jpg" alt="86717 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Shiki-Colors?content=86717" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/86653-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/86653-1.jpg" alt="86653 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="325" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/KDE4+Oxygen+new+port+for+GNOME?content=86653" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/86048-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/86048-1.jpg" alt="86048 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Raptor+%28Slickness+remix%29?content=86048" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/85765-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/85765-1.jpg" alt="85765 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="450" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Carbonfibre?content=85765" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/85477-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/85477-1.jpg" alt="85477 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/GrayWin?content=85477" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/79463-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/79463-1.jpg" alt="79463 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/TechniX?content=79463" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/78633-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/78633-1.jpg" alt="78633 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/BlueSpace+II?content=78633" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/78410-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/78410-1.jpg" alt="78410 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/XNTricity?content=78410" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/77747-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/77747-2.jpg" alt="77747 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Moomex-Ultimatum?content=77747" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/81214-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/81214-1.jpg" alt="81214 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Aurora+E17-Detour?content=81214" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/77642-1.jpeg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/77642-1.jpg" alt="77642 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Shiftie+Black?content=77642" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/74813-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/74813-1.jpg" alt="74813 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Overglossed?content=74813" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/74553-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/74553-1.jpg" alt="74553 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Elegant+Brit?content=74553" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/74374-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/74374-1.jpg" alt="74374 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="288" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/StudioLooks?content=74374" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/72479-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/72479-1.jpg" alt="72479 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="312" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Sandwich+Gtk+and+Emerald?content=72479" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/72003-2.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/72003-2.jpg" alt="72003 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Blue-Junior0.9-9?content=72003" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/71999-1.jpeg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/71999-1.jpg" alt="71999 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="300" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Mac4Lin+ver.0.4+GTK+Metacity+Theme?content=71999" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/71481-2.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/71481-2.jpg" alt="71481 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Tehks_Silver-Blue-Graphite?content=71481" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/71398-1.jpeg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/71398-1.jpg" alt="71398 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Murrina+Inspirat?content=71398" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/93000-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme_2" src="http://www.techiesouls.com/wp-content/uploads/2008/11/93000-1.jpg" alt="93000 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Conte+Murrina?content=93000" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/80431-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/80431-2.jpg" alt="80431 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Aurora+Smooth?content=80431" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/70893-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/70893-2.jpg" alt="70893 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Glasa+%2B+Glasa-Pro?content=70893" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/70264-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/70264-1.jpg" alt="70264 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/ClearlooksMetallico?content=70264" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/69913-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/69913-2.jpg" alt="69913 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/gommapiuma+looks+%28gummina+mod%29?content=69913" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/69886-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/69886-1.jpg" alt="69886 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="300" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Dark+Ice?content=69886" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/69315-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/69315-1.jpg" alt="69315 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Creamy?content=69315" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/69263-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/69263-1.jpg" alt="69263 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Neon?content=69263" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre3/69165-3.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/69165-3.jpg" alt="69165 3 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="300" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Murrina+Personal?content=69165" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/67866-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/67866-1.jpg" alt="67866 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Royalty?content=67866" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/67854-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/67854-1.jpg" alt="67854 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Soffice?content=67854" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/67813-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/67813-1.jpg" alt="67813 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/gommapiuma+looks+%28gummina+mod%29?content=69913" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/64953-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/64953-1.jpg" alt="64953 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Laza+Theme+Pack?content=64953" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/63623-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/63623-1.jpg" alt="63623 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Murrina+Dreamy?content=63623" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/63246-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/63246-1.jpg" alt="63246 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/GAIA?content=63246" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/62968-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/62968-2.jpg" alt="62968 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/White%3F%21?content=62968" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/62434-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/62434-1.jpg" alt="62434 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/OrangeLiNstaBlackPlastic?content=62434" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/56438-1.png" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/56438-1.jpg" alt="56438 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="300" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Aurora+Gtk+Engine?content=56438" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/55876-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/55876-1.jpg" alt="55876 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Reuben?content=55876" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/55578-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/55578-2.jpg" alt="55578 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Schwermetall?content=55578" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/44495-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/44495-1.jpg" alt="44495 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Elegance?content=44495" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre2/42755-2.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/42755-2.jpg" alt="42755 2 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="320" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Murrine+GTK2+Cairo+Engine?content=42755" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/93096-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/93096-1.jpg" alt="93096 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Murrina+Smoothie+and+Latte?content=93096" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;/div&gt;&lt;p style="text-align: justify; font-family: arial;"&gt; &lt;/p&gt;&lt;p style="text-align: justify; font-family: arial;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/CONTENT/content-pre1/57063-1.jpg" target="_blank"&gt;&lt;img class="alignnone" title="ubuntu_theme" src="http://www.techiesouls.com/wp-content/uploads/2008/11/57063-1.jpg" alt="57063 1 Collection of 50 Best Looking Linux Gnome/Ubuntu Themes" height="250" width="400" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;div style="text-align: justify; font-family: arial;"&gt; &lt;span style="font-size: 100%;"&gt;&lt;a href="http://gnome-look.org/content/show.php/Moomex-Theme?content=57063" target="_blank"&gt;Download Theme&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;   &lt;div class="postline"&gt; &lt;div class="postline_pad"&gt; &lt;span class="post_bottom_text"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HAVE FUN !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;/span&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-9200195458971686729?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/9200195458971686729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=9200195458971686729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9200195458971686729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9200195458971686729'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/08/gnome-theme-collection.html' title='Gnome theme collection'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-9133873220075684668</id><published>2009-08-11T21:24:00.004+07:00</published><updated>2009-09-02T12:31:49.517+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><title type='text'>VMware acquired SpringSource</title><content type='html'>VMware &lt;a href="http://blogs.vmware.com/console/2009/08/vmware-acquires-springsource.html"&gt;announced&lt;/a&gt; they have acquired SpringSource for a mix of approximately $362 million in cash and equity plus the assumption of approximately $58 million of unvested stock and options.&lt;br /&gt;&lt;br /&gt;$420 millions! Good news !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-9133873220075684668?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/9133873220075684668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=9133873220075684668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9133873220075684668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9133873220075684668'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/08/vmware-acquired-springsource.html' title='VMware acquired SpringSource'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2519566581022683082</id><published>2009-08-08T10:38:00.009+07:00</published><updated>2010-01-09T00:24:37.538+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql-PostgreSql-SqLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Ubuntu Firefox sucks?</title><content type='html'>Firefox on Ubuntu seems to have slower performance than on other OSes. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Symptoms: &lt;br /&gt;- slow on page with flash, or hang when scroll fast, or unbearable slow (invoking CD-ROM) when type in address bar, especially on "backspace" key, ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AFAIK, there are 3 major causes: &lt;br /&gt;- FF's database SQLite becomes big and defragmented&lt;br /&gt;- weak graphic card (usually on laptop)&lt;br /&gt;- IPv6 is higher priority than IPv4 in FF by default.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recommended work-arounds: &lt;br /&gt;- change Visual Effects to "None"&lt;br /&gt;- disable IPv6 in "about:config"&lt;br /&gt;- clean up SQLite unused entries: first, install sqlite3 client&lt;b&gt;&lt;br /&gt;sudo apt-get install sqlite3&lt;br /&gt;&lt;/b&gt; then enter these commands &lt;b&gt;&lt;br /&gt;find ~/.mozilla -type f -name "*.sqlite" -exec sqlite3 ‘{}’ VACUUM \;&lt;br /&gt;find ~/.mozilla -type f -name "*.sqlite" -exec sqlite3 ‘{}’ REINDEX \;&lt;br /&gt;&lt;/b&gt; or use these commands instead &lt;b&gt;&lt;br /&gt;for i in ~/.mozilla/firefox*/*/*.sqlite; do sqlite3 $i vacuum; done;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Alternative browsers: &lt;br /&gt;&lt;br /&gt;+ Google Chrome for Linux&lt;br /&gt;( &lt;a href="http://www.google.com/chrome?platform=linux"&gt;http://www.google.com/chrome?platform=linux&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;+ Konqueror&lt;br /&gt;( sudo apt-get install konqueror )&lt;br /&gt;&lt;br /&gt;+ Chromium (Ubuntu)&lt;br /&gt;&lt;a href="http://ubuntugeek.com/install-chromium-google-chrome-web-browser-in-ubuntu.html"&gt;http://ubuntugeek.com/install-chromium-google-chrome-web-browser-in-ubuntu.html&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2519566581022683082?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2519566581022683082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2519566581022683082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2519566581022683082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2519566581022683082'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/08/ubuntu-firefox-sucks.html' title='Ubuntu Firefox sucks?'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2096902608900098623</id><published>2009-06-26T23:14:00.002+07:00</published><updated>2009-08-16T23:00:15.057+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Some OSS manual in Vietnamese</title><content type='html'>Một số tài liệu được biên soạn bởi văn phòng Công Nghệ Thông Tin, thuộc Bộ Khoa học và Công nghệ :&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;img id="ncode_imageresizer_container_1" src="http://hanoi.centre-linux.org/IMG/jpg/TL_Writer_KHCN_bia.jpg" style="" alt="Cover%20Writer%20Manual%20%28JPEG%29" onload="NcodeImageResizer.createOn(this);" width="100" border="0" height="134" /&gt;&lt;br /&gt;Tài liệu hướng dẫn sử dụng phần mềm Soạn thảo văn bản OpenOffice.org Writer, phiên bản 3.0&lt;br /&gt;(&lt;a href="http://hanoi.centre-linux.org/IMG/pdf/HDSD_Writer_V3.0.pdf" target="_blank"&gt;hanoi.centre-linux.org/IMG/pdf/HDSD_Writer_V3.0.pdf – 2,5 MB&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;img id="ncode_imageresizer_container_2" src="http://hanoi.centre-linux.org/IMG/jpg/TL_Calc_KHCN_bia.jpg" style="" alt="Cover%20calc%20manual%20%28JPEG%29" onload="NcodeImageResizer.createOn(this);" width="100" border="0" height="135" /&gt;&lt;br /&gt;Tài liệu hướng dẫn sử dụng phần mềm bảng tính điện tử OpenOffice.org Calc, phiên bản 3.0&lt;br /&gt;(&lt;a href="http://hanoi.centre-linux.org/IMG/pdf/HDSD_Calc_V3.0.pdf" target="_blank"&gt;hanoi.centre-linux.org/IMG/pdf/HDSD_Calc_V3.0.pdf – 1,6 MB&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;img id="ncode_imageresizer_container_3" src="http://hanoi.centre-linux.org/IMG/jpg/TL_Impress_KHCN_bia.jpg" style="" alt="%3c28JPEG%3c29" onload="NcodeImageResizer.createOn(this);" width="100" border="0" height="135" /&gt;&lt;br /&gt;Tài liệu hướng dẫn sử dụng phần mềm trình diễn hội thảo OpenOffice.org Impress, phiên bản 3.0&lt;br /&gt;(&lt;a href="http://hanoi.centre-linux.org/IMG/pdf/HDSD_Impress_V3.0.pdf" target="_blank"&gt;http://hanoi.centre-linux.org/IMG/pdf/HDSD_Impress_V3.0.pdf – 3,4 MB&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;img id="ncode_imageresizer_container_4" src="http://hanoi.centre-linux.org/IMG/jpg/TL_ThunderFirefoxUnikey_KHCN_bia.jpg" style="" alt="%3c28JPEG%3c29" onload="NcodeImageResizer.createOn(this);" width="100" border="0" height="137" /&gt;&lt;br /&gt;Tài liệu hướng dẫn sử dụng phần mềm Mozilla Thunderbird phiên bản 2.0, Mozilla Firefox phiên bản 3.0, Unikey phiên bản 4.0&lt;br /&gt;(&lt;a href="http://hanoi.centre-linux.org/IMG/pdf/HDSD_Thunderbird_Firefox_UniKey_V3.0.pdf" target="_blank"&gt;hanoi.centre-linux.org/IMG/pdf/HDSD_Thunderbird_Firefox_UniKey_V3.0.pdf – 4,3 MB&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;img id="ncode_imageresizer_container_5" src="http://hanoi.centre-linux.org/IMG/jpg/TL_Ubuntu_KHCN_bia.jpg" style="" alt="%3c28JPEG%3c29" onload="NcodeImageResizer.createOn(this);" width="100" border="0" height="133" /&gt;&lt;br /&gt;Tài liệu hướng dẫn sử dụng và cài đặt Ubuntu (8.04) cho máy trạm.&lt;br /&gt;&lt;a href="http://hanoi.centre-linux.org/IMG/pdf/Ubuntu_20090703.pdf"&gt;hanoi.centre-linux.org/IMG/pdf/Ubuntu_20090703.pdf - 10 MB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comment: Chuyện &lt;a href="http://english.vietnamnet.vn/tech/2009/01/822425/"&gt;sử dụng phần mềm mã mở trong chính phủ&lt;/a&gt; vẫn thuộc dạng mà Mediocre-Ninja &lt;a href="http://linux.slashdot.org/comments.pl?sid=1083791"&gt;nghi ngờ&lt;/a&gt; về mức độ hiệu quả, nhưng coi bộ lần này các bác làm nghiêm túc hơn nhiều so với &lt;a href="http://www.laodong.com.vn/Home/De-an-112-Nang-gia-hop-dong-huong-chenh-lech-trai-phap-luat-nhieu-ti-dong/20079/55426.laodong"&gt;Đề&lt;/a&gt; &lt;a href="http://www.thanhnien.com.vn/2007/Pages/200737/208683.aspx"&gt;án&lt;/a&gt; &lt;a href="http://www.tuoitre.com.vn/Tianyon/Index.aspx?ArticleID=233507&amp;ChannelID=6"&gt;112&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun (^o^) !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2096902608900098623?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2096902608900098623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2096902608900098623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2096902608900098623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2096902608900098623'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/06/some-oss-manual-in-vietnamese.html' title='Some OSS manual in Vietnamese'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7516815502083958502</id><published>2009-06-20T22:16:00.005+07:00</published><updated>2009-08-08T11:01:06.471+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl-PHP'/><title type='text'>Eclipse NetBeans PHP</title><content type='html'>&lt;b&gt;Eclipse 3.5&lt;/b&gt; (Galileo) &lt;a href="http://eclipsesource.com/blogs/2009/06/24/eclipse-galileo-feature-top-10-list-number-1/"&gt;new&lt;/a&gt; features: &lt;br /&gt;&lt;a href="http://www.infoq.com/news/2009/06/galileo"&gt;http://infoq.com/news/2009/06/galileo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   1.  P2 provisioning which provides for a more efficient update process for Eclipse&lt;br /&gt;   2. OSGi Declarative Services, which allow OSGi services to be configured and installed based on XML prior to the start of the bundle's service&lt;br /&gt;   3. Improved target platform management, which allows the runtime platform to be configured easier&lt;br /&gt;   4. Mylyn WikiText, which can be used to edit bugs via Mylyn or transform into other documentation formats like DocBook&lt;br /&gt;   5. The addition of the Eclipse Memory Analyser, which can analyse the JVM's heap usage&lt;br /&gt;   6. Install into Self, which allows plugins to be developed and installed into the currently running Eclipse platform&lt;br /&gt;   7. Eclipse Modeling Project refinements, which reduces the size of the EMF runtime requirements&lt;br /&gt;   8. Improved RAP styles to allow your RAP based application to be customised&lt;br /&gt;   9. Enhanced JAvaScript bridge, which allows embedding of widgets like Google Maps into an SWT browser&lt;br /&gt;  10. Java compare editor enhancements which allow JavaDoc hovers, hyperlinking and other goodness from the compare page&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NetBeans 6.7&lt;/b&gt; &lt;a href="http://netbeans.dzone.com/news/whats-new-netbeans-platform-67"&gt;new&lt;/a&gt; &lt;a href="http://wiki.netbeans.org/NewAndNoteworthyMilestone2NB67"&gt;features&lt;/a&gt;:&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/NewAndNoteWorthyNB67"&gt;http://wiki.netbeans.org/NewAndNoteWorthyNB67&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PHP 5.3&lt;/b&gt; new features:&lt;br /&gt;&lt;a href="http://vn.php.net/releases/5_3_0.php"&gt;http://vn.php.net/releases/5_3_0.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7516815502083958502?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7516815502083958502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7516815502083958502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7516815502083958502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7516815502083958502'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/06/eclipse-netbeans-php.html' title='Eclipse NetBeans PHP'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3259535362624113678</id><published>2009-06-15T21:20:00.021+07:00</published><updated>2010-10-02T18:29:58.095+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>VN opensource sites</title><content type='html'>Some Vietnamese websites for &lt;b&gt;OSS and Linux/Unix&lt;/b&gt; fan:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.ubuntu-vn.org/"&gt;http://forum.ubuntu-vn.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://diendanlinux.org/"&gt;http://diendanlinux.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forum.vnoss.org/"&gt;http://forum.vnoss.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://viettug.org/"&gt;http://viettug.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vnlinux.org/"&gt;http://vnlinux.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://opensource.com.vn/"&gt;http://opensource.com.vn&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ubuntut.com/"&gt;http://ubuntut.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tapchilinux.com/"&gt;http://tapchilinux.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tapchifc.pbworks.com/"&gt;http://tapchifc.pbworks.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://saigonlinux.org/"&gt;http://saigonlinux.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://saigonlug.org/"&gt;http://saigonlug.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hanoilug.org/"&gt;http://hanoilug.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hanoi.centre-linux.org/"&gt;http://hanoi.centre-linux.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://foss.vn/"&gt;http://foss.vn&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vi.openoffice.org/"&gt;http://vi.openoffice.org&lt;/a&gt; (http://openoffice.vn)&lt;br /&gt;&lt;a href="http://asianuxvietnam.vn/"&gt;http://asianuxvietnam.vn&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hacao.com/"&gt;http://hacao.com&lt;/a&gt;&lt;br /&gt;&lt;a href=""&gt;. . .&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also some well-known blogs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://saylinux.wordpress.com/"&gt;http://saylinux.wordpress.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://zxc232.wordpress.com/"&gt;http://zxc232.wordpress.com&lt;/a&gt; (http://zxc232.blogspot.com/)&lt;br /&gt;&lt;a href="http://blog.iwayvietnam.com/tuanta/"&gt;http://blog.iwayvietnam.com/tuanta&lt;/a&gt;&lt;br /&gt;&lt;a href="http://linuxwhoami.blogspot.com/"&gt;http://linuxwhoami.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://projektantos.wordpress.com/"&gt;http://projektantos.wordpress.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kythuatmaytinh.wordpress.com/"&gt;http://kythuatmaytinh.wordpress.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vnfoss.blogspot.com/"&gt;http://vnfoss.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tutroc77.blogspot.com/"&gt;http://tutroc77.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nguyentieuhau.com/"&gt;http://nguyentieuhau.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/otaku_2r/"&gt;http://my.opera.com/otaku_2r&lt;/a&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/buiquanghuylinux/"&gt;http://my.opera.com/buiquanghuylinux&lt;/a&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/trangtinh/"&gt;http://my.opera.com/trangtinh&lt;/a&gt;&lt;br /&gt;&lt;a href=""&gt;. . .&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More personal sites: (less known than above)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mediocre-ninja.blogspot.com/"&gt;http://mediocre-ninja.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://silverhat.wordpress.com/"&gt;http://silverhat.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vinux.sourceforge.net/"&gt;http://vinux.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tuyetkiem.wordpress.com/"&gt;http://tuyetkiem.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://xelnaga.wordpress.com/"&gt;http://xelnaga.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hoangtran.wordpress.com/"&gt;http://hoangtran.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://moriator.wordpress.com/"&gt;http://moriator.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/chuyenmt/"&gt;http://my.opera.com/chuyenmt/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.openandfree.org/blog/"&gt;http://www.openandfree.org/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hapm.info/"&gt;http://hapm.info/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ngohaibac.net/"&gt;http://ngohaibac.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://viet94.wordpress.com/"&gt;http://viet94.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://binkun-linux.blogspot.com/"&gt;http://binkun-linux.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nguyendinhtrung.wordpress.com/"&gt;http://nguyendinhtrung.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://my.opera.com/hautp/"&gt;http://my.opera.com/hautp/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://phamkhoa.wordpress.com/"&gt;http://phamkhoa.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.manguonmo.vn/"&gt;http://www.manguonmo.vn/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.saigonnezumi.com/"&gt;http://www.saigonnezumi.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.saigonnezumi.com/bloggers-in-vietnam/"&gt;More . . .&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Extras:&lt;br /&gt;&lt;a href="http://www.quantrimang.com.vn/hedieuhanh/linux/index.aspx"&gt;http://www.quantrimang.com.vn/hedieuhanh/linux/index.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vinasupport.com/blog/index.php/category/os/linux/"&gt;http://vinasupport.com/blog/index.php/category/os/linux/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thegioimang.org/linux/"&gt;http://thegioimang.org/linux/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.vn-zoom.com/f316/"&gt;http://www.vn-zoom.com/f316/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.manguonmo.vn/"&gt;http://www.manguonmo.vn/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://baiviet.phanvien.com/subcat/1/he-dieu-hanh-khac.html"&gt;http://baiviet.phanvien.com/subcat/1/he-dieu-hanh-khac.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eda.vn/forum/viewforum.php?f=3"&gt;http://www.eda.vn/forum/viewforum.php?f=3&lt;/a&gt;&lt;br /&gt;&lt;a href=""&gt;. . .&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you want to enlist your OSS website/blog here, feel free to tell me (via comments or email/Twitter/Facebook/etc) &lt;br /&gt;&lt;br /&gt;Cheers :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3259535362624113678?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3259535362624113678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3259535362624113678' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3259535362624113678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3259535362624113678'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/06/vn-opensource-sites.html' title='VN opensource sites'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7290783571431307591</id><published>2009-06-09T23:17:00.007+07:00</published><updated>2010-03-21T11:01:57.569+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><title type='text'>Pidgin Y!M connection</title><content type='html'>Sometimes the Y!M pager server is down for maintenance. Therefore Pidgin clients encounter connection problem. &lt;br /&gt;&lt;br /&gt;You may fix it simply by changing the pager server settings: &lt;br /&gt;(Account -&amp;gt; Manage -&amp;gt; -&gt; [Y!M account] -&gt; Modify -&amp;gt; Advance)&lt;br /&gt;&lt;br /&gt;default: &lt;b&gt;scs.msg.yahoo.com&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;change to: &lt;b&gt;cn.scs.msg.yahoo.com&lt;/b&gt; (66.163.181.166) &lt;br /&gt;&lt;br /&gt;(&lt;br /&gt;or: &lt;b&gt;cs101.msg.cnb.yahoo.com&lt;/b&gt; (202.165.100.160)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S: &lt;b&gt;Kopete&lt;/b&gt; or &lt;b&gt;Empathy&lt;/b&gt; clients issue can be fixed in a similar way, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7290783571431307591?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7290783571431307591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7290783571431307591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7290783571431307591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7290783571431307591'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/06/pidgin-ym-connection.html' title='Pidgin Y!M connection'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1282176514408564458</id><published>2009-06-02T21:19:00.007+07:00</published><updated>2010-07-31T10:40:58.842+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Books for programmers</title><content type='html'>Top 10 of books (recommended by me ^^ ) :&lt;br /&gt;&lt;b&gt;&lt;br /&gt;1/ How to Win Friends and Influence People &lt;br /&gt;&lt;br /&gt;2/ The pragmatic programmer &lt;br /&gt;&lt;br /&gt;3/ Peopleware &lt;br /&gt;&lt;br /&gt;4/ Mythical Man Month &lt;br /&gt;&lt;br /&gt;5/ Coder To Developer &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6/ Don't make me think &lt;br /&gt;&lt;br /&gt;7/ The productive programmer &lt;br /&gt;&lt;br /&gt;8/ Facts and Fallacies &lt;br /&gt;&lt;br /&gt;9/ Code Complete 2 &lt;br /&gt;&lt;br /&gt;10/ Getting Real &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Runner-up:&lt;br /&gt;&lt;br /&gt;- Designing the Obvious&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Honorable mentions: &lt;br /&gt;&lt;br /&gt;- Introduction to Algorithms &lt;br /&gt;&lt;br /&gt;- Dragon Book &lt;br /&gt;&lt;br /&gt;- Rapid Development &lt;br /&gt;&lt;br /&gt;- Design Patterns GoF &lt;br /&gt;&lt;br /&gt;- Applying UML &lt;br /&gt;&lt;br /&gt;- Fundamentals of Database Systems&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1282176514408564458?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1282176514408564458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1282176514408564458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1282176514408564458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1282176514408564458'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/06/books-for-programmers.html' title='Books for programmers'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-207336902349409372</id><published>2009-05-21T22:43:00.002+07:00</published><updated>2009-06-09T23:33:53.875+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Agile Nokia test</title><content type='html'>Well, you may already hear about "The Nokia test" or "Nokia Scrum" of Jeff Sutherland, but here is another perspective of the test, to see whether you are doing Agile or not: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;1. Do you need a complete specification document before you start to build stuff?&lt;br /&gt;&lt;br /&gt;2. Are you doing time boxed iterative development with each iteration lasting less than 6 weeks?&lt;br /&gt;&lt;br /&gt;3. At the end of the iteration do you have working code?&lt;br /&gt;&lt;br /&gt;4. Do you have tests to determine that you have finished development tasks?&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's all. &lt;br /&gt;Simple, isn't it ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Do you need a complete specification document before you start to build stuff?&lt;br /&gt;&lt;br /&gt;Yes: Then you are not doing Agile, you are doing industrial Big Design Upfront making&lt;br /&gt;&lt;br /&gt;No: Great - test passed, move to question 2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Are you doing time boxed iterative development with each iteration lasting less than 6 weeks?&lt;br /&gt;&lt;br /&gt;Yes: Great - test passed, move to question 3&lt;br /&gt;&lt;br /&gt;No: Then you are not doing Agile. The most important difference between agile and conventional methods of getting things done is that Agile uses lots of small steps rather than trying to do everything all at once&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. At the end of the iteration do you have working code?&lt;br /&gt;&lt;br /&gt;Yes: If you can show this to your customers and get feedback then you have passed the test&lt;br /&gt;&lt;br /&gt;No: Then how do you know you are done? If it is not working you can't demo it to your customer and they can't make effective prioritisation decisions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Do you have tests to determine that you have finished development tasks?&lt;br /&gt;&lt;br /&gt;Yes: Good - you are on the path to Agile enlightenment!&lt;br /&gt;&lt;br /&gt;No: You worked so hard but you don't know if you are done! How do you know that changes in the next iteration wont undo all your good work?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-207336902349409372?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/207336902349409372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=207336902349409372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/207336902349409372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/207336902349409372'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/05/agile-nokia-test.html' title='Agile Nokia test'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5761600871928764605</id><published>2009-05-20T01:35:00.002+07:00</published><updated>2009-06-02T22:46:27.158+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><title type='text'>Static vs Singleton</title><content type='html'>Ever wonder the advantages of using static methods or static class or Singleton class ? &lt;br /&gt;&lt;br /&gt;IMHO, each approach has some benefits and disadvantages, you may choose your own depending on the situation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Benefits of static methods : &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Benefits of Singleton :&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5761600871928764605?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5761600871928764605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5761600871928764605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5761600871928764605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5761600871928764605'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/05/static-vs-singleton.html' title='Static vs Singleton'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1183238168668629729</id><published>2009-05-03T23:24:00.004+07:00</published><updated>2009-05-30T11:24:04.710+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript-CSS-DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JavaScript gotcha Overloading</title><content type='html'>Gotcha đơn giản là "got ya" , nghĩa là "Tóm được rồi", như khi bạn bắt được ai đó trong 1 trò chơi. Còn trong lập trình (programming, in other words "thảo chương") thì Gotcha được dùng với nghĩa tương tự: 1 feature ngoài mong đợi (unexpected) , thậm chí đi ngoài cả specs, mặc dù thường không được coi là bug. &lt;br /&gt;&lt;br /&gt;Thường các gotcha lập trình này cần phải có nhiều kinh nghiệm mới phát hiện được (hoặc nhờ đọc bài viết của người có kinh nghiệm, hehe) . Nếu bạn đã từng trải qua hàng đống giờ dò lỗi (debug) vì 1 gotcha nào đó, thì hẳn sẽ rủa "mấy tay nào đó" làm cái chức năng ngớ ngẩn làm mất bao nhiêu công sức của mình. Do đó nếu có thời gian cũng nên xem thử các gotcha liên quan đến công việc của mình, phòng khi gặp trường hợp như trên.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JavaScript thì theo tôi biết có khoảng 15 gotcha dễ gặp, và overloading sẽ là gotcha đầu tiên trình bày ở đây.&lt;br /&gt; &lt;br /&gt;(to be cont)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1183238168668629729?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1183238168668629729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1183238168668629729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1183238168668629729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1183238168668629729'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/05/javascript-gotcha-overloading.html' title='JavaScript gotcha Overloading'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-490415788795647596</id><published>2009-04-28T00:50:00.003+07:00</published><updated>2009-05-12T20:38:04.628+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='OperatingSystem'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Ubuntu hibernate suspend</title><content type='html'>Some commands to hibernate/suspend, tested on Ubuntu Hardy (8.04). Note that the effects of these command on laptop and desktop may be different with the same version of Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pmi action hibernate &lt;br /&gt;&lt;br /&gt;pmi action suspend&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pm-hibernate&lt;br /&gt;&lt;br /&gt;pm-suspend&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/etc/acpi/sleep.sh&lt;br /&gt;&lt;br /&gt;/etc/acpi/hibernate.sh&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/lib/hal/scripts/linux/hal-system-power-hibernate-linux&lt;br /&gt;&lt;br /&gt;/usr/lib/hal/scripts/linux/hal-system-power-suspend-linux&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BONUS: &lt;br /&gt;&lt;br /&gt;gnome-screensaver-command --lock&lt;br /&gt;&lt;br /&gt;sudo apt-get install uswsusp &amp;&amp; sudo s2ram --force&lt;br /&gt;&lt;br /&gt;sudo apt-get install uswsusp &amp;&amp; sudo s2disk&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-490415788795647596?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/490415788795647596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=490415788795647596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/490415788795647596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/490415788795647596'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/04/ubuntu-hibernate-suspend.html' title='Ubuntu hibernate suspend'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6028917375468531731</id><published>2009-04-19T20:41:00.002+07:00</published><updated>2009-04-28T00:52:04.065+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><title type='text'>Oracle and Sun</title><content type='html'>A big acquisition !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6028917375468531731?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6028917375468531731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6028917375468531731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6028917375468531731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6028917375468531731'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/04/oracle-and-sun.html' title='Oracle and Sun'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5340562474734318181</id><published>2009-04-19T10:26:00.003+07:00</published><updated>2009-05-30T11:51:33.093+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript-CSS-DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>XPath quick notes</title><content type='html'>&lt;p&gt;The most useful  path expressions to select nodes:&lt;/p&gt;    &lt;br /&gt;&lt;table class="reference" border="1" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;  &lt;th align="left" valign="top" width="25%"&gt;Expression&lt;/th&gt;     &lt;th align="left" valign="top"&gt;Description&lt;/th&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;&lt;i&gt;nodename&lt;/i&gt;&lt;/td&gt;     &lt;td valign="top"&gt;Selects all child nodes of the named node&lt;/td&gt;     &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;/&lt;/td&gt;     &lt;td valign="top"&gt;Selects from the root node&lt;/td&gt;     &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;//&lt;/td&gt;     &lt;td valign="top"&gt;Selects nodes in the document from the current node that   match the selection no matter where they are &lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;.&lt;/td&gt;     &lt;td valign="top"&gt;Selects the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;..&lt;/td&gt;     &lt;td valign="top"&gt;Selects the parent of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;@&lt;/td&gt;     &lt;td valign="top"&gt;Selects attributes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;XPath wildcards to select unknown XML elements.&lt;/p&gt;    &lt;br /&gt;&lt;table class="reference" border="1" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;  &lt;th align="left" valign="top" width="25%"&gt;Wildcard&lt;/th&gt;     &lt;th align="left" valign="top"&gt;Description&lt;/th&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;*&lt;/td&gt;     &lt;td valign="top"&gt;Matches any element node&lt;/td&gt;     &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;@*&lt;/td&gt;     &lt;td valign="top"&gt;Matches any attribute node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;node()&lt;/td&gt;     &lt;td valign="top"&gt;Matches any node of any kind&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;XPath axes defines a node-sets relative to the current node.&lt;/p&gt;    &lt;br /&gt;&lt;table class="reference" border="1" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;     &lt;th align="left" valign="top" width="38%"&gt;AxisName&lt;/th&gt;     &lt;th align="left" valign="top" width="62%"&gt;Result&lt;/th&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;ancestor&lt;/td&gt;     &lt;td valign="top"&gt;Selects all ancestors (parent, grandparent, etc.) of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;ancestor-or-self&lt;/td&gt;     &lt;td valign="top"&gt;Selects all ancestors (parent, grandparent, etc.) of the current node   and the current node itself&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;attribute&lt;/td&gt;     &lt;td valign="top"&gt;Selects all attributes of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;child&lt;/td&gt;     &lt;td valign="top"&gt;Selects all children of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;descendant&lt;/td&gt;     &lt;td valign="top"&gt;Selects all descendants (children, grandchildren, etc.) of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;descendant-or-self&lt;/td&gt;     &lt;td valign="top"&gt;Selects all descendants (children, grandchildren, etc.) of the current node   and the current node itself&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;following&lt;/td&gt;     &lt;td valign="top"&gt;Selects everything in the document after the closing tag of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;following-sibling&lt;/td&gt;     &lt;td valign="top"&gt;Selects all siblings after the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;namespace&lt;/td&gt;     &lt;td valign="top"&gt;Selects all namespace nodes of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;parent&lt;/td&gt;     &lt;td valign="top"&gt;Selects the parent of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;preceding&lt;/td&gt;     &lt;td valign="top"&gt;Selects everything in the document that is before the start tag of the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;preceding-sibling&lt;/td&gt;     &lt;td valign="top"&gt;Selects all siblings before the current node&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td valign="top"&gt;self&lt;/td&gt;     &lt;td valign="top"&gt;Selects the current node&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5340562474734318181?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5340562474734318181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5340562474734318181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5340562474734318181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5340562474734318181'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/04/xpath-quick-notes.html' title='XPath quick notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2906506291819426022</id><published>2009-04-07T21:27:00.003+07:00</published><updated>2009-05-30T12:33:42.470+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OperatingSystem'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Remote Desktop Redmond</title><content type='html'>to be cont.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2906506291819426022?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2906506291819426022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2906506291819426022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2906506291819426022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2906506291819426022'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/04/remote-desktop-redmond.html' title='Remote Desktop Redmond'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2187896492550946710</id><published>2009-04-06T22:58:00.004+07:00</published><updated>2009-04-19T21:13:23.011+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftSkill'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>English Talking Practice</title><content type='html'>Sau bài về cách luyện &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/english-listening-practice.html"&gt;kỹ năng nghe&lt;/a&gt; thì có một số bạn hỏi tôi có tips nào tương tự như thế để luyện nói hay không .&lt;br /&gt;&lt;br /&gt;Dĩ nhiên là có rồi :-)&lt;br /&gt;&lt;br /&gt;Nhưng nên nhớ có nhiều phương pháp học tiếng Anh và bạn có thể áp dụng vài cách trong số đó miễn là bạn cảm thấy phù hợp với mình và có hiệu quả.&lt;br /&gt;Điều quan trọng là không nên áp dụng TẤT CẢ quy tắc hoặc cách học của người khác. Khi học theo một cách nào đó, nên thử chỉ 1 cách đó hoặc tối đa là 2, 3 cách; đừng dại dột mà thử nhiều cách mới cùng lúc, bởi khi đó bạn sẽ khó nhận thấy kết quả.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sau đây là một số quy tắc quan trọng để học tiếng Anh, chủ yếu giúp cải thiện khả năng Talking, mà bản thân tôi cảm thấy rất hiệu quả. Nếu bạn đã có căn bản về ngữ pháp tiếng Anh thì áp dụng những cách này sẽ giúp bạn cải thiện việc giao tiếp với người nước ngoài trong thời gian ngắn !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1/ Từ vựng: &lt;b&gt;học theo CỤM TỪ&lt;/b&gt; (câu ngắn cũng có thể xem là 1 cụm từ)&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ Gặp người nước ngoài: &lt;b&gt;đừng bận tâm ngữ pháp&lt;/b&gt; &lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3/ Trong lớp học: &lt;b&gt;chỉ dùng tiếng Anh&lt;/b&gt; (các địa điểm như English Club cũng vậy)&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4/ Nghiền ngẫm: &lt;b&gt;nghe lặp đi lặp lại để hiểu&lt;/b&gt; (ko dùng thiết bị thì tự mình đọc)&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5/ Ngữ pháp: &lt;b&gt;nắm vững cơ bản (Simple Past, Simple Present, Present Perfect, Simple Future)&lt;/b&gt; qua các đoạn kể.&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6/ Cập nhật: &lt;b&gt;học từ vựng thực tế, hiện đại&lt;/b&gt; qua các bản tin và Internet sites.&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7/ Phản xạ với tiếng Anh: bằng &lt;b&gt;các đoạn Hỏi Đáp đơn giản thực tế&lt;/b&gt;&lt;br /&gt;REASON: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun ! and Good Luck !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2187896492550946710?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2187896492550946710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2187896492550946710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2187896492550946710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2187896492550946710'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/04/english-talking-practice.html' title='English Talking Practice'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4314390916631134056</id><published>2009-03-29T11:46:00.003+07:00</published><updated>2009-06-02T22:01:17.721+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript-CSS-DOM'/><title type='text'>XMLHttpRequest quick notes</title><content type='html'>&lt;div class=ninja-code&gt;&lt;br /&gt;interface XMLHttpRequest {&lt;br /&gt;  // STATE&lt;br /&gt;  attribute int readyState; // readonly&lt;br /&gt;  attribute EventListener onreadystatechange; &lt;br /&gt;&lt;br /&gt;  const unsigned short UNSENT = 0; // innerHTML == "uninitialized"&lt;br /&gt;  const unsigned short OPENED = 1; // innerHTML == "loading"&lt;br /&gt;  const unsigned short HEADERS_RECEIVED = 2; // innerHTML == "loaded"&lt;br /&gt;  const unsigned short LOADING = 3; // innerHTML == "interactive"&lt;br /&gt;  const unsigned short DONE = 4; // innerHTML == "complete"&lt;br /&gt;&lt;br /&gt;  // REQUEST&lt;br /&gt;  void open(DOMString method, DOMString url, boolean async);&lt;br /&gt;  void open(DOMString method, DOMString url, boolean async, DOMString user, DOMString password);&lt;br /&gt;&lt;br /&gt;  void setRequestHeader(DOMString header, DOMString value);&lt;br /&gt;&lt;br /&gt;  void send(in DOMString data);&lt;br /&gt;  void send(in Document data);&lt;br /&gt;&lt;br /&gt;  void abort();&lt;br /&gt;&lt;br /&gt;  // RESPONSE readonly&lt;br /&gt;  attribute Document responseXML;&lt;br /&gt;  attribute DOMString responseText;&lt;br /&gt;  attribute int status;&lt;br /&gt;  attribute DOMString statusText;&lt;br /&gt;&lt;br /&gt;  DOMString getAllResponseHeaders();&lt;br /&gt;  DOMString getResponseHeader(in DOMString header);&lt;br /&gt;};&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4314390916631134056?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4314390916631134056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4314390916631134056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4314390916631134056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4314390916631134056'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/xmlhttprequest-quick-notes.html' title='XMLHttpRequest quick notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-252588884307434940</id><published>2009-03-28T09:43:00.002+07:00</published><updated>2009-03-29T21:34:56.384+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftSkill'/><title type='text'>BarCamp Hanoi 2009</title><content type='html'>&lt;h2&gt;&lt;a href="http://barcampsaigon.org/dokuwiki/doku.php?id=2008_sessions"&gt;BarCamp&lt;/a&gt; Hanoi 2009 registration is now open&lt;/h2&gt;&lt;p&gt; Register here: &lt;a title="http://www.barcamphanoi.org/?page_id=10&amp;amp;lang=en" href="http://www.barcamphanoi.org/?page_id=10&amp;amp;lang=en" target="_blank"&gt;http://www.barcamphanoi.org/?&lt;wbr&gt;page_id=10&amp;amp;lang=en&lt;/a&gt; &lt;/p&gt; &lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;h3&gt; What:&lt;/h3&gt; &lt;br /&gt;&lt;i&gt;BarCamp is a user-generated event — open, participatory workshop-events, whose content is provided by participants.&lt;/i&gt;&lt;/p&gt; &lt;br /&gt;&lt;p&gt;There is no audience, only participants. Attendees must give lead a discussion, give a demo, or help with one, or otherwise volunteer / contribute in some way to support the event. All sessions are scheduled the day they happen. The people present at the event will select the demos or presentations they want to see.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;Attendance is free of charge.&lt;/p&gt;Topics may include, but are not limited to: &lt;i&gt;online services, social media, startups, UI design, entrepreneurship, VC, Web 2.0 technologies, online marketing, online advertising, online payment, e-commerce, open source software, hardware hacking, robotics, mobile computing, bioinformatics, programming languages, even the future of technology or global issues.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Learn more about BarCamp: &lt;a title="http://www.barcamphanoi.org/?page_id=2&amp;amp;lang=en" href="http://www.barcamphanoi.org/?page_id=2&amp;amp;lang=en" target="_blank"&gt;http://www.barcamphanoi.org/?&lt;wbr&gt;page_id=2&amp;amp;lang=en&lt;/a&gt;&lt;br /&gt;  Want to sponsor us: &lt;a title="http://www.barcamphanoi.org/?page_id=12&amp;amp;lang=en" href="http://www.barcamphanoi.org/?page_id=12&amp;amp;lang=en" target="_blank"&gt;http://www.barcamphanoi.org/?&lt;wbr&gt;page_id=12&amp;amp;lang=en&lt;/a&gt; &lt;h3&gt; When:&lt;/h3&gt; &lt;b&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;April 19, 2009&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;8.30 AM to 5.00 PM&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;h3&gt; Where:&lt;/h3&gt; &lt;b&gt;RMIT International University, Hanoi Campus&lt;/b&gt;&lt;br /&gt;2/2C Van Phuc Compound, Kim Ma Street, Hanoi.&lt;br /&gt;&lt;br /&gt;View the map here: &lt;a title="http://www.barcamphanoi.org/?page_id=9&amp;amp;lang=en" href="http://www.barcamphanoi.org/?page_id=9&amp;amp;lang=en" target="_blank"&gt;http://www.barcamphanoi.org/?&lt;wbr&gt;page_id=9&amp;amp;lang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;------------------------------&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mở đăng ký tham dự Barcamp Hanoi 2009&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Đăng ký tại đây: &lt;a title="http://www.barcamphanoi.org/?page_id=10&amp;amp;lang=en" href="http://www.barcamphanoi.org/?page_id=10&amp;amp;lang=en" target="_blank"&gt;http://www.barcamphanoi.org/?&lt;wbr&gt;page_id=10&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-252588884307434940?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/252588884307434940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=252588884307434940' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/252588884307434940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/252588884307434940'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/barcamp-hanoi-2009.html' title='BarCamp Hanoi 2009'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-336181476259873846</id><published>2009-03-22T19:10:00.004+07:00</published><updated>2009-04-06T23:33:56.329+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java basic videos</title><content type='html'>Some Vietnamese videos for Java beginners : (composed by KhoaND)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?5r4mmsaw5bn" target="_blank"&gt;http://www.mediafire.com/?5r4mmsaw5bn&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?woeyul1ltqk" target="_blank"&gt;http://www.mediafire.com/?woeyul1ltqk&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?ylujqjaz5iq" target="_blank"&gt;http://www.mediafire.com/?ylujqjaz5iq&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?p4gyce0s2lf" target="_blank"&gt;http://www.mediafire.com/?p4gyce0s2lf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Password mediafire : &lt;b&gt;&lt;br /&gt;mgsvn&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;HAVE FUN !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-336181476259873846?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/336181476259873846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=336181476259873846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/336181476259873846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/336181476259873846'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/java-basic-videos.html' title='Java basic videos'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3213988869983673236</id><published>2009-03-19T22:16:00.002+07:00</published><updated>2009-03-19T22:24:08.393+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Why Eclipse IDE</title><content type='html'>( 56kbps modem warning ! )&lt;br /&gt;&lt;b&gt;&lt;br /&gt;A PICTURE IS WORTH A THOUSAND WORDS !&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; Debug Java ( //www.ibm.com/developerworks/opensource/library/os-eclipse-platform )&lt;br /&gt; &lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-platform/fig7.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Customize perspective, views, hotkey... ( //www.ibm.com/developerworks/opensource/library/os-eclipse-master1/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-cfeclipse/fig06.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-master1/figure1.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-master1/figure10.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Customize formatting ( //www.ibm.com/developerworks/opensource/library/os-eclipse-master3/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-master3/image13.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Refactoring 2003 ( //www.ibm.com/developerworks/library/os-ecref/ ) : &lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/library/os-ecref/pushdown.gif" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Integrate SVN/CVS ( //www.ibm.com/developerworks/opensource/library/os-ecl-subversion/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-ecl-subversion/fig14.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debug PHP ( //www.ibm.com/developerworks/opensource/library/os-ecbug/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-ecbug/fig11.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debug C/C++ ( //www.ibm.com/developerworks/library/os-eclipse-cdt-debug2 )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/library/os-eclipse-cdt-debug2/figure1.gif" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debug Python ( //www.ibm.com/developerworks/opensource/library/os-ecant/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-ecant/debugger.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debug  ActionScript ( //swingchen.bokee.com/6028838.html )&lt;br /&gt;&lt;img src="http://www.cayambe.com/wordpress/wp-content/uploads/2006/06/16a.png" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Debug ColdFusion ( //www.ibm.com/developerworks/opensource/library/os-eclipse-cfeclipse/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-cfeclipse/fig28.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And Ruby ( //www.ibm.com/developerworks/opensource/library/os-eclipse-rdt/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-rdt/fig09.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;even .NET ! ( //www.ibm.com/developerworks/opensource/library/os-eclipse-migratenetvs/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-migratenetvs/image004.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and more... ( //www.ibm.com/developerworks/opensource/library/os-eclipse-iphone/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-iphone/finalapp.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rocks solid on multi-OS : ( //www.ibm.com/developerworks/opensource/library/os-eclipse-osxjava/ )&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-mashup-google-pt1/fig11.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ibm.com/developerworks/opensource/library/os-eclipse-osxjava/figure4.jpg" &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Other IDEs which turn out to use Eclipse codebase : &lt;br /&gt;&lt;br /&gt;&lt;b&gt;FlexBuilder (Adobe)&lt;br /&gt;Websphere Studio Application Developer (IBM)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;JDeveloper (Oracle)&lt;br /&gt;JBuilder 2007+ (Borland)&lt;br /&gt;&lt;/b&gt;&lt;b&gt;WebLogic workshop (BEA)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;ZendStudio (Zend)&lt;br /&gt;Aptana (Aptana)&lt;br /&gt;PowerDesigner (Sybase)&lt;br /&gt;MyEclipse (Genuitec)&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Rational XYZ (IBM)&lt;br /&gt;Parasoft XYZ (Parasoft)&lt;br /&gt;. . . &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3213988869983673236?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3213988869983673236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3213988869983673236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3213988869983673236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3213988869983673236'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/why-eclipse-ide.html' title='Why Eclipse IDE'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5832678454602485632</id><published>2009-03-10T22:37:00.005+07:00</published><updated>2009-03-22T19:28:28.012+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web2.0-PageRank-SEO'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Collaboration online services</title><content type='html'>Lúc này tớ chuyển sang các dịch vụ online cho nó đồng nhất, tiết kiệm được khối thời gian khi phải làm việc trên nhiều máy khác nhau: lappy, deskies (@home, @work, etc)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bookmarks&lt;/b&gt;&lt;br /&gt;http://foxmark.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Technical notes&lt;/b&gt; &lt;br /&gt;http://pastebin.org&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To-Do list&lt;/b&gt;&lt;br /&gt;http://tadalist.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IRC gossips:&lt;/b&gt;&lt;br /&gt;http://mibbit.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compilers:&lt;/b&gt;&lt;br /&gt;http://codepad.org&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and more...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5832678454602485632?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5832678454602485632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5832678454602485632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5832678454602485632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5832678454602485632'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/collaboration-online-services.html' title='Collaboration online services'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6536984030906062591</id><published>2009-03-08T19:10:00.002+07:00</published><updated>2009-03-29T13:00:13.734+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java mess detector</title><content type='html'>OK guys, I have used CheckStyle and PMD, either one of them seems good enough.&lt;br /&gt;&lt;br /&gt;But do you have any comparision or advice for me about other tools: FindBugs, Hammurapi, TFTP, JLint, ... &lt;br /&gt;&lt;br /&gt;I just want to make a list of Top 5 tools that is really useful in each catergories of software development (in a certain language, such as Java). &lt;br /&gt;&lt;br /&gt;RANK ? : PMD &lt;br /&gt;&lt;br /&gt;RANK ? : Checkstyle&lt;br /&gt;&lt;br /&gt;RANK ? : FindBugs&lt;br /&gt;&lt;br /&gt;RANK ? : Hammurapi&lt;br /&gt;&lt;br /&gt;RANK ? : TFTP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6536984030906062591?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6536984030906062591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6536984030906062591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6536984030906062591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6536984030906062591'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/java-mess-detector.html' title='Java mess detector'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-425377740464946460</id><published>2009-03-05T23:51:00.005+07:00</published><updated>2009-03-10T23:05:45.592+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Ubuntu screensaver hang</title><content type='html'>Hic, khong biet co phai tai nghich ngom Compiz Manager voi Emerald Theme Manager hay khong, ma luc nay Ubuntu chay screensaver de bi ngon CPU (100%) , tham chi khi chi chay preview cung bi CPU 100%, lai gap em lappy thoi tien su cua minh, chan khong ta.&lt;br /&gt;&lt;br /&gt;Khi gap cac tinh huong nhu tren, tuy theo muc do nang hay nhe ma ap dung cac giai phap:&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;Alt+F2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;Ctrl+Alt+D&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;Ctrl+Alt+F1&lt;/b&gt; , sau do &lt;b&gt;Ctrl+Alt+F7&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;Ctrl+Alt+F9&lt;/b&gt; , sau do go lenh &lt;b&gt;sudo startx&lt;/b&gt; hoac &lt;b&gt;sudo xinit -- :1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;Ctrl+Alt+Backspace&lt;/b&gt; , works 99% :-)&lt;br /&gt;&lt;br /&gt;* giu nut Power cua may it nhat 4 giay :D &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;good luck,&lt;br /&gt;&lt;br /&gt;(sry I will fix Vietnamese later)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-425377740464946460?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/425377740464946460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=425377740464946460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/425377740464946460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/425377740464946460'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/03/ubuntu-screensaver-hang.html' title='Ubuntu screensaver hang'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5132549903979470363</id><published>2009-02-27T00:01:00.005+07:00</published><updated>2009-03-06T00:02:35.777+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftSkill'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>Career Promotion faster</title><content type='html'>Some working experience to learn:&lt;br /&gt;&lt;br /&gt;   1. &lt;b&gt;How you appear is more important than how you perform in your job!&lt;/b&gt; Remember to create a professional image all the time; learn what's going on in your industry; speak them up whenever you can.&lt;br /&gt;&lt;br /&gt;   2. How you communicate is more important than how you do the job.&lt;br /&gt;&lt;br /&gt;   3. Any job will become a routine, mundane job after some time. You need to stretch yourself to make it interesting. If you can't do it, then quit.&lt;br /&gt;&lt;br /&gt;   4. Always have &lt;b&gt;some ideas up your sleeve to tell your manager&lt;/b&gt; on how to improve things.&lt;br /&gt;&lt;br /&gt;   5. Take responsibilities when offered, they are the pathway to move up the career ladder.&lt;br /&gt;&lt;br /&gt;   6. &lt;b&gt;Come at least 5 minutes earlier than the office start time&lt;/b&gt;. You can go home on the dot.&lt;br /&gt;&lt;br /&gt;   7. &lt;b&gt;Be nice with your receptionist / administrative assistants&lt;/b&gt;. They run the company.&lt;br /&gt;&lt;br /&gt;   8. Bad people. They will be everywhere. Know how to handle them.&lt;br /&gt;  &lt;br /&gt;   9. Don't do the works allotted to your colleagues. You tell them how to do and let them do it.&lt;br /&gt;&lt;br /&gt;  10. Compliment people; &lt;b&gt;Give credits to others&lt;/b&gt;. Nice employees leave company not because of less salary, but for the lack of recognition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5132549903979470363?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5132549903979470363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5132549903979470363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5132549903979470363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5132549903979470363'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/career-promotion-faster.html' title='Career Promotion faster'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3322361788746426742</id><published>2009-02-26T19:48:00.003+07:00</published><updated>2009-03-07T12:43:12.823+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Ubuntu APT deb</title><content type='html'>for Ubuntu and other Debian-family:&lt;br /&gt;&lt;br /&gt;APT = &lt;a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool"&gt;Advanced_Packaging_Tool&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;sudo apt-get update&lt;br /&gt;&lt;br /&gt;sudo apt-get upgrade&lt;br /&gt;&lt;br /&gt;sudo apt-get dist-upgrage&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;sudo apt-get install envyng&lt;br /&gt;&lt;br /&gt;sudo apt-cache search envyng&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The deb files are stored at &lt;b&gt;/var/cache/apt/archives&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;sudo dpkg -i xvnkb-0.2.9a-utf_i386.deb&lt;br /&gt;&lt;br /&gt;man dpkg&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3322361788746426742?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3322361788746426742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3322361788746426742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3322361788746426742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3322361788746426742'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/ubuntu-apt-deb.html' title='Ubuntu APT deb'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-9012853935306416638</id><published>2009-02-18T21:21:00.003+07:00</published><updated>2009-02-27T00:03:42.000+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java Exception revisited</title><content type='html'>( to be updated )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-9012853935306416638?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/9012853935306416638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=9012853935306416638' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9012853935306416638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9012853935306416638'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/java-exception-revisited.html' title='Java Exception revisited'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5308726809532794266</id><published>2009-02-18T01:15:00.002+07:00</published><updated>2009-02-26T20:56:49.278+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='OperatingSystem'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Win startup script</title><content type='html'>( to be updated )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5308726809532794266?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5308726809532794266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5308726809532794266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5308726809532794266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5308726809532794266'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/win-startup-script.html' title='Win startup script'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3846241591692720998</id><published>2009-02-14T23:14:00.003+07:00</published><updated>2009-02-26T20:55:18.843+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex-ActionScript-Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><title type='text'>Eclipse Flex formatting</title><content type='html'>FlexBuilder cheapest license is around 500$ , and it does not support auto-formatting or Refactoring ?!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OK, Adobe guys should improve those features fast, since Eclipse community begins to pay attention to Flex and Spring/BlazedDS integration :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/flexformatter/"&gt;http://sourceforge.net/projects/flexformatter/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Finally found ! No longer pain refactoring with stupid FlexBuilder stuff...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3846241591692720998?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3846241591692720998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3846241591692720998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3846241591692720998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3846241591692720998'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/eclipse-flex-formatting.html' title='Eclipse Flex formatting'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5670259264370906027</id><published>2009-02-11T19:34:00.003+07:00</published><updated>2009-02-19T21:16:38.500+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Quote for developers</title><content type='html'>According to Kent Beck, Agile expert and also the creator of Extreme Programming methodology :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;"Your organization is going to spend a lot more on somebody - you or somebody else - reading what you're writing right now than they are ever going to spend on you writing it,"&lt;br /&gt;&lt;br /&gt;"You're going to read that code yourself 10 to 100 times for every time you write it, so it's worth taking the trouble to make it &lt;b&gt;readable&lt;/b&gt;. You're going to modify it five times after you write it the first time, so it makes sense to make it &lt;b&gt;easy to change&lt;/b&gt;. And because you can't predict the future, &lt;b&gt;it doesn't make any sense to build a lot of stuff you don't need right away&lt;/b&gt;. These are unchanging principles of software development, and nothing about applying the words 'scripting' or 'model driven' or whatever the programming metaphor du jour happens to be changes any of that."&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QFT,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5670259264370906027?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5670259264370906027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5670259264370906027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5670259264370906027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5670259264370906027'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/quote-for-developers.html' title='Quote for developers'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5133968534526208854</id><published>2009-02-09T21:30:00.008+07:00</published><updated>2010-09-11T19:53:30.062+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><title type='text'>JUnit auto SetGet</title><content type='html'>Using reflection and generics in &lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-2.html"&gt;Java&lt;/a&gt;, you can now automatically &lt;a href="http://mediocre-ninja.blogspot.com/2009/02/junit-mock-frameworks.html"&gt;test&lt;/a&gt; &lt;a href="http://diendantinhoc.org/forum/topic/20676/Why-getter-and-setter-methods-are-evil.html?zone=4"&gt;Getters  and Setters&lt;/a&gt; (accessors and mutators) of your class with JUnit/TestNG. &lt;br /&gt;&lt;br /&gt;Of course normally many developers do not bother testing setters and getters, but if your customer insists on high test coverage you will find this auto one is useful to avoid boilerplate code :-) .&lt;br /&gt;And maybe it can help to avoid some nasty bugs (I myself feel ashamed when reading my "sleepy" code, too) !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some fragments : &lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;public void invokeSettersAndGetters() {&lt;br /&gt;Classextends Object&gt; targetClass = testTarget.getClass();&lt;br /&gt;Method[] methods = targetClass.getMethods();&lt;br /&gt;for (int i = 0; i &lt; methods.length; i++) {Method method = methods[i];if (method.getName().startsWith("set")) {Class[] parameterTypes = method.getParameterTypes();if (parameterTypes.length == 1) {Object testValue = testValueFactory.createValue(parameterTypes[0]);try {method.invoke(testTarget, testValue);if (testValue instanceof Boolean) {invokeGetter(targetClass, testValue, "is" + method.getName().substring(3));} else {invokeGetter(targetClass, testValue, "get" + method.getName().substring(3));}} catch (IllegalAccessException e) {Assert.fail("failed to access setter method: " + method.toString() + " - " + e.getMessage());} catch (InvocationTargetException e) {Assert.fail("failed to invoke setter method: " + method.toString() + " - " + e.getMessage());}}}}} &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;private void invokeGetter(Class targetClass, Object expectedValue, String getterName) {&lt;br /&gt;try {&lt;br /&gt;Method getterMethod = targetClass.getMethod(getterName);&lt;br /&gt;if (log.isDebugEnabled()) {&lt;br /&gt;log.debug("invoke get method: " + getterMethod.toString());&lt;br /&gt;}&lt;br /&gt;Object retrievedValue = getterMethod.invoke(testTarget);&lt;br /&gt;Class returnType = getterMethod.getReturnType();&lt;br /&gt;if (returnType.isPrimitive()) {&lt;br /&gt;Assert.assertEquals("return value of " + getterName + " incorrect", expectedValue, retrievedValue);&lt;br /&gt;} else {&lt;br /&gt;Assert.assertSame("return value of " + getterName + " incorrect", expectedValue, retrievedValue);&lt;br /&gt;}&lt;br /&gt;} catch (NoSuchMethodException ignore) {&lt;br /&gt;// ignore if getter does not exist&lt;br /&gt;if (log.isDebugEnabled()) {&lt;br /&gt;log.debug("getter does not exist: " + getterName);&lt;br /&gt;}&lt;br /&gt;} catch (IllegalAccessException e) {&lt;br /&gt;Assert.fail("failed to access getter method: " + getterName + " - " + e.getMessage());&lt;br /&gt;} catch (InvocationTargetException e) {&lt;br /&gt;Assert.fail("failed to invoke getter method: " + getterName + " - " + e.getMessage());&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;basic JUnit test: &lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testSetterGetter() {&lt;br /&gt;Cat cat = new Cat();&lt;br /&gt;MutatorAccessorInvoker invoker = new MutatorAccessorInvoker(cat);&lt;br /&gt;invoker.invokeSettersAndGetters();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Full credit of this invoker should belong to &lt;a href="http://kazed.net"&gt; Koert Zeilstra&lt;/a&gt; , however you should see that his class can be improved ;-) . &lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;@Test&lt;br /&gt;public void setAndGetAll() {&lt;br /&gt;MutatorAccessorInvoker&lt;myguess&gt; mutatorAccessorInvoker = new MutatorAccessorInvoker&lt;myguess&gt;(new MyGuess());&lt;br /&gt;mutatorAccessorInvoker.invokeSettersAndGetters();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5133968534526208854?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5133968534526208854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5133968534526208854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5133968534526208854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5133968534526208854'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/junit-auto-setget.html' title='JUnit auto SetGet'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8377502588073215213</id><published>2009-02-06T21:09:00.004+07:00</published><updated>2009-06-15T21:49:22.735+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript-CSS-DOM'/><title type='text'>Aptech VN books</title><content type='html'>Dưới đây là link tải bộ ACCP 7.1 , tài liệu chính mới nhất của các học viện Aptech VN, được chia thành 17 phần : &lt;br /&gt; &lt;br /&gt; http://www.mediafire.com/?gme9tgtyttz&lt;br /&gt; http://www.mediafire.com/?t1y1tzo3zcm&lt;br /&gt; http://www.mediafire.com/?ugg0hmycgcf&lt;br /&gt; http://www.mediafire.com/?xovz2x1n0wm&lt;br /&gt; http://www.mediafire.com/?wx9mbtmfomg&lt;br /&gt; http://www.mediafire.com/?2gtbheelyau&lt;br /&gt; http://www.mediafire.com/?zynv4jdxyym&lt;br /&gt; http://www.mediafire.com/?mw1obhzmtky&lt;br /&gt; http://www.mediafire.com/?lyzbly0syrl&lt;br /&gt; http://www.mediafire.com/?dnn11m2r2ke&lt;br /&gt; http://www.mediafire.com/?mnkymd9pwfm&lt;br /&gt; http://www.mediafire.com/?k3y240jxngn&lt;br /&gt; http://www.mediafire.com/?kwdgemmx4mm&lt;br /&gt; http://www.mediafire.com/?nf2fmde9zmp&lt;br /&gt; http://www.mediafire.com/?m0hnmymzjrw&lt;br /&gt; http://www.mediafire.com/?jm3m2y3wily&lt;br /&gt; http://www.mediafire.com/?xnscysmmzbm&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Mirror: &lt;br /&gt;&lt;br /&gt;http://www.adrive.com/public/eebc6d67f5f41b225e22ae26cfbe14044dd2fbce9e50e62b56c86a5736eadc94.html&lt;br /&gt;http://www.adrive.com/public/6a892301907e9a9604289e9dc39e304ef7932e5340e24f57f30f1670936c6b7a.html&lt;br /&gt;http://www.adrive.com/public/af7c3c712b07af12581156445ee3145e3544bdf1b830c9da3e0a9d81f5d7beb7.html&lt;br /&gt;http://www.adrive.com/public/f3d21fb5cfb9ca0a2f8b817a03cfd237c5a9ec49764d77a688bc496b97717e7e.html&lt;br /&gt;http://www.adrive.com/public/272fc5bf56f86f758d391f5a8aff4fb756edf02cddd81db306ae2f31c4eb05c1.html&lt;br /&gt;http://www.adrive.com/public/aa399b353659d62a371c2cb24239828d97b3472bbfd4e7f6ab2c4bccfbf8661a.html&lt;br /&gt;http://www.adrive.com/public/7b1b91da3e2bac6f57817c380a4cd9a6000843f11964fc9fa8a2fce5ac696fb2.html&lt;br /&gt;http://www.adrive.com/public/1c75d1c3ed7401789ec4b73b9e8a882e0d9ca6aa0c4e702503b7a197444eabbc.html&lt;br /&gt;http://www.adrive.com/public/3ed3877ff7210661a6c6e244ad309a864154e08921b631064bc0f6961e933f09.html&lt;br /&gt;http://www.adrive.com/public/69ad9df24493ecf48e8de0a69993fed072b308e289738f37be9dc2a5e70c7823.html&lt;br /&gt;http://www.adrive.com/public/eafc4f6927d8e70a27d850c219bf7c56e1ccbb38928aa8e5e26c23b34a6b41e1.html&lt;br /&gt;http://www.adrive.com/public/7ea9dfc164db0776ad58a7c3dae145f8629ccb435d53e52eac831f41c6d2b041.html&lt;br /&gt;http://www.adrive.com/public/c12e3a1a5fa492d539eb03112ba2126d2ae740010bfcda6c3e81611d08f1246a.html&lt;br /&gt;http://www.adrive.com/public/5653d968b8dc6d8c04e13ac444e14d136400bad4273465e4f87a89517050dab0.html&lt;br /&gt;http://www.adrive.com/public/ce93f7afc7d9d4b414566bbe0ae30e7011191b1d338eff2e4f9b1d434029230a.html&lt;br /&gt;http://www.adrive.com/public/ca2ad64261bf802a48bb30372c514759c78e01d1d0aa8931acc148b6e9f64dec.html&lt;br /&gt;http://www.adrive.com/public/411be0801872549d82132ccd3bcf6332fedec4b2d65f4bf4ff8bfd5d9b850e88.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mirror 2: &lt;br /&gt;&lt;br /&gt;http://www.mediafire.com/?gxzjaeggvos&lt;br /&gt;http://www.mediafire.com/?1odw3omydoi&lt;br /&gt;http://www.mediafire.com/?mybbnhhoncx&lt;br /&gt;http://www.mediafire.com/?tvfeobyvvny&lt;br /&gt;http://www.mediafire.com/?lvmwinrzwnv&lt;br /&gt;http://www.mediafire.com/?kpmdutjl6nv&lt;br /&gt;http://www.mediafire.com/?wwymtmhptbs&lt;br /&gt;http://www.mediafire.com/?i0vlsxmzsz3&lt;br /&gt;http://www.mediafire.com/?bmtxybxpim1&lt;br /&gt;http://www.mediafire.com/?wrirfuhdjrd&lt;br /&gt;http://www.mediafire.com/?wvrt2mynmbz&lt;br /&gt;http://www.mediafire.com/?zzbbbydjocz&lt;br /&gt;http://www.mediafire.com/?zerbnfubfyh&lt;br /&gt;http://www.mediafire.com/?pmfrlx3ztiq&lt;br /&gt;http://www.mediafire.com/?xyvgbnoyh0y&lt;br /&gt;http://www.mediafire.com/?w4zr6m0eaiw&lt;br /&gt;http://www.mediafire.com/?0gnwqcm5zqm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8377502588073215213?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8377502588073215213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8377502588073215213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8377502588073215213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8377502588073215213'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/aptech-vn-books.html' title='Aptech VN books'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3347909729548420900</id><published>2009-02-04T22:27:00.005+07:00</published><updated>2009-02-08T13:53:59.463+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftSkill'/><title type='text'>Payment negotiation tips</title><content type='html'>&lt;b&gt;=== Before negotiation===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- Delay salary negotiations for as long as possible in the hiring process&lt;br /&gt;&lt;br /&gt;- Find out who really has the authority to negotiate salaries in the company&lt;br /&gt;&lt;br /&gt;- Know exactly what your salary requirements are&lt;br /&gt;&lt;br /&gt;- Do your homework (preparation) before negotiating the job offer: know your competitive market value, know your company-value (current market salary data, your performance evaluations and letters of recommendation, ...)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Negotiation ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- Start the actual negotiations by thanking the employer for the job offer and restating your interest in the position and company.&lt;br /&gt;&lt;br /&gt;- Stay positive and remember that a negotiation is about listening to each other and respecting the needs of &lt;a href="http://vnhacker.blogspot.com/2007/07/15-chaithng-5-c-phiu-dng-c-ng-chin-lc.html"&gt;both&lt;/a&gt; parties.&lt;br /&gt;&lt;br /&gt;- Start with negotiating your basic salary first and then move on to the benefits, one element at a time.&lt;br /&gt;&lt;br /&gt;- Begin at the TOP of your pre-determined salary range (Research often shows a strong link between people's aspirations and the outcome of the negotiations)&lt;br /&gt;&lt;br /&gt;- Structure your salary negotiations around the value you bring to the position and company and AVOID mentioning what you need or feel you deserve to be paid.&lt;br /&gt;&lt;br /&gt;- Weigh the financial value of the benefits offered  as part of your gross income (may add up to 30% of the total compensation).&lt;br /&gt;&lt;br /&gt;- Be aware when the final offer has been reached: Get the final offer in writing. (A legitimate offer should be given in writing and if the employer is reluctant to do this it is a major red flag that there is something wrong)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== After negotiation ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- As after speciality interview and looking for offer letter, just prepare and get ready for other opportunities, don't wait! And if the employer does not respond after 2 weeks, you should apply others and forget that employer (even when they offer your expected income later) .&lt;br /&gt;&lt;br /&gt;- Prepare your job offer acceptance letter: thank the employer, state the full job title, formally accept the job offer, clarify your employment conditions, highlight your appreciation and enthusiasm for the opportunity .&lt;br /&gt;&lt;br /&gt;- Polish your skills and prepare essential things (scripts, directory structure, libraries, pen-box, cup, bag, etc...)  so that you will set up your environment in new workplace quickly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Good luck :-) ,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3347909729548420900?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3347909729548420900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3347909729548420900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3347909729548420900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3347909729548420900'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/payment-negotiation-tips.html' title='Payment negotiation tips'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4567558877502322432</id><published>2009-02-01T11:21:00.007+07:00</published><updated>2010-01-09T00:00:47.193+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><title type='text'>JUnit mock frameworks</title><content type='html'>The main reason for using mock objects to write unit tests is so that they are &lt;b&gt;unit&lt;/b&gt; tests. Without mock implementations, unit tests quickly become integration tests, which are much more costly and time-consuming.&lt;br /&gt;&lt;br /&gt;Here is my ranking list for Java mock frameworks (supporting JUnit, TestNG) :&lt;br /&gt;&lt;br /&gt;1/ &lt;a href="http://code.google.com/p/powermock/"&gt;PowerMock&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2/ &lt;a href="http://easymock.org"&gt;EasyMock&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3/ &lt;a href="http://code.google.com/p/mockito/"&gt;Mockito&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4/ &lt;a href="http://fest.easytesting.org/mocks"&gt;FEST-mocks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5/ &lt;a href="http://jmock.org/"&gt;jMock&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Which is the bes&lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-power-tools.html"&gt;t&lt;/a&gt; mock framework to you ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4567558877502322432?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4567558877502322432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4567558877502322432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4567558877502322432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4567558877502322432'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/02/junit-mock-frameworks.html' title='JUnit mock frameworks'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-517649734920398532</id><published>2009-01-31T12:15:00.006+07:00</published><updated>2009-02-07T22:37:17.296+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql-PostgreSql-SqLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>Cloud Computing basics</title><content type='html'>&lt;b&gt;=== Needs ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nguyên nhân cho sự ra đời của &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud Computing&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;- Mỗi doanh nghiệp làm business bao giờ cũng cần xây dựng một &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/ubuntu-post-installation-notes.html"&gt;hệ thống&lt;/a&gt; thông tin cho riêng mình, thông thường bao gồm các hệ thống: web pages, payroll, email management, &lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management"&gt;CRM&lt;/a&gt;,... Để thiết kế và duy trì hệ thống này, các doanh nghiệp phải chi ra một số tiền không nhỏ, nhất là tiền lương trả cho DBAs. Với các doanh nghiệp nhỏ thì đây là một khoản đầu tư đáng kể. Có một cách tiếp cận khác là thay vì tự xây dựng một hệ thống như thế cho riêng mình thì việc outsource bằng cách thuê lại của đơn vị khác để giảm chi phí build và management.&lt;br /&gt;&lt;br /&gt;- Khi mà internet bandwidth không còn là vấn đề nữa thì các ông lớn như MS, IBM, Google, Yahoo,... ngửi thấy mối hàng béo bở này liền bắt tay xây dựng một hệ thống có thể cung cấp cho khách hàng tất cả các loại dịch vụ trên thông qua các web services.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Problems ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Khi xây dựng một thống centralized để phục vụ cho hệ thống trên thì dễ thấy các vấn đề nổi bật sẽ xuất hiện là:&lt;br /&gt;&lt;br /&gt;- Cần phải lưu trữ một khối lượng dữ liệu lớn đến rất lớn.&lt;br /&gt;&lt;br /&gt;- Dữ liệu đa định dạng, &lt;a href="http://mediocre-ninja.blogspot.com/2009/01/trong-th-gii-scm-hay-thng-c-gi-l-vcs.html"&gt;phân tán&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Cần phải có một hệ thống tính toán đủ mạnh để có thể xử lý hàng ngàn ứng dụng (phép toán) 1 lúc cho 1 lượng dữ liệu khổng lồ .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Solutions===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Cloud Computing ra đời để giải quyết 2 vấn đề này:&lt;br /&gt;&lt;br /&gt;- Dữ liệu được lưu trữ ở các Data Center khổng lồ. Mỗi một công ty lớn như MS, Google có hàng chục data center như vậy nằm rải rác khắp nước Mỹ và các nơi trên thế giới. Vấn đề chính cho các data center này chủ yếu là công suất tiêu thụ và sự tản nhiệt. Vì thế gần đây các data centers thường được xây dựng ở gần các con sông lớn (như dọc sống Colorado) .&lt;br /&gt;&lt;br /&gt;- Còn vấn đề về computing power thì có 2 giải pháp: 1 là mua các supercomputer từ Gray, Sun, Teradata,.. và 2 là dùng hệ thống tính toán song song với các commodity hardware. Tất nhiên cách thứ 2 là cách rẻ tiền nên được ưa chuộng hơn. Tuy nhiên, cách này yêu cầu có một cách phân chia công việc, scheduling và failure management một cách hợp lý. Có rất nhiều mô hình tính toán song song được phát triển, nhưng gần đây mô hình &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt; của Google thu hút được nhiều sự chú ý về tính đơn giản và hiệu quả. &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;Hadoop&lt;/a&gt; là một giải pháp open source của Apache Foundation (xuất phát từ Yahoo) lấy ý tưởng từ cái MapReduce này. Hiện tại MapReduce và Hadoop đang là những keyword khá hot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Ngoài ra thì để quản lý hệ thống cơ sở dữ liệu khổng lồ này cần có cách lưu trữ, truy nhập hiệu quả mà các DBMS thông thường không đáp ứng được.&lt;br /&gt;&lt;br /&gt;+ MS đang chuẩn bị cho ra đời một hệ thống như thế gọi là CloudDB và 1 hệ điều hành tên là Windows Cloud OS. Yahoo thì chưa có CC theo đúng nghĩa, vì nó chỉ có các computing cloud chạy được mỗi app của chúng nó, còn không open và không customize được. Cái này gần với Sever Clustering hơn là Cloud Computing.&lt;br /&gt;&lt;br /&gt;+ IBM có Cloud Computing trên nền &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/linux-directory-structure.html"&gt;Linux&lt;/a&gt; và AIX, gọi là Blue Cloud, nhưng lại bị giới hạn bởi phạm vi địa lý và computing resrource.&lt;br /&gt;&lt;br /&gt;+ Google có App Cloud, nhưng chạy được mỗi Python App, không có database và không cài thêm được app.&lt;br /&gt;&lt;br /&gt;+ Sun và HP cũng có Cloud Computing offering nhưng còn trong giai đoạn thử nghiệm bởi tính ứng dụng còn ở dạng "tiềm năng".&lt;br /&gt;&lt;br /&gt;+ Hiện tại chỉ có Cloud Computing của Amazon (&lt;a href="http://en.wikipedia.org/wiki/Amazon_EC2"&gt;EC2&lt;/a&gt;) là được đánh giá phát triển đáng kể nhất. Amazon có lợi thế lớn là có một sever farm khổng lồ ở hầu hết mọi zone trên thế giới, các team dev hiện cũng đang sử dụng Amazon Web Services để phát triển phần mềm và deploy phần mềm. &lt;a href="http://en.wikipedia.org/wiki/Amazon_S3"&gt;Amazon S3&lt;/a&gt; cung cấp dịch vụ lưu trữ với unlimited space, có thể lưu trữ tại bất kỳ vùng địa lý nào, ví dụ như Nam Mỹ, Bắc Mỹ, Châu Âu, Châu Phi, Châu Á ..., nên hạn chế được sự chậm trễ do khoảng cách. Nếu như một công ty nào đó có nhiều chi nhánh trên thế giới, có thể dùng nhiều S3 để lưu trữ.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Amazon EC2 cho phép người dùng chọn bất kỳ hệ điều hành nào, ví dụ như Linux (Fedora, &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/ubuntu-post-installation-notes-2.html"&gt;Ubuntu&lt;/a&gt; ...), BSD. Hình như giờ mới có cả Window server. Mỗi EC2 instance là một &lt;a href="http://mediocre-ninja.blogspot.com/2009/01/2009-informatic-technologies.html"&gt;virtual&lt;/a&gt; server, có RAM nhiều hay ít, một hay nhiều processor tùy theo loại của instance, và người dùng có thể dùng EC2 tools hoặc SSH vào, cài bất kỳ software nào mình thích lên, như là một computer bình thường. Hoặc có thể setup một EC2 instance image, rồi khi cần có thể chạy một loạt server có cấu hình giống hệt như cái instance image đấy, số lượng server là bao nhiêu là tùy ở mình.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Amazon Persistence Service cho phép người dùng sử dụng như một đĩa cứng ảo gắn vào máy tính ảo EC2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Theo đánh giá của 1 số dev đang phát triển bằng Amazone Web services, Amazon WS rất an toàn, vì nó dựa trên RESTful Web Services, SSL và độc đáo hơn nữa là time-based URL, nghĩa là URL để download hay upload hay truy cập site trong AWS có thể expire sau một thời gian &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-coding-convention.html"&gt;nhất định&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(theo &lt;a href="http://www.ibm.com/developerworks/linux/library/l-cloud-computing/"&gt;IBM developerWorks&lt;/a&gt; và &lt;a href="http://my.opera.com/Alibobo"&gt;blog Alibobo&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-517649734920398532?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/517649734920398532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=517649734920398532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/517649734920398532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/517649734920398532'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/cloud-computing-basics.html' title='Cloud Computing basics'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4096895815484211710</id><published>2009-01-24T10:11:00.004+07:00</published><updated>2009-02-04T23:45:34.390+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>2009 informatic technologies</title><content type='html'>&lt;b&gt;Top 10 hot technologies for 2009&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;    * Virtualization (ảo hóa)&lt;br /&gt;&lt;br /&gt;    * Cloud computing (tính toán mây)&lt;br /&gt;&lt;br /&gt;    * Servers (máy chủ) &lt;br /&gt;&lt;br /&gt;    * Web-oriented architectures (kiến trúc hướng web)&lt;br /&gt;&lt;br /&gt;    * Enterprise mashups (thương mại tổng hợp)&lt;br /&gt;&lt;br /&gt;    * Specialized systems (hệ chuyên gia)&lt;br /&gt;&lt;br /&gt;    * Social software and social networking (mạng xã hội)&lt;br /&gt;&lt;br /&gt;    * Unified communications (giao tiếp thống nhất)&lt;br /&gt;&lt;br /&gt;    * Business intelligence (nghiệp vụ thông minh)&lt;br /&gt;&lt;br /&gt;    * Green IT (công nghệ tin học xanh)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Runner-up: RFID (xác định bằng tần số radio)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4096895815484211710?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4096895815484211710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4096895815484211710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4096895815484211710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4096895815484211710'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/2009-informatic-technologies.html' title='2009 informatic technologies'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2394772747057867228</id><published>2009-01-23T21:19:00.006+07:00</published><updated>2009-01-24T16:07:50.573+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Linus on Git</title><content type='html'>Trong thế giới Software Configuration Management (&lt;a href="http://en.wikipedia.org/wiki/Software_configuration_management"&gt;SCM&lt;/a&gt;, hay thường được gọi là &lt;a href="http://en.wikipedia.org/wiki/Version_control_system"&gt;VCS&lt;/a&gt; hay &lt;a href="http://en.wikipedia.org/wiki/Revision_control"&gt;RC&lt;/a&gt;) thì &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt; (Concurrent Versions System) là một bước ngoặt, ngay từ lúc ra đời đã vượt trội SCCS, RCS, SS... để trở thành SCM tiên phong mạng diện rộng (WAN, Internet). Thành công của CVS chỉ đến khoảng 2000 thì bắt đầu bị cạnh tranh mạnh mẽ bởi &lt;a href="http://subversion.tigris.org/"&gt;SVN&lt;/a&gt; (SubVersioN), và đến bây giờ thì có thể nói &lt;a href="http://www.cse.hcmut.edu.vn/~osteam/modules/smartsection/item.php?itemid=7"&gt;SVN&lt;/a&gt; đã lấn áp được CVS để trở thành VCS được ưa chuộng nhất, họa may chỉ có Perforce mới cạnh tranh được, chứ VSS hay TFS thì còn xa mới theo nổi. &lt;br /&gt;&lt;br /&gt;Tuy nhiên tương lai của SCM/VCS sẽ là &lt;a href="http://en.wikipedia.org/wiki/Distributed_revision_control"&gt;distributed SCM&lt;/a&gt;, trong đó ứng cử viên sáng giá nhất hiện nay là &lt;a href="http://git.or.cz/index.html"&gt;Git&lt;/a&gt;, kế đến là Bazaar và Mercurial. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://git-scm.com"&gt;Git&lt;/a&gt; là một VCS mã nguồn mở dạng phân tán , được Linus Torvard viết ra nhằm thay thế 1 DSCM khác là BitKeeper , khi tác giả BK quyết định đổi license của BK. Và hiện nay Git được sử dụng thay cho BitKeeper trong việc phát triển kernel &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/linux-directory-structure.html"&gt;Linux&lt;/a&gt;, cũng như đang mở rộng ra nhiều ứng dụng khác (X-server, Samba, Qt, WINE, Perl, Android, RoR, VLC, &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/javascript-libraries-overview.html"&gt;Prototype&lt;/a&gt;, ...) . &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Các bạn có thể &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/learning-with-youtube.html"&gt;xem&lt;/a&gt; đoạn Linus Torvards giới thiệu về Git tại Google Tech Talk:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4XpnKHJAok8&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/4XpnKHJAok8&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Điều ấn tượng nhất với tôi qua cuộc &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/english-listening-practice.html"&gt;nói chuyện&lt;/a&gt; này, đó là Linus không hề có vẻ gì là "&lt;a href="http://mediocre-ninja.blogspot.com/2008/11/computer-hackers-exposed.html"&gt;geek&lt;/a&gt;" hay "anti-social" như nhiều người vẫn nghĩ, trái lại kỹ năng dẫn dắt vấn đề thu hút, trình bày dễ hiểu và hấp dẫn của anh đáng để khâm phục và học hỏi. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Một người có sức sáng tạo dĩ nhiên là một người thích khôi hài rồi, có phải không ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2394772747057867228?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2394772747057867228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2394772747057867228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2394772747057867228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2394772747057867228'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/trong-th-gii-scm-hay-thng-c-gi-l-vcs.html' title='Linus on Git'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4758231521768725337</id><published>2009-01-22T18:58:00.007+07:00</published><updated>2009-02-01T14:41:15.077+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><title type='text'>Top FireFox extensions</title><content type='html'>IMHO:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;* Top 5 extensions for general users : &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;+ AdBlock Plus&lt;br /&gt;&lt;br /&gt;+ DownThemAll(Linux,Mac)/FlashGot(Windows)&lt;br /&gt;&lt;br /&gt;+ Session Manager&lt;br /&gt;&lt;br /&gt;+ Download Status Bar (probably deprecated since FF 3.0)&lt;br /&gt;&lt;br /&gt;+ FasterFox&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Runner-up : Colorful Tabs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;* Top 5 extensions for web developers : &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;+ FireBug&lt;br /&gt;&lt;br /&gt;+ Grease Monkey&lt;br /&gt;&lt;br /&gt;+ IE View Lite&lt;br /&gt;&lt;br /&gt;+ MeasureIt&lt;br /&gt;&lt;br /&gt;+ ColorZilla&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Runner-up : Html Validator&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;* Top 5 extensions for Internet addicts : &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;+ Foxmarks&lt;br /&gt;&lt;br /&gt;+ Fast Video Download&lt;br /&gt;&lt;br /&gt;+ FireShot&lt;br /&gt;&lt;br /&gt;+ Interclue&lt;br /&gt;&lt;br /&gt;+ FoxyProxy&lt;br /&gt;&lt;br /&gt;Runner-Up: Cooliris&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Am I missing some thing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4758231521768725337?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4758231521768725337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4758231521768725337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4758231521768725337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4758231521768725337'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/top-firefox-extensions.html' title='Top FireFox extensions'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-796326949614041160</id><published>2009-01-13T21:19:00.006+07:00</published><updated>2010-09-11T19:35:50.397+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><title type='text'>ThunderBird duplicate mails</title><content type='html'>To make &lt;a href="http://mediocre-ninja.blogspot.com/2009/01/thunderbird-gmail-imap.html"&gt;ThunderBird&lt;/a&gt; automatically handle possible duplicate emails, you can edit the value of &lt;b&gt;"mail.server.default.dup_action"&lt;/b&gt; in its &lt;b&gt;prefs.js&lt;/b&gt; (or use its Config Editor) :&lt;br /&gt;&lt;br /&gt;* 0 - (default value) retrieves duplicate mails like normal mails.&lt;br /&gt;* 1 - duplicate mails will be deleted automatically once retrieved&lt;br /&gt;* 2 - duplicated mails will be moved right into the trash&lt;br /&gt;* 3 - finally marks duplicate mails as read&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To remove those duplicate ones which has already been retrieved, you should install the &lt;a href="https://addons.mozilla.org/thunderbird/addon/956"&gt;"Remove Duplicate Messages"&lt;/a&gt; add-on.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-796326949614041160?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/796326949614041160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=796326949614041160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/796326949614041160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/796326949614041160'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/thunderbird-duplicate-mails.html' title='ThunderBird duplicate mails'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1417384133870059466</id><published>2009-01-12T22:43:00.006+07:00</published><updated>2009-01-23T20:41:35.605+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java coding convention [2]</title><content type='html'>Trong bài đề cập về &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-coding-convention.html"&gt;coding convention&lt;/a&gt; của Java (http://mediocre-ninja.blogspot.com/2008/11/java-coding-convention.html), hầu như các điểm đã nêu đều phù hợp với &lt;a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html"&gt;convention của Sun&lt;/a&gt; và bao quát gần hết các điểm đáng chú ý. Tuy nhiên thực tế cho thấy còn vài vấn đề thường gặp về coding style mà quy ước của Sun cũng chưa đề cập, hoặc ngay cả bộ sun-JDK cũng không nhất quán (inconsistent). &lt;br /&gt;&lt;br /&gt;Chẳng hạn, một vấn đề về &lt;a href="http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367"&gt;quy ước đặt tên&lt;/a&gt; (naming convention) khi đặt tên lớp (class name) hoặc tên phương thức (method name), theo Sun thì class sẽ capitalize theo PascalCase (UpperCamelCase), còn method thì theo camelCase (lowerCamelCase) : &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Class names should be nouns, in mixed case with the first letter of each internal word capitalized. &lt;br /&gt;Methods should be verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;nhưng trường hợp class/method có dùng các từ viết tắt (quen thuộc) như: HTTP, XML, URL,... thì sao? Liệu chúng ta nên viết hoa toàn bộ (all uppercase) cụm từ đó, hay là chuyển nó thành CamelCase ? Trong bộ JDK thì Sun có dùng cả 2 cách, trong đó cách thứ nhất chiếm số lượng nhiều hơn.&lt;br /&gt;&lt;br /&gt;Theo tôi thì 2 chọn lựa trên mỗi cách đều có ưu và khuyết điểm : &lt;br /&gt;&lt;br /&gt;+ Viết hoa toàn bộ cụm viết tắt: đang được Sun ủng hộ, các ưu nhược điểm: ...   &lt;br /&gt; &lt;br /&gt;+ Viết cụm đó thành dạng CamelCase : được cộng đồng Open Source (Apache, Spring, Hibernate, ... ) ủng hộ, có các ưu nhược điểm: ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vậy chúng ta nên chọn cách nào ? &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, tôi ủng hộ cách thứ 2, tức là cách &lt;b&gt;always use strict camelCase for naming method&lt;/b&gt;, bởi vì:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1417384133870059466?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1417384133870059466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1417384133870059466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1417384133870059466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1417384133870059466'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-2.html' title='Java coding convention [2]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6342264542011131616</id><published>2009-01-11T21:15:00.007+07:00</published><updated>2010-01-01T12:54:16.509+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>ThunderBird Gmail IMAP</title><content type='html'>&lt;div&gt;+ Trước tiên đăng nhập vào web mail.google.com, bật chức năng IMAP : &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Settings -&gt; &lt;span class="Apple-style-span"   style="  font-weight: bold; font-family:arial, sans-serif;font-size:13px;"&gt;&lt;a idlink="" href="http://mail.google.com/mail/#settings/fwdandpop" class="f0 ou" hidefocus="true" style="color: rgb(0, 0, 0); cursor: text; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; "&gt;Forwarding and POP/IMAP&lt;/a&gt; -&gt; IMAP access -&gt; Status: Enable IMAP &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ Tạo account mới trong ThunderBird với tài khoản Gmail :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;span class="Apple-style-span"   style="  -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Arial, Helvetica, sans-serif;font-size:13px;"&gt;&lt;strong&gt;Tools -&gt; Account Settings -&gt; &lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;strong&gt;Add Account -&gt;&lt;/strong&gt; &lt;strong&gt;Email account&lt;/strong&gt; -&gt; &lt;strong&gt;Next&lt;/strong&gt; : nhập tài khoản mail Google (ví dụ: &lt;i&gt;username@gmail.com&lt;/i&gt; ) &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ Chọn phương thức lấy thư, server lấy thư, server gởi thư: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Next&lt;/b&gt; : type of incoming server -&gt; &lt;b&gt;IMAP&lt;/b&gt; ; Incoming server -&gt; &lt;b&gt;imap.gmail.com&lt;/b&gt; ; Outgoing server -&gt; &lt;b&gt;smtp.gmail.com&lt;/b&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ Chọn tên hiển thị trong thư gởi đi và thư nhận : để đơn giản nên điền chính tài khoản mail Google &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Next&lt;/b&gt; : Incoming User Name: &lt;i&gt;username@gmail.com&lt;/i&gt; , Outgoing User Name: &lt;i&gt;username@gmail.com&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ Chọn tên đại diện cho tài khoản trong Thunder Bird: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;b&gt;Next -&gt; AccountName&lt;/b&gt; : "gì cũng được :) " -&gt; &lt;b&gt;Next -&gt; Finish&lt;/b&gt; !&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ Thiết lập trong ThunderBird (Account Settings), phần máy chủ nhận (Server Setting) : &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;strong&gt;Server Settings&lt;/strong&gt; -&gt; &lt;strong&gt;Port&lt;/strong&gt; : &lt;span style="font-family:Courier New, Courier, mono;"&gt;993&lt;/span&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;- &lt;b&gt;Server Settings&lt;/b&gt; -&gt; &lt;strong&gt;Security Settings&lt;/strong&gt; -&gt; &lt;strong&gt;Use secure connection&lt;/strong&gt; -&gt;  &lt;strong&gt;SSL&lt;/strong&gt; .&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;+ Thiết lập trong ThunderBird (Account Settings), phần máy chủ gởi (Outgoing server SMTP) : &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Chọn tài khoản tương ứng (thường có chữ Default) -&gt; &lt;b&gt;Edit&lt;/b&gt; -&gt; &lt;b&gt;Server Name&lt;/b&gt; : smtp.gmail.com ; &lt;b&gt;Port&lt;/b&gt; : 587 (hoặc 25 ) ; &lt;b&gt;User name and password&lt;/b&gt; : &lt;i&gt;username@gmail.com&lt;/i&gt; (nên điền đủ cả phần @) ; &lt;b&gt;Use secure connection&lt;/b&gt; : &lt;i&gt;TLS, if available&lt;/i&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;+ OK, OK , thiết lập cơ bản vậy là xong ! Bây giờ có thể thử get mail và send mail :-) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Còn phần Recommended Settings sẽ ở 1 post sau :-) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have fun, &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6342264542011131616?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6342264542011131616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6342264542011131616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6342264542011131616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6342264542011131616'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/thunderbird-gmail-imap.html' title='ThunderBird Gmail IMAP'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4158680078584313198</id><published>2009-01-10T10:32:00.003+07:00</published><updated>2009-01-15T21:46:57.287+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JavaCard quick notes [4]</title><content type='html'>&lt;b&gt;=== JavaCard architecture overview ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Smart cards represent one of the smallest computing platforms in use today. The greatest challenge of Java Card technology design is to fit Java system software in a smart card while conserving enough space for applications. The solution is to support only a subset of the features of the Java language and to apply a split model to implement the Java virtual machine - JavaCard virtual machine.&lt;br /&gt;&lt;br /&gt;The Java Card virtual machine is split into two part: one that runs off-card and the other that runs on-card. Smart cards differ from desktop computers in several ways. The memory configuration of a smart card might have on the order of 1K of RAM, 16K of EEPROM, and 24K of ROM. In addition to providing Java language support, Java Card technology defines a runtime environment that supports the smart card memory, communication, security, and application execution model. The Java Card runtime environment conforms to the smart card international standard ISO 7816.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java Card technology essentially defines a platform on which appli-&lt;br /&gt;cations written in the Java programming language can run in smart cards and other&lt;br /&gt;memory-constrained devices. (Applications written for the Java Card platform are&lt;br /&gt;referred to as applets.) Because of the split virtual machine architecture, this plat-&lt;br /&gt;form is distributed between the smart card and desktop environment in both space&lt;br /&gt;and time. It consists of three parts, each defined in a specification.&lt;br /&gt;&lt;br /&gt;• The Java Card 2.1 Virtual Machine (JCVM) Specification defines a subset of the Java programming language and virtual machine definition suitable for smart card applications.&lt;br /&gt;&lt;br /&gt;• The Java Card 2.1 Runtime Environment (JCRE) Specification precisely describes Java Card runtime behavior, including memory management, applet management, and other runtime features.&lt;br /&gt;&lt;br /&gt;• The Java Card 2.1 Application Programming Interface (API) Specification describes the set of core and extension Java packages and classes for programming smart card applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Supported and Unsupported features in JavaCard :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J3Ejob9sTKI/SP6NUibB89I/AAAAAAAAAD8/ojfcYydlBb8/s1600-h/5.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_J3Ejob9sTKI/SP6NUibB89I/AAAAAAAAAD8/ojfcYydlBb8/s320/5.JPG" alt="" id="BLOGGER_PHOTO_ID_5259796798792397778" border="0" /&gt;&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4158680078584313198?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4158680078584313198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4158680078584313198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4158680078584313198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4158680078584313198'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/javacard-quick-notes-4.html' title='JavaCard quick notes [4]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_J3Ejob9sTKI/SP6NUibB89I/AAAAAAAAAD8/ojfcYydlBb8/s72-c/5.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5565478271647846522</id><published>2009-01-09T20:32:00.007+07:00</published><updated>2009-01-11T23:03:38.883+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Software 2009 forecast</title><content type='html'>Well, ai cũng biết là 2008 là năm trượt giá đáng kể ở VN kể từ khi mở cửa. Nhiều người cũng thấy cảnh khó khăn của nhiều công ty phần mềm trong nửa sau 2008, ảnh hưởng của khó khăn xuất phát từ nền kinh tế Hoa Kỳ, cũng như vài chính sách củ chuối của bác Ba Dũng. &lt;br /&gt;Do đó không nhất thiết phải là 1 genius để tiên đoán về khó khăn của ngành phần mềm năm 2009, không chỉ ở VN. Nhưng cứ thử xem sao :-) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tổng kết lại, có thể thấy những thay đổi sẽ diễn ra trong các năm tới đây:&lt;br /&gt;&lt;br /&gt;* Những kỹ sư phần mềm có trình độ cao, có nhiệt huyết và &lt;b&gt;tham vọng&lt;/b&gt; sẽ là những cỗ máy làm ra tiền.&lt;br /&gt;&lt;br /&gt;* Những lập trình viên không có kỹ năng đặc biệt có lẽ nên tìm việc làm ở lĩnh vực khác.&lt;br /&gt;&lt;br /&gt;* Những thay đổi mà chúng ta đang thấy ở thị trường phần mềm đại chúng sẽ diễn ra ở các công ty lớn.&lt;br /&gt;&lt;br /&gt;* Đưa phần mềm cho nước ngoài gia công (outsourcing) sẽ ngày càng ít tính kinh tế hơn.&lt;br /&gt;&lt;br /&gt;* Khoa học máy tính vẫn là lĩnh vực cạnh tranh và đòi hỏi cao.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==&gt; Tương lai của các LTV Việt Nam:&lt;br /&gt;&lt;br /&gt;Nhìn các xu hướng đang diễn ra trên thế giới, có thể thấy rằng các dự án cần hàng trăm người sẽ ngày càng ít đi. Theo tính toán của Mỹ, chi phí outsourcing đang gia tăng (từ 1/10 lên 1/3 so với giá thành sản xuất trong nước) làm cho &lt;b&gt;việc đưa phần mềm ra nước ngoài gia công ngày càng kém hấp dẫn&lt;/b&gt;. Ngoài ra, do khó khăn về giao tiếp và chệnh lệch về trình độ, chất lượng các dự án này cũng không được như mong muốn và rất khó bắt kịp các thay đổi của khách hàng.&lt;br /&gt;&lt;br /&gt;Các LTV luôn có xu hướng muốn gia nhập các công ty lớn, tham gia vào các dự án lớn. Nhưng có thể đấy sẽ cách tiếp cận sai lầm vì:&lt;br /&gt;&lt;br /&gt;* Tương lai của các công ty làm xuất khẩu phần mềm dạng này đang ngày càng bấp bênh.&lt;br /&gt;&lt;br /&gt;* Bản thân các LTV thường không cải thiện được trình độ vì các công việc được giao ít cần kỹ năng cao hay tính sáng tạo.&lt;br /&gt;&lt;br /&gt;Tất nhiên, nhìn thẳng vào thực tế, sự thay đổi sẽ không diễn ra ngay trong nay mai — mô hình thác nước và các biến thể của nó vẫn sẽ được dùng, người ta sẽ vẫn outsourcing. Nhưng mọi thứ sẽ ngày càng khó khăn hơn, đòi hỏi cao hơn và chỉ khi bạn thực sự chuẩn bị tốt cho sự thay đổi thì mới tránh được việc bị đào thải.&lt;br /&gt;&lt;br /&gt;Đáng lo ngại nhất là &lt;b&gt;các LTV Việt Nam còn xa mới theo kịp các đồng nghiệp ở các nước như Ấn Độ&lt;/b&gt; hay Ireland cả về mặt tổ chức lẫn kỹ năng. Chúng ta quá chú trọng tới các công nghệ độc quyền của Microsoft, Oracle hay IBM và hiểu biết về mã nguồn mở là một lỗ hổng lớn. Không may, có thể ngày mai công ty sẽ nói lời chia tay với bạn chỉ vì bạn không có kinh nghiệm gì về Python hay cơ sở dữ liệu MySQL. Như tựa một bộ phim "Đó là một tương lai không quá xa" (Not too far future), xin hãy suy nghĩ lại con đường của mình.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(có trích đoạn từ &lt;a href="http://my.opera.com/Alibobo/blog/xp-my-first-book"&gt;blog của Chương Alibobo&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5565478271647846522?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5565478271647846522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5565478271647846522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5565478271647846522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5565478271647846522'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/software-2009-forecast.html' title='Software 2009 forecast'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4790220069055868189</id><published>2009-01-08T23:39:00.009+07:00</published><updated>2009-01-22T21:08:25.883+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex-ActionScript-Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>BlazeDS quick notes</title><content type='html'>&lt;b&gt;=== What is BlazeDS? ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Java remoting and Messaging Technology.&lt;br /&gt;&lt;br /&gt;+ Enables developers to connect to back-end distributed data and push data in real-time to Adobe Flex and Adobe AIR applications&lt;br /&gt;&lt;br /&gt;+ Open Source&lt;br /&gt;&lt;br /&gt;+ From SOAP to &lt;a href="http://osflash.org/documentation/amf"&gt;AMF&lt;/a&gt; (Action Message Format)&lt;br /&gt;&lt;br /&gt;+ 10 times faster than XML based protocols, how?&lt;br /&gt;&lt;br /&gt;+ Previously known as Adobe &lt;a href="http://en.wikipedia.org/wiki/Adobe_LiveCycle#LiveCycle_Data_Services_ES"&gt;LCDS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://blog.rainer.eschen.name/wp-content/uploads/2008/07/blazeds.png"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Remoting (RPC) ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Instead of Contacting services, RPC components contact 'Destinations'&lt;br /&gt;&lt;br /&gt;+ Destination: Manageable Service Endpoints &lt;br /&gt;&lt;br /&gt;+ Managed using XML based configuration file&lt;br /&gt;&lt;br /&gt;+ 'Remote Object' not possible without BlazeDS &lt;br /&gt;( Adobe Flash Player blocks request to any external hosts, solution? )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;crossdomain.xml&lt;/b&gt;  required  ( For apps that are not using BlazeDS )&lt;br /&gt;&lt;br /&gt;+ XML file that indicates: &lt;br /&gt;- Data and documents are available to SWF files served from certain/all domains&lt;br /&gt;- Must be in 'web root' of the server&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== AMF (10 times faster!) ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Compact binary format for data serialization/ deserialization and remote method invocation. &lt;br /&gt;&lt;br /&gt;+ Object encoding controls how objects are represented in &lt;b&gt;Action Message Format&lt;/b&gt; (AMF). &lt;br /&gt;&lt;br /&gt;+ Representation that can be transferred over HTTP/HTTPS. &lt;br /&gt;&lt;br /&gt;+ As data size increases the performance benefits of using BlazeDS increase exponentially.  &lt;br /&gt;&lt;br /&gt;+ AMF improves performance by&lt;br /&gt;- Dramatically compressing the size of data transferred.&lt;br /&gt;- Parsing binary data into objects in memory far more efficiently than parsing XML data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Quick Brief ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Message Agents: &lt;br /&gt;- Message Producers &amp; Consumers&lt;br /&gt;- Exchange messages through a common destination&lt;br /&gt;&lt;br /&gt;+ Channel and endpoints&lt;br /&gt;- Formats, Translates messages into network-specific form.&lt;br /&gt;- Delivers to the endpoint (on the server)&lt;br /&gt;- Server-Side Channel Unmarshals messages&lt;br /&gt;- Configuration settings ( XML files) at runtime&lt;br /&gt;&lt;br /&gt;+ Message Broker&lt;br /&gt;- Routes messages to the appropriate service based on its type&lt;br /&gt;&lt;br /&gt;+ Channel Types&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Channel Configuration ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Configure channels using &lt;b&gt;services-config.xml&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ AMF protocol use an optimization technique&lt;br /&gt;&lt;br /&gt;+ Assign channel at runtime( AS Code) by creating a ChannelSet object, and adding a channel to it.&lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;var cs:ChannelSet = new ChannelSet();&lt;br /&gt;var channel:Channel = new AMFChannel(“name”, endpoint)&lt;br /&gt;cs.addChannel(channel);&lt;br /&gt;Remoteobject.channelSet = cs;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Remote Object components ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Access methods of server-side java objects.&lt;br /&gt;&lt;br /&gt;+ No need to specify 0bjects as operations in web services&lt;br /&gt;&lt;br /&gt;+ Use RemoteObject component in MXML/AS&lt;br /&gt;&lt;br /&gt;+ Server - Proxied access to an RPC service&lt;br /&gt;&lt;br /&gt;+ Communication happens over a 'destination'&lt;br /&gt;&lt;br /&gt;+ Configured in the &lt;b&gt;remoting-config.xml&lt;/b&gt; &lt;br /&gt;- RPC method or URL, channel,  adapter&lt;br /&gt;&lt;br /&gt;+ Asynchronous communication&lt;br /&gt;- AsyncToken object &lt;br /&gt;&lt;br /&gt;+ Http Service and web service use &lt;b&gt;proxy-service.xml&lt;/b&gt; for configuration.&lt;br /&gt;- Limit access to specific URL&lt;br /&gt;- Provide Security&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== BlazeDS with Tomcat ===&lt;/b&gt;&lt;br /&gt;+ Unzip the blazeds-turnkey file on to your C: drive&lt;br /&gt;(Blazeds comes with Tomcat default.)&lt;br /&gt;&lt;br /&gt;+ Create a new application: C:\blazeds\tomcat\webapps&lt;br /&gt;&lt;br /&gt;+ Copy &amp; paste the META-INF, WEB-INF folder from the samples (zip) file. &lt;br /&gt;&lt;br /&gt;+ Store all your java class files in WEB-INF/classes folder&lt;br /&gt;&lt;br /&gt;+ Configure remoting-config.xml under WEB-INF/flex/  for all your remoting related details (destinations) . Create a &lt;property/&gt; and a specify a &lt;source/&gt; &lt;br /&gt;&lt;br /&gt;+ Configure messaging-config.xml under WEB-INF/flex for all your messaging (real-time) by adding your destination&lt;br /&gt;&lt;br /&gt;+ For all other service related details use the proxy-config.xml&lt;br /&gt;&lt;br /&gt;+ Give references of all these xml files in services-config.xml (done by default)&lt;br /&gt;&lt;br /&gt;+ Run your application http://&lt;localhost/ip&gt;:&lt;portno&gt;/&lt;appname&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4790220069055868189?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4790220069055868189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4790220069055868189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4790220069055868189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4790220069055868189'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/blazeds-quick-notes.html' title='BlazeDS quick notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4723536424065091309</id><published>2009-01-07T23:00:00.004+07:00</published><updated>2009-01-15T21:24:41.930+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Basic Eclipse plugins</title><content type='html'>Some update sites of useful plugins for Eclipse 3.4 (Ganymede) , but most of them can work with Eclipse 3.3 (Europa) and even 3.2 !&lt;br /&gt;Just for not having to google them again :D&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;1/ SubVersioN client: &lt;strike&gt; Subversive &lt;/strike&gt;  Subclipse&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://subclipse.tigris.org/update_1.4.x/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;2/ Project build:  &lt;strike&gt; Ant &lt;/strike&gt;  Maven2 (m2eclipse)&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://m2eclipse.sonatype.org/update/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;3/ Coding style:  &lt;strike&gt; Checkstyle &lt;/strike&gt;  PMD&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://pmd.sourceforge.net/eclipse/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;4/ Code coverage: &lt;strike&gt; Cobertura &lt;/strike&gt; Emma (eclemma)&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://update.eclemma.org/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;5/ Continuous integration:  &lt;strike&gt; LuntBuild &lt;/strike&gt;  Hudson (hudson-eclipse)&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://hudson-eclipse.googlecode.com/svn/trunk/hudson-update/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;6/ Unit test:  &lt;strike&gt; JUnit &lt;/strike&gt;  TestNG&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://beust.com/eclipse/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;7/ ORM framework:  &lt;strike&gt; iBatis &lt;/strike&gt;  Hibernate (HibernateTools)&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://download.jboss.org/jbosstools/updates/stable/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;8/ POJO framework:  &lt;strike&gt; Seam &lt;/strike&gt;  Spring (SpringIDE)&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;http://springide.org/updatesite/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... (FlexBuilder, WTP, Unitils, DbUnit, liquidBase, etc ) ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4723536424065091309?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4723536424065091309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4723536424065091309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4723536424065091309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4723536424065091309'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/basic-eclipse-plugins.html' title='Basic Eclipse plugins'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6898256315011131505</id><published>2009-01-05T00:24:00.004+07:00</published><updated>2009-01-11T21:38:06.356+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JavaCard quick notes [3]</title><content type='html'>&lt;b&gt;=== Quy trình phát triển một "cardlet" ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nhúng sâu vào &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/javacard-quick-notes.html"&gt;lý thuyết&lt;/a&gt; để hiểu tường tận cơ chế. &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/javacard-quick-notes-2.html"&gt;Tiếp theo&lt;/a&gt;, mình note thêm về &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/scrum-software-development.html"&gt;Qui trình&lt;/a&gt; phát triển ra một Cardlet&lt;br /&gt;(Applet từ đúng kỹ thuật là JavaCard Applet, nhưng nó trùng với Java Web Applet, nên mình thích gọi là "cardlet" hơn).&lt;br /&gt;&lt;br /&gt;Mô hình dưới đây sẽ khái quát qui trình &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;phát triển&lt;/a&gt; mã nguồn, thử nghiệm và kết xuất ra đầu cuối cho thiết bị của một applet:&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPwJBf07wzI/AAAAAAAAAD0/chTVppuohO0/s1600-h/4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPwJBf07wzI/AAAAAAAAAD0/chTVppuohO0/s320/4.JPG" alt="" id="BLOGGER_PHOTO_ID_5259088386189935410" border="0" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;- Step 1: Bằng bất cứ một trình soạn thảo nào bạn cũng có thể tạo ra một applet theo cấu trúc mẫu. Hoặc đơn giản hơn thì có thể dùng &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-power-tools.html"&gt;các IDE&lt;/a&gt; hỗ trợ (eclipse + jcop plugin) để tạo ra một applet bao gồm tập các file .java và dùng trình biên dịch chuẩn build thành các .class file.&lt;br /&gt;&lt;br /&gt;- Step 2: Bằng công cụ hỗ trợ (JCOP plugin hoặc &lt;a href="http://eclipse-jcde.sourceforge.net/"&gt;JavaCard Develop Environmen - JCDE2&lt;/a&gt;)  để test, debug trên môi trường ảo do công cụ thiết lập.&lt;br /&gt;&lt;br /&gt;- Step 3: Khi tiến hành build applet, bộ công cụ cũng biên tập ra các file .cap và các file .export bằng bộ Java converter. Các file .cap, .export là những tài nguyên sẽ được dùng để cài đặt trực tiếp lên các thẻ thật, thành các applet thật trên chip JavaCard. Mỗi CAP file là thể hiện của một "package" đã được tạo. Nếu cardlet có kết hợp nhiều package, thì mỗi package sẽ convert thành một .cap file và 1 .export file.&lt;br /&gt;&lt;br /&gt;- Step 4: Sau khi đã &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-test-tools.html"&gt;test&lt;/a&gt;, debug và kiểm tra cardlet hoàn tất, xem như cardlet đã sẵn sàng để được tải lên card. Tài nguyên là các cap file và export file sẽ được dùng để tải lên card thật.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6898256315011131505?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6898256315011131505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6898256315011131505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6898256315011131505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6898256315011131505'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/javacard-quick-notes-3.html' title='JavaCard quick notes [3]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_J3Ejob9sTKI/SPwJBf07wzI/AAAAAAAAAD0/chTVppuohO0/s72-c/4.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8030330181918120807</id><published>2009-01-03T22:48:00.002+07:00</published><updated>2009-01-10T00:48:52.626+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>PostgreSQL on HardyHeron</title><content type='html'>This is for Ubuntu (8.04 LTS) , but can be also applied for others.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Install PostgreSQL (8.3) ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1/ Install the DBMS :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;$ sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(the postgresql-contrib is optional, it's just some additional facilities for Postgres)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ Install the GUI client (pgadmin or pg-client) to manage :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;$ sudo apt-get install pgadmin3 postgresql-client&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3/ Change password for user 'postgres' :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;$ sudo su postgres -c psql&lt;br /&gt;postgres=# ALTER USER postgres WITH PASSWORD 'password';&lt;br /&gt;postgres=# \q&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4/  Enable access from outside localhost (if needed) :&lt;br /&gt;&lt;br /&gt;To do this, you may edit either postgresql.conf or pg_hba.conf or pg_ident.conf , their location in Ubuntu is /etc/postgresql/8.3/main/ . Perhaps the K.I.S.S way is to add a line into pg_hba.conf to pick the corresponding IPv4 subnet to be allowed:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;host all postgres 192.168.1.0/24 md5  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(That line means all private IPs 192.168.1.x will be allowed to connect Postgres) &lt;br /&gt;&lt;br /&gt; To make sure the change is applied, restart the deamon :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;$ sudo /etc/init.d/postgresql-8.3 restart  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Some basic PostgreSQL commands ===&lt;/b&gt; &lt;br /&gt;(to be updated)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8030330181918120807?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8030330181918120807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8030330181918120807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8030330181918120807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8030330181918120807'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/postgresql-on-hardyheron.html' title='PostgreSQL on HardyHeron'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3042993248288472104</id><published>2009-01-02T20:35:00.016+07:00</published><updated>2009-01-22T20:13:21.843+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql-PostgreSql-SqLite'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JPA quick notes</title><content type='html'>(retrieved from Mike Keith and his famous book &lt;a href="http://www.amazon.com/review/product/1590596455"&gt;"Pro EJB3 - Java Persistence API"&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://en.wikipedia.org/wiki/Java%20Persistence%20API"&gt;Java Persistence API&lt;/a&gt; (JPA) is the Java standard for mapping Java objects to a relational database. Even though proprietary mapping products like &lt;a href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29"&gt;Hibernate&lt;/a&gt; and TopLink still exist, they are now focused on providing their functionality through the JPA API, allowing all applications to be portable across JPA implementations. This short article will give users enough to understand the basics of JPA and get started writing JPA applications. It covers entities, identifers, &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;O-R mappings&lt;/a&gt;, using an entity manager, creating and executing queries, and confguration of the &lt;b&gt;persistence.xml&lt;/b&gt; file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The basic unit of persistence in JPA is the &lt;b&gt;entity&lt;/b&gt;, which is nothing more than a regular Java class with metadata to describe how its state maps to the database tables. Metadata may be in the form of &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/saved.html"&gt;annotations&lt;/a&gt; on the entity class itself, or it may be an accompanying XML file, but we are using annotations since they are easier to specify and understand.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Every entity class should have an &lt;b&gt;@Entity&lt;/b&gt; marker and an identifier field, indicated by &lt;b&gt;@Id&lt;/b&gt;, that is mapped to the primary key column in the database. When a field contains simple data and maps to a regular column in the database we call it a basic mapping, thus an identifier field is a special kind of basic mapping. When an entity has a field that references one or more other entities, that field maps to a foreign key column, and is called a relationship field. Other than the identifier field, basic mappings do not need to be annotated, but relationships must be specified by their relationship cardinality.&lt;br /&gt;&lt;br /&gt;Defaulting rules in JPA mean that you are not required to specify table names and column names that an entity is mapped to. If you are not happy with the JPA-assigned defaults then you can always override them through the use of additional mapping&lt;br /&gt;metadata. For example, by putting &lt;b&gt;@Table&lt;/b&gt; on the entity class you can make the table name explicit, and by annotating a basic mapping feld with &lt;b&gt;@Column&lt;/b&gt; you can defne the particular column that maps the state in that feld. Likewise &lt;b&gt;@JoinColumn &lt;/b&gt; is used to override the name of the foreign key column for relationship references.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 1 - pet entity&lt;br /&gt;@Entity&lt;br /&gt;@Table(name="PET_INFO")&lt;br /&gt;public class Pet {&lt;br /&gt;@Id&lt;br /&gt;@Column(name="ID")&lt;br /&gt;int licenseNumber;&lt;br /&gt;String name;&lt;br /&gt;PetType type;&lt;br /&gt;@ManyToOne&lt;br /&gt;@JoinColumn(name="OWNER_ID")&lt;br /&gt;Owner owner;&lt;br /&gt;//...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Listing 2 - pet owner entity&lt;br /&gt;@Entity&lt;br /&gt;public class Owner {&lt;br /&gt;@Id&lt;br /&gt;int id;&lt;br /&gt;String name;&lt;br /&gt;@Column(name="PHONE_NUM")&lt;br /&gt;String phoneNumber;&lt;br /&gt;@OneToOne&lt;br /&gt;Address address;&lt;br /&gt;@OneToMany(mappedBy="owner")&lt;br /&gt;List&lt;pet&gt; pets;&lt;br /&gt;//...&lt;br /&gt;}&lt;br /&gt;&lt;/pet&gt;&lt;/div&gt;&lt;br /&gt;In a bidirectional relationship pair, such as the &lt;b&gt;@OneToMany&lt;/b&gt; relationship in Owner to Pet and the &lt;b&gt;@ManyToOne&lt;/b&gt; relationship back from Pet to Owner, only one foreign key is required in one of the tables to manage both sides of the relationship. As a general rule, the side that does not have the foreign key in it specifes a mappedBy attribute in the relationship annotation and specifes the feld in the related entity that maps the foreign key.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;EntityManager&lt;/b&gt; class is the main API in JPA. It is used to create new entities, manufacture queries to return sets of existing entities, merge in the state of remotely modified entities, delete entities from the database, and more.&lt;br /&gt;There are, generally speaking, two main kinds of entity managers:&lt;br /&gt;&lt;br /&gt;* container-managed : The managed entity managers may only be obtained within a container that supports the JPA Service Provider Interface (SPI).&lt;br /&gt;&lt;br /&gt;* non-managed : Non-managed entity managers may be obtained in any environment where a JPA provider is on the classpath. Listing 3 shows an example of obtaining&lt;br /&gt;a non-managed entity manager by frst obtaining an EntityManagerFactory instance from the Persistence root class.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 3 – Obtaining a non-managed entity manager&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;//...&lt;br /&gt;EntityManagerFactory emf = Persistence.createEntityManagerFactory("PetShop");&lt;br /&gt;EntityManager em = emf.createEntityManager();&lt;br /&gt;//...&lt;br /&gt;em.close();&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In Listing 4 we see how a standard host container can provide a simpler way to obtain an entity manager. The only catch is that this is only supported within standard Java EE components (or containers that are compliant to the JPA container contract), so this example uses a stateless session bean.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 4 – Injecting a managed entity manager&lt;br /&gt;@Stateless&lt;br /&gt;public class MyBean implements MyInterface {&lt;br /&gt;@PersistenceContext(unitName="PetShop")&lt;br /&gt;EntityManager em;&lt;br /&gt;... &lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The basic purpose of an entity manager is to perform create/&lt;br /&gt;read/update/delete (CRUD) operations on entities. Listing 5&lt;br /&gt;shows methods that perform these operations.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 5 – Invoking the entity manager&lt;br /&gt;public Pet createPet(int idNum, String name, PetType type) {&lt;br /&gt;Pet pet = new Pet(idNum, name, type);&lt;br /&gt;em.persist(pet);&lt;br /&gt;return pet;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Pet findPet(int id) {&lt;br /&gt;return em.fnd(Pet.class, id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Pet changeName(int id, String newName) {&lt;br /&gt;Pet pet = this.fndPet(id);&lt;br /&gt;pet.setName(newName);&lt;br /&gt;return pet;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void deletePet(int id) {&lt;br /&gt;Pet pet = this.fndPet(id);&lt;br /&gt;em.remove(pet);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note that fnding the pet is the frst step to being able to perform update and delete operations on it. Also, an update does not even involve invoking the entity manager, but requires reading the pet, loading it into the entity manager and then&lt;br /&gt;modifying it. The modifcation will be refected in the database when the transaction is committed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since we just mentioned transactions, but didn’t explain them, now would be a good time to state that JPA supports two different kinds of transactions:&lt;br /&gt;&lt;br /&gt;* JTA container transactions : Used when running in container mode&lt;br /&gt;&lt;br /&gt;* resource local transactions : Typically used when running in non-container&lt;br /&gt;mode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JTA transactions are started and committed using the usual container techniques, either calling the UserTransaction API or making use of container-managed transaction demarcation in EJB or Spring. For example, if the methods in Listing 5 were in a session bean that had a Required transaction attribute setting then a transaction would be started at the beginning and committed at the end of each client method invocation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When using local transactions the transaction must be demarcated manually by invoking on the EntityTransaction instance accessed from the entity manager. Each of the three&lt;br /&gt;methods in Listing 5 that caused the database to change would need to have begin and commit calls, as shown in Listing 6 for the persist method. Methods that only read from the database do not need to occur within a transaction.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 6 – Using EntityTransaction&lt;br /&gt;public Pet createPet(int idNum, String name, PetType type) {&lt;br /&gt;em.getTransaction().begin();&lt;br /&gt;Pet pet = new Pet(idNum, name, type);&lt;br /&gt;em.persist(pet);&lt;br /&gt;em.getTransaction().commit();&lt;br /&gt;return pet;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://4.bp.blogspot.com/_lb0y07E2SRg/SXhjj5RWOeI/AAAAAAAAAAc/jlGnX6V_on8/s320/Jpa_Api_EntityManager_03.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://4.bp.blogspot.com/_lb0y07E2SRg/SXhjj66igiI/AAAAAAAAAAU/26VkQ6qsEkI/s320/Jpa_Api_EntityManager_02.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://3.bp.blogspot.com/_lb0y07E2SRg/SXhjjv9irhI/AAAAAAAAAAM/WHZCBrVG21U/s320/Jpa_Api_EntityManager_01.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dynamic queries are objects that are created from an entity manager, and then executed. The query criteria are specifed at creation time as a Java Persistence Query Language (JPQL) string. Before executing the query a number of possible configuration method calls may be made on the query instance to configure it.  Listing 7 shows an example of creating and executing a query that returns all the instances of Pet, or the frst 100 if there are more than 100 instances.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 7 – Creating and executing a dynamic query&lt;br /&gt;Query q = em.createQuery("SELECT p FROM Pet p");&lt;br /&gt;q.setMaxResults(100);&lt;br /&gt;List results = q.getResultList();&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A named query is a query that is defned statically and then&lt;br /&gt;instantiated and executed at runtime. It can be defned as an&lt;br /&gt;annotation on the entity class, and assigned a name that is&lt;br /&gt;used when the query is created. Listing 8 shows a named query&lt;br /&gt;defned on the Pet entity.&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 8 – Defning a named query&lt;br /&gt;@NamedQuery(name="Pet.fndByName",&lt;br /&gt;query="SELECT p FROM Pet p WHERE p.name LIKE :pname")&lt;br /&gt;@Entity&lt;br /&gt;public class Pet {&lt;br /&gt;//...&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The last identifer is prefxed with a colon (:) character to indicate&lt;br /&gt;that it is a named parameter that must be bound at runtime&lt;br /&gt;before the query can be executed. Listing 9 shows a method&lt;br /&gt;that executes the query by frst instantiating a Query object&lt;br /&gt;using the createNamedQuery() factory method, then binding the pname named parameter to the name that was passed into the method, and fnally executing the query by invoking getResultList().&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;//Listing 9 – Executing a named query&lt;br /&gt;public List fndAllPetsByName(String petName) {&lt;br /&gt;Query q = em.createNamedQuery("Pet.fndByName");&lt;br /&gt;q.setParameter("pname", petName);&lt;br /&gt;return q.getResultList();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some Query APIs :&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://3.bp.blogspot.com/_lb0y07E2SRg/SXho0R2DD9I/AAAAAAAAAAk/VZxVddNUO3k/s320/Jpa_Api_Query_01.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://3.bp.blogspot.com/_lb0y07E2SRg/SXho0ivKuTI/AAAAAAAAAAs/YC_t5vABknA/s320/Jpa_Api_Query_02.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Java Persistence Query Language is SQL-like, but operates over the entities and their mapped persistent attributes instead of the SQL schema. Many of the SQL functions and even reserved words are supported in JP QL.&lt;br /&gt;There are three basic types of JP QL statements, of which the&lt;br /&gt;frst is monstrously the most popular and useful: selects, bulk&lt;br /&gt;updates and bulk deletes.&lt;br /&gt;&lt;br /&gt;1.   select_clause from_clause [where_clause] [groupby_clause]&lt;br /&gt;[having_clause] [orderby_clause]&lt;br /&gt;&lt;br /&gt;2. update_clause [where_clause]&lt;br /&gt;&lt;br /&gt;3. delete_clause [where_clause]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Without counting the mappings from the entity to the database tables, there is really only one unit of JPA confguration needed to get your application up and running. It is based on the notion of a persistence unit, and is confgured in a fle called persistence.xml, which must always be placed in the META-INF directory of your deployment unit. Each persistence unit is a confguration closure over the settings necessary to run in the relevant environment. The parent element in a persistence.xml&lt;br /&gt;fle is the persistence element and may contain one or more persistence-unit elements representing different execution confgurations. Each one must be named using the mandatory persistence-unit name attribute.&lt;br /&gt;&lt;br /&gt;There are slightly different requirements for configuring the persistence unit, depending upon whether you are deploying to a managed container environment or a non-managed one. In a managed container the target database is indicated through the jta-data-source element, which is the JNDI name for the managed data source describing where the entity state is stored for that confguration unit. In a non-managed environment the target database is typically specified through the use&lt;br /&gt;of vendor-specific properties that describe the JDBC driver and connection properties to use. Also, in non-managed environments the entity classes must be enumerated in class elements, whereas in managed containers the entity classes will be automatically detected. Examples of container and non-container persistence unit elements are indicated in the Listings.&lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://1.bp.blogspot.com/_lb0y07E2SRg/SXhwJ1_nR2I/AAAAAAAAAA0/rg6XAlivhp0/s400/Jpa_Api_Config_PersistenceXml.png"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3042993248288472104?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3042993248288472104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3042993248288472104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3042993248288472104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3042993248288472104'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/jpa-quick-notes.html' title='JPA quick notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lb0y07E2SRg/SXhjj5RWOeI/AAAAAAAAAAc/jlGnX6V_on8/s72-c/Jpa_Api_EntityManager_03.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2098644749585985488</id><published>2009-01-01T19:15:00.004+07:00</published><updated>2009-01-08T23:37:35.439+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>CRUD or BREAD ?</title><content type='html'>Well, applications nowadays seem to always works with a certain database system (mostly &lt;a href="http://en.wikipedia.org/wiki/RDBMS"&gt;Relational DBMS&lt;/a&gt;). And then 90% the work of coder/developer is to select, insert, update and delete the data from database. Those operations are so popular that people refer to them as &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; , or some other terms: BREAD, ABCD, VADER, ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IMHO the BREAD term (Browse, Retrieve, Edit, Add, Delete) is better than CRUD (Create, Read, Update, Delete) .&lt;br /&gt;I will explain later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2098644749585985488?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2098644749585985488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2098644749585985488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2098644749585985488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2098644749585985488'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2009/01/crud-or-bread.html' title='CRUD or BREAD ?'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4272259409515484147</id><published>2008-12-31T20:20:00.007+07:00</published><updated>2009-02-06T23:10:44.580+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java annotations revisit</title><content type='html'>As &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-tiger-and-mustang.html"&gt;previously mentioned&lt;/a&gt;, annotation is not a "buzzword" when it is in the &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-tiger-and-mustang-2.html"&gt;Tiger&lt;/a&gt; (Java SE 5) specs. But it turns out to be the most excellent feature of Tiger, and it saves Sun reputation from community's complaint about their howlers before (such as EJB1 and EJB2). Now that a little water has flowed under the bridge, I think it is time to revisit Java Annotations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Java Annotations ===&lt;/h3&gt;&lt;br /&gt; &lt;p&gt;Annotations are presented as &lt;em&gt;metadata&lt;/em&gt; – that is data about data. In the case of Java this means that they provide information about various elements of a Java class. For example, they may &lt;em&gt;annotate&lt;/em&gt; a method, class or instance variable. One example of an annotation is to note that a method has been deprecated, or that it overrides a method in the superclass. These annotations can then be used by an &lt;em&gt;annotation processing tool&lt;/em&gt; (such as &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/apt/index.html"&gt;APT&lt;/a&gt;), or an IDE (such as Eclipse) or indeed a framework, to validate, configure or add to the original Java. For example, if you have annotated a method as overriding a parent class method, then the annotation processing can confirm that you are indeed overriding a method.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;There are seven annotations provided in the J2SE 5.0 release (see the annotations guide &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;here&lt;/a&gt;; these are provided in two packages, &lt;code&gt;java.lang&lt;/code&gt; and &lt;code&gt;java.lang.annotation&lt;/code&gt;:&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;p&gt;In the package &lt;code&gt;java.lang&lt;/code&gt; there is:&lt;/p&gt;  &lt;p&gt;• &lt;code&gt;@Deprecated&lt;/code&gt; – indicates that the associated Java element has been deprecated. It is an alternative to using the Javadoc &lt;code&gt;@deprecated&lt;/code&gt; element. A deprecated method or class is essentially one that should no longer be used and that is not guaranteed to be available in future versions of the software. It is thus often useful to know that you are using “old” versions of an API. Although the use of the Javadoc tag already allows many tools (such as Eclipse) to indicate that a language feature is deprecated, the use of the @Deprecated annotation makes this simpler and allows a wider range of tools to report on the use of deprecated features.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@Override&lt;/code&gt; - indicates that the method should override a method in the superclass.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@SuppressWarning&lt;/code&gt; – directs the compiler to suppress the specified warning.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In the package &lt;code&gt;java.lang.annotaiton&lt;/code&gt;:&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@Documented&lt;/code&gt; – directs tools to automatically generate Javadoc for the annotated element (e.g. a method or variable).&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@Inherited&lt;/code&gt; – this indicates that the associated annotation is inherited by subclass of the current class.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@Retention&lt;/code&gt; – indicates how long annotations with the annotated type are to be retained. For example, a retention type of RUNTIME indicates…&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• &lt;code&gt;@Target&lt;/code&gt; – This indicates the Java element to which associated annotations apply.&lt;/p&gt;  &lt;p&gt;It is also possible to extend the set of annotations available by defining your own annotations. This enables project, task and company specific annotations to be created.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== What are annotations for? ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;Annotations are intended to provide three basic facilities. These facilities are:&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• The provision of additional &lt;em&gt;semantics&lt;/em&gt; for various class elements. This additional semantic information can help developers to understand the intent behind some feature or implementation detail.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• The execution of additional &lt;em&gt;compile time checks&lt;/em&gt; that ensure various constraints are met.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;• The support of additional &lt;em&gt;code analysis&lt;/em&gt; by annotation-aware tools.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;None of these requirements are new and indeed many developers have found ways of overcoming the lack of any annotation-like feature in previous versions of Java.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;For example, I have tended to make extensive use of &lt;em&gt;Marker Interfaces&lt;/em&gt; over the last few years. These are interfaces that may not contain any methods, but are used to denote a particular concept or entity within an application. This is not a particularly radical idea and indeed there is an example of such an interface in the Java language itself - the &lt;code&gt;java.io.Serializable&lt;/code&gt; interface. This interface is a marker interface in that it does not require any methods to be implemented but indicates that a class is capable of being serialized via the Java Serialization mechanism.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;Such marker interface can now be replaced with annotations. We can define our own annotation that can be used to &lt;em&gt;mark&lt;/em&gt; a class as being a particular concept or entity etc.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Using annotations ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;Annotations are straightforward to use; they merely require that an appropriate annotation type be placed directly before the Java language element being annotated. For example:&lt;/p&gt; &lt;br /&gt;&lt;div class="ninja-code"&gt;public class Person {&lt;br /&gt; &lt;br /&gt;  @Override&lt;br /&gt;  public String getName() {&lt;br /&gt;  return this.name;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;&lt;p&gt;This means that when this code is compiled, or when it is analysed by tools such as Eclipse, a check can be made to ensure that the method &lt;code&gt;getName()&lt;/code&gt; does override a method in the class Person’s superclass. In this particular case, the class &lt;code&gt;Person&lt;/code&gt; extends the class &lt;code&gt;Object&lt;/code&gt; as a default. The class Object does not contain a method &lt;code&gt;getName()&lt;/code&gt; and thus it does not override such a method. This therefore results in an error message being generated. For example, in figure 1 Eclipse has identified that the method &lt;code&gt;getName()&lt;/code&gt; should override a method in the parent class and has provided a pop up to this effect.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://www.theregister.co.uk/2006/02/24/hunt-fig1-a.jpg" alt="Screenshot showing Eclipse analysing annotations" title="Figure 1: Eclipse analyses annotations" height="199" width="404" /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; &lt;br /&gt;&lt;p&gt;However, marking which methods you expect to override parent class methods is probably a step two far for many developers. A rather more useful annotation may be the &lt;code&gt;@SuppressWarnings&lt;/code&gt; annotation.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;The &lt;code&gt;@SuppressWarnings&lt;/code&gt; annotation can be very useful if you have some code that uses a deprecated method or class (possibly because it has been in your system since before that method was deprecated) and you do not want the compiler to churn out lots of warnings about using deprecated APIs. By using the &lt;code&gt;@SuppressWarning&lt;/code&gt; annotation and the parameter value “deprecation” it is possible to suppress (turn off) the production of the deprecated warning. For example:&lt;/p&gt; &lt;br /&gt;&lt;div class="ninja-code"&gt;@SuppressWarnings("deprecation")&lt;br /&gt;public static void terminateProcess() {&lt;br /&gt;  Thread.currentThread().stop();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Defining your own annotations ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;You can easily create your own annotations by defining a new annotation type. This is done using a new piece of language syntax, the &lt;code&gt;@interface&lt;/code&gt; key word. For example, to define a new annotation &lt;code&gt;@Auditor&lt;/code&gt; we would define the following annotation type.&lt;/p&gt; &lt;br /&gt;&lt;div class="ninja-code"&gt;public @interface Auditor {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;&lt;p&gt;Note that although the syntax for this is almost exactly the same as for a standard interface, the “@” symbol at the start of the keyword changes this to be an annotation declaration. When you compile the resulting &lt;code&gt;Auditor.java&lt;/code&gt; file this creates a standard &lt;code&gt;Auditor.class&lt;/code&gt; file. If you place this class file on your class path, then you can use this new annotation type within your Java code. For example, if you place the &lt;code&gt;@Auditor&lt;/code&gt; just before the class declaration, this marks the class as being of the entity type Auditor. This is illustrated in Figure 2.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://www.theregister.co.uk/2006/02/24/hunt-fig2.jpg" alt="A screenshot showing the use of the @Auditor annotation" title="Figure 2: Using the @Auditor annotation" height="383" width="463" /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; &lt;br /&gt;&lt;p&gt;You can also define parameters that can be used with annotations, and accessor methods for retrieving information about the options specified with an annotation.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Drawbacks of Annotations ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;Annotations are not without their drawbacks. Not least of which is that they are not really metadata – that is they are not data about data – they are data about classes, methods, instance and static variables etc.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Window dressing ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;As such annotations are syntactic sugar – they coat the elements of a class without actually telling you anything in detail about that class (you can use the reflection API for some of that). Thus they provide guidance to processors, tools and frameworks to help in the analysis, compilation or deployment of that software.&lt;/p&gt;  &lt;h3&gt;Inheritance&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;One of the major features of an object-oriented system is inheritance. You can subclass a class, and subclass an interfaces – but you can’t subclass annotations.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Null values ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;If a null value should be treated as an un-initialized value then annotations are somewhat awkward in the way they handle these – rely on the developer to provide a way of indicating un-initialised rather than initialised to null.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Values in General ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;These are somewhat limited in what you can use – although in the main this is fine.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Annotations hold constants ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;The values used with annotations are hard coded rather than variable. Thus if an annotation takes a literal value of 40 – then that value is now hard coded into your program.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Annotations and code synchronization ===&lt;/h3&gt; &lt;br /&gt;&lt;p&gt;Just as with Javadoc comments themselves, annotations need to be maintained to reflect any code changes that may occur. However, as we all know, it is all too easy to change the source code and not to update the associated Javadoc (even when they are next to each other). Exactly the same is true for annotations. If the code relating to an annotation changes, then the associated annotation may also need modification. This may not be as straightforward as it seems. For example, if I rename a method in a class I am working on, then this may impact on another class, that I may know nothing about; if that class requires that one of its methods overrides mine (due to the use the &lt;code&gt;@Override&lt;/code&gt; annotation). Of course this may be what is desired or it may not! As you can define your own annotations this situation may become much worse, with significant repercussions for on-going maintenance, clarity and general stability of the code.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;=== Summary ===&lt;/h3&gt; &lt;br /&gt;So where does that leave the question &lt;em&gt;“To Annotate or not to Annotate?”&lt;/em&gt;. In essence, as with many things in life, annotations can be very useful but should not be over used or abused. They can add extremely useful additional information to Java code that can be analysed by tools, frameworks, analysers as well as developers themselves – but they should not be used without due consideration.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(main reference: &lt;a href="http://theregister.co.uk/"&gt;TheRegister&lt;/a&gt;)&lt;/i&gt;&lt;br /&gt;See also :&lt;br /&gt;&lt;a href="http://javabeat.net/articles/30-annotations-in-java-50-1.html"&gt;http://javabeat.net/articles/30-annotations-in-java-50-1.html&lt;/a&gt;&lt;br /&gt;http://www.developer.com/java/other/article.php/10936_3556176_1&lt;br /&gt;http://www.oracle.com/technology/pub/articles/hunter_meta.html&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4272259409515484147?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4272259409515484147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4272259409515484147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4272259409515484147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4272259409515484147'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/saved.html' title='Java annotations revisit'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6833511863216643584</id><published>2008-12-29T22:57:00.004+07:00</published><updated>2009-01-02T23:22:24.611+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JavaCard quick notes [2]</title><content type='html'>Tiếp tục &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/javacard-quick-notes.html"&gt;JavaCard&lt;/a&gt; nào&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Các lỗi thường gặp với JCOP ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sau một hai buổi mày mò lăn xả với JCOP, mình trở về với thân thể trầy xước tả tơi, dưới đấy là vài kinh nhiệm mình gặp phải và cách xử lý&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;1 - Lỗi upload ".cap" file không thành công.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPbA_X8hRZI/AAAAAAAAADs/9s3de3KLNd8/s1600-h/3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPbA_X8hRZI/AAAAAAAAADs/9s3de3KLNd8/s320/3.JPG" alt="" id="BLOGGER_PHOTO_ID_5257601809993778578" border="0" /&gt;&lt;/a&gt;Lý do:&lt;br /&gt;- Build file cap không thành công, không có file .cap để upload.&lt;br /&gt;Xử lý:&lt;br /&gt;- Từ menu Window-&gt;Preferences..-&gt; Java-&gt;Compiler&lt;br /&gt;- Hiệu chỉnh "Compiler Complance level" -&gt; 1.5&lt;br /&gt;- Build lại project của bạn và Run.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;2 - Lỗi không thể send các command.&lt;/span&gt;&lt;br /&gt;Thông báo lỗi:&lt;br /&gt;- "&lt;span style="color: rgb(51, 102, 255);"&gt;CLA value not supported&lt;/span&gt;"&lt;br /&gt;- &lt;span style="color: rgb(51, 102, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;INS value not supported&lt;/span&gt;"&lt;br /&gt;Lý do:&lt;br /&gt;- process() của bạn hiện tại không bắt, xử lý được với các mã CLA/INS lệnh theo yêu cầu.&lt;br /&gt;Thông báo lỗi:&lt;br /&gt;- "&lt;span style="color: rgb(51, 102, 255);"&gt;Conditions of use not satisfied&lt;/span&gt;"&lt;br /&gt;Lý do: bạn phải /select applet mới có thể bắt đầu truyền các command hoặc applet chưa được xác thực (nếu có)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3 - &lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;Lỗi "No precise diagnosis" &lt;/span&gt;&lt;br /&gt;Đây là lỗi làm "điên người" nhất mà mình tạm cho 1 lý do tạm là .. trình biên dịch JC còn củ chuối. Khi gặp lỗi này, bạn nên xóa mọi hành động vừa mới làm và bắt đầu cẩn thận lại từ bản backup gần nhất :D, nôm na ra là .. bó hand&lt;br /&gt;&lt;br /&gt;Vài lỗi nhỏ trên là cơ bản, sẽ còn lỗi nhiều nữa, mình sẽ liệt kê thêm nếu gặp phải&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Vòng đời của 1 "cardlet" ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Trước tiên lưu ý: "Cardlet" là cách gọi của mình về applet của JavaCard, chưa phải thuật ngữ chính thức.&lt;br /&gt;&lt;br /&gt;Theo đặc điểm kỹ thuật, vòng đời của một JavaCard Applet bắt đầu từ khi "em" được &lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;đăng ký vào card với phương thức &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;Applet.register() &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. JCRE (JavaCard Runtime Environment) sẽ tương tác với applet thông qua các phương thức tĩnh của applet là: &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;install&lt;/span&gt;, &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;select&lt;/span&gt;, &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;deselect &lt;/span&gt;và &lt;span style="font-weight: bold; font-style: italic; color: rgb(204, 0, 0);"&gt;process&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phương thức &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-style: italic; font-weight: bold;"&gt;install()&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:  &lt;/span&gt;&lt;br /&gt;Khai báo:&lt;br /&gt;&lt;pre style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;code&gt;public static void install(&lt;br /&gt;           byte[] bArray, short bOffset&lt;br /&gt;         , byte bLength  )&lt;/code&gt;&lt;code&gt;throws ISOException&lt;/code&gt;&lt;code&gt;;&lt;/code&gt;&lt;/pre&gt;- Khi applet được cài đặt vào JC, phương thức install được thực thi một lần duy nhất cho mỗi thể hiện của applet. Các phương thức khởi dựng không nên được truy cập một cách trực tiếp mà phải thông qua phương thức install. Nhiệm vụ chính của phương thức install là tạo thể hiện của applet thông qua các constructor và đăng ký applet với JCRE thông qua phương thức &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;register()&lt;/span&gt;. Chỉ khi được đăng ký thành công, JCRE mới có thể cho phép thao tác lệnh APDU với applet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phương thức &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-style: italic; font-weight: bold;"&gt;register(..)&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt;&lt;br /&gt;Khai báo:&lt;br /&gt;&lt;pre style="font-weight: bold; color: rgb(0, 0, 153);"&gt;protected final void register()throws &lt;a href="file:///D:/Programs/java_card_kit-2_2_2-windows/java_card_kit-2_2_2/java_card_kit-2_2_2-rr-specs/jc_specification/specs/api/html/javacard/framework/SystemException.html" title="class in javacard.framework"&gt;SystemException;&lt;/a&gt;&lt;br /&gt;protected final void &lt;b&gt;register&lt;/b&gt;(&lt;br /&gt;       byte[] bArray,short bOffset&lt;br /&gt;      ,byte bLength)throws &lt;a href="file:///D:/Programs/java_card_kit-2_2_2-windows/java_card_kit-2_2_2/java_card_kit-2_2_2-rr-specs/jc_specification/specs/api/html/javacard/framework/SystemException.html" title="class in javacard.framework"&gt;SystemException&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;- Phương thức này được dùng để đăng ký một thể hiện của ứng dụng "cardlet" với JCRE với một mã (AID) xác định. Mã AID xác định bởi một chuỗi Hexadecimal, có độ dài trong khoảng 5-11 bytes (1byte = 8bits). Mã AID này là tham số đầu vào cho lệnh Select applet. Thông thường, phương thức &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;register()&lt;/span&gt; được gọi từ thân của phương thức&lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt; install()&lt;/span&gt; để applet được đăng ký với JCRE 1 lần cho mỗi card.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phương thức &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-style: italic; font-weight: bold;"&gt;select()&lt;/span&gt;:&lt;br /&gt;Khai báo:&lt;br /&gt;&lt;pre style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;code&gt;public boolean select();&lt;/code&gt;&lt;/pre&gt; - Phương thức select() cho phép chuyển quyền nhận lệnh cho một thể hiện của Applet. Phương thức select applet được JCRE thực thi khi JCRE nhận được lệnh SELECT FILE APDU cùng một mã Applet từ thiết bị. Việc select Applet sẽ chuyển trạng thái applet từ deselect -&gt; select và cho phép applet nhận các lệnh từ bên ngoài thông qua phương thức process() do JCRE chuyển giao. Tuy nhiên, trước khi select Applet, JCRE sẽ tự động thực hiện hành động deselect() một (hoặc các) applet đã được select trước đó.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phương thức &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-style: italic; font-weight: bold;"&gt;process()&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;: &lt;/span&gt;&lt;br /&gt;Khai báo:&lt;br /&gt;&lt;pre style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;code&gt;public void process(APDU apdu) throws ISOException;&lt;/code&gt;&lt;/pre&gt;- Sau khi được &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;select()&lt;/span&gt;, tất cả các lệnh APDU sẽ được JCRE chuyển cho Applet thông qua phương thước &lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;process()&lt;/span&gt;. Các nhân xử lý của applet sẽ được thể hiện (hoặc phân hướng xử lý) ở phương thức này. Từ đây, các thao tác dữ liệu, nhận và trả lệnh APDU được thực hiện trên vùng buffer có giới hạn đã được applet đăng ký trong hàm &lt;span style="color: rgb(153, 0, 0); font-style: italic;"&gt;register()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Phương thức &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold; font-style: italic;"&gt;deselect()&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt;&lt;br /&gt;Khai báo:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;public void &lt;/span&gt;&lt;b style="font-weight: bold; color: rgb(51, 51, 255);"&gt;deselect&lt;/b&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;- Phương thức được gọi thực thi bởi JCRE khi có yêu cầu hoặc khi có hành động select một Applet khác. JCRE sẽ tự động thực hiện deselect() Applet hiện tại.&lt;br /&gt;- Khi có lỗi khi thực hiện deselect, JCRE sẽ tiếp nhận lỗi, và tại thời điểm đó, applet đã được deselect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6833511863216643584?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6833511863216643584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6833511863216643584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6833511863216643584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6833511863216643584'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/javacard-quick-notes-2.html' title='JavaCard quick notes [2]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_J3Ejob9sTKI/SPbA_X8hRZI/AAAAAAAAADs/9s3de3KLNd8/s72-c/3.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1214390454058606586</id><published>2008-12-29T00:06:00.005+07:00</published><updated>2009-01-01T11:00:25.510+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>GoF Design Patterns [5]</title><content type='html'>Adapter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Decorator&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Visitor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(will be updated on demand)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1214390454058606586?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1214390454058606586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1214390454058606586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1214390454058606586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1214390454058606586'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns-5.html' title='GoF Design Patterns [5]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8795348946761987628</id><published>2008-12-28T16:26:00.006+07:00</published><updated>2008-12-31T00:51:07.088+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>PureMVC framework notes</title><content type='html'>PureMVC is a lightweight framework for creating applications based upon the classic Model, View and Controller concept; based upon proven &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns.html"&gt;design patterns&lt;/a&gt; &lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://npacemo.com/wordpress/wp-content/uploads/2008/06/puremvc-conceptual-diagram.jpg"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This free, open source framework which was originally implemented in the &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/actionscript-3-notes.html"&gt;ActionScript 3&lt;/a&gt; language for use with Adobe &lt;a href="http://mediocre-ninja.blogspot.com/2008/12/rich-internet-application.html"&gt;Flex&lt;/a&gt;, Flash and AIR, has now been ported to nearly all major development platforms. It seems PureMVC is more popular in other languages (Java, C#, Ruby, ... ) than its competitor (Cairgorm) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; (to be updated)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8795348946761987628?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8795348946761987628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8795348946761987628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8795348946761987628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8795348946761987628'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/puremvc-framework-notes.html' title='PureMVC framework notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1898336654084344116</id><published>2008-12-24T21:21:00.004+07:00</published><updated>2008-12-30T22:52:37.699+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>GoF Design Patterns [4]</title><content type='html'>Abstract Factory&lt;br /&gt; &lt;br /&gt;Proxy&lt;br /&gt;&lt;br /&gt;Mediator&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(will be updated on demand)&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1898336654084344116?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1898336654084344116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1898336654084344116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1898336654084344116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1898336654084344116'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns-4.html' title='GoF Design Patterns [4]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4719988036039889350</id><published>2008-12-23T23:18:00.006+07:00</published><updated>2008-12-29T23:40:00.187+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>JavaCard quick notes</title><content type='html'>Những ai đã biết đến Java thì chắc hẳn cũng biết Sun đã phân Java ra làm 3 nền (platform) chính: Standard (Java SE), Enterprise (Java EE) và Micro (Java ME) . Tuy nhiên hiện nay có 2 hướng phát triển của Java có thể vươn ra thành 1 platform mới, đó là JavaCard và JavaFX .&lt;br /&gt;&lt;br /&gt;Về JavaFX thì đã có giới thiệu sơ trong bài RIA , tuy nhiên triển vọng của JavaFX không khả quan lắm, khi 2 đối thủ cạnh tranh là Silverlight và Flex/OpenLaszlo đã vượt lên hẳn.&lt;br /&gt;&lt;br /&gt;Còn JavaCard vẫn là 1 lĩnh vực mới mẻ ở VN , tuy nhiên tiềm năng rất lớn, vì có thể xây dựng hệ thống bán lẻ, hệ thống máy tự động (kiểu ATM cho ngân hàng), cũng như chính phủ điện tử. FYI, công ty lợi nhuận lớn nhất ở Hoa Kỳ năm ngoái là, không phải Microsoft vì MS chỉ đứng khoảng hạng 10, chính là WalMart , hệ thống bán lẻ giá rẻ toàn nước Mỹ. Bây giờ một số công ty VN bắt đầu tính đến thị trường này, và nước ngoài cũng có công ty ngấp nghé nhảy vào làm, vì thế JavaCard có tiềm năng khó lường.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Xin đưa lên vài bài dịch của bạn Trịnh Quốc Hùng để các bạn hiểu hơn về JavaCard .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;=== Cài đặt plugin JCOP (3.1) cho Eclipse ===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Xin đặt vài dòng giới thiệu ngắn ngủi, JCOP - JavaCard OpenPlatform - khởi nguồn do IBM nghiên cứu - với tên gốc là JavaCard - là một bộ khung lập trình để phát triển cho công nghệ các loại thẻ thông minh (smart card), cho phép lập trình trên các loại thẻ có chip xử lý nhỏ mà ta đã thấy ứng dụng của chúng trong thực tế ngày nay: sim điện thoại, thẻ ngân hàng, thẻ nhân viên thông minh...&lt;br /&gt;Nhưng sau năm 2007, IBM ngừng đầu tư và chuyển giao công nghệ cho hãng &lt;a href="http://www.nxp.com/"&gt;NXP &lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/NXP_Semiconductors" title="NXP Semiconductors"&gt;Semiconductors&lt;/a&gt;&lt;a href="http://www.nxp.com/"&gt; &lt;/a&gt;- một trong những tập đoàn hàng đầu thế giới về công nghệ thẻ bao gồm cả thẻ "không tiếp xúc" (contactless). Từ đó, công cụ này có tên mới là JCOP với các version phát triển 1.0, 2.1 , 3.1, 4.1... Ngày nay, công cụ này không còn được tìm thấy trên mạng, mà nó chỉ được chuyền tay qua các thành viên hoặc được cấp từ chính hãng NXP với điền kiện có đăng ký hợp đồng. Dưới đây mình sẽ liệt kê từng bước cài đặt JCOP 3.1 thành công:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Điều kiện :&lt;br /&gt;- Eclipse IDE từ version 3.2 đến 3.3.1, dùng khác các version này không đảm bảo build CAP file thành công.&lt;br /&gt;- JCOP plugin for Eclipse version 3.1.2 , tool này bạn phải tự tìm hoặc đăng ký với &lt;a href="http://www.nxp.com/"&gt;NXP &lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/NXP_Semiconductors" title="NXP Semiconductors"&gt;Semiconductors. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thực hiện:&lt;br /&gt;- Sau khi giải nén và khởi động IDE Eclipse.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: sans-serif;"&gt;Chọn menu &lt;strong&gt; Help &gt;    Software Updates &gt; Find and Install&lt;/strong&gt;&lt;/span&gt;    &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: sans-serif;"&gt;Trong hộp thoại Install/Update, chọn&lt;strong&gt;    Search for new features to install&lt;/strong&gt;&lt;/span&gt; và chọn Next&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: sans-serif;"&gt;Chọn nút nhấn &lt;strong&gt;New Archived Site . . .&lt;/strong&gt; và chỉ đường dẫn đến file n&lt;/span&gt;    &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: sans-serif;"&gt;Chọn liên tiếp  &lt;strong&gt;Open &lt;/strong&gt;-&gt; &lt;strong&gt;OK&lt;/strong&gt; -&gt;    &lt;strong&gt;Finish&lt;/strong&gt;&lt;/span&gt;    &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: sans-serif;"&gt;IDE Eclipse sẽ đòi hỏi khởi động lại.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Sau khi khởi động thành công, trong mục New Project sẽ có thêm cấp project "JavaCard Project". Nếu thấy mục này, coi như bạn đã cài đặt thành công plugin JCOP for Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;=== Tạo một JavaCard Project ===&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;theo các bước sau&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Trong menu New -&gt; Project...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tại hộp thoại New Project, chọn mục JavaCard Project và chọn Next.&lt;/li&gt;&lt;li&gt;Tại hộp thoại Java Card Project, điền thông tin Project Name và chọn Next.&lt;/li&gt;&lt;li&gt;Tại đây bạn đã có thể chọn Finish. Nhưng mình thì thích đi từng bước hơn.&lt;/li&gt;&lt;li&gt;Nếu chọn Next, bạn sẽ có thể chọn các chuẩn configuration card xác định cho loại project của mình (Java Card 2.2.1, JavaCard 2.1.1, Global Platform, ...)&lt;/li&gt;&lt;li&gt;Chọn Next, chọn mục "Create a JavaCard Application using ...", chọn item "Basic JavaCard applet".&lt;/li&gt;&lt;li&gt;Điền thông tin Package và Applet ClassName. Package là gói chứa đựng các Applet. Applet là gói ứng dụng sẽ được cài lên các chip xử lý.&lt;/li&gt;&lt;li&gt;Chọn Next, điền thông tin PackageAID và AppletAID. Đây là mã xử lý của Package và Applet trên chip. Lưu ý: PackageAID và AppletAID được đặt tên dưới dạng chữ số hexadecimal. Chiều dài cho cả Package AID và AppletAID là 5 bytes. (bạn có thể đọc thêm thông tin trong tài liệu "&lt;a href="http://www.wrankl.de/SCH/SCH.html"&gt;Smart Card Handbook&lt;/a&gt;" để nắm vững hơn)&lt;/li&gt;&lt;li&gt;Chọn Finish.&lt;/li&gt;&lt;li&gt;Tới đây là bước kiểm tra bản quyền của &lt;a href="http://www.nxp.com/"&gt;NXP&lt;/a&gt;, cử sổ activate code sẽ hiện cho bạn 3 action activate: Đăng ký 1 activate code mới, sử dụng thẻ được cung cấp bới NXP để activate hoặc nhập lại 1 activate code đã được cung cấp bới NXP. Nếu không qua được bước này thì coi như quá trình tìm hiểu JavaCard, cardlet buộc phải chấm dứt.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Xong 9 bước trên vẫn chưa xong, mục đích là phải build được file có đuôi là .cap mới có thể upload vào thẻ. Dưới đây là các bước để Run/Debug project, trong quá trình Run/Debug thành công, file &lt;project&gt;.cap sẽ được build và đặt ở thư mục "../bin" của project.&lt;br /&gt;&lt;/project&gt;&lt;ol&gt;&lt;li&gt;Trong menu Run -&gt; Open Run/Debug Dialog..&lt;/li&gt;&lt;li&gt;Tạo mới một "JavaCard Application" và đặt các cấu hình phù hợp cho project.&lt;/li&gt;&lt;li&gt;Chọn Run/Debug.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Kết quả trong cửa sổ JCOP Shell:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPK11Kfil_I/AAAAAAAAADc/n98n2-ijqzc/s1600-h/1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_J3Ejob9sTKI/SPK11Kfil_I/AAAAAAAAADc/n98n2-ijqzc/s320/1.JPG" alt="" id="BLOGGER_PHOTO_ID_5256463640049129458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;chú ý dòng : "&lt;span style="color: rgb(255, 0, 0);"&gt;cm&gt;  upload -b 250 .... .cap&lt;/span&gt;" là đường dẫn đến file cap đã được build thành công.&lt;br /&gt;&lt;project&gt;"cm&gt;  install -i abababab01  -q C9#() &lt;span style="color: rgb(0, 153, 0);"&gt;abababab00&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;abababab01&lt;/span&gt;"&lt;br /&gt;- &lt;/project&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;abababab00&lt;/span&gt;&lt;project&gt; là tên packageAID&lt;br /&gt;- &lt;/project&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;abababab01 &lt;/span&gt;&lt;project&gt;là tên appletAID&lt;br /&gt;&lt;br /&gt;&lt;/project&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J3Ejob9sTKI/SPK34su3ZaI/AAAAAAAAADk/ydP1oYm6DPo/s1600-h/2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_J3Ejob9sTKI/SPK34su3ZaI/AAAAAAAAADk/ydP1oYm6DPo/s320/2.JPG" alt="" id="BLOGGER_PHOTO_ID_5256465899803076002" border="0" /&gt;&lt;/a&gt;"cm&gt; card-info" cho thông tin card sau khi upload applet thành công.&lt;br /&gt;&lt;br /&gt;Đến đây xem như bạn đã có thể tạo được một card applet (.cap) . Công việc kế tiếp sẽ còn nhiều cam go, nhưng đến đây mình cần phải dừng lại để suy ngẫm, đúc kết lại những gì mình đã làm được. Làm ly cafe nào.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4719988036039889350?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4719988036039889350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4719988036039889350' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4719988036039889350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4719988036039889350'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/javacard-quick-notes.html' title='JavaCard quick notes'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_J3Ejob9sTKI/SPK11Kfil_I/AAAAAAAAADc/n98n2-ijqzc/s72-c/1.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5817739390970345879</id><published>2008-12-20T21:55:00.004+07:00</published><updated>2008-12-29T23:10:32.207+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>GoF Design Patterns [3]</title><content type='html'>Tiếp tục với những design patterns dễ gặp: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Factory Method (creational)&lt;br /&gt;&lt;br /&gt;Facade (structural)&lt;br /&gt;&lt;br /&gt;Observer (behavioural)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;(will be updated on demand)&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5817739390970345879?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5817739390970345879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5817739390970345879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5817739390970345879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5817739390970345879'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns-3.html' title='GoF Design Patterns [3]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7870628288592063089</id><published>2008-12-19T22:53:00.006+07:00</published><updated>2008-12-30T00:21:41.614+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex-ActionScript-Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>ActionScript 3 notes</title><content type='html'>&lt;b&gt;=== Data types === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Top level types:&lt;br /&gt;&lt;br /&gt;- void, int, uint,&lt;br /&gt;- Object, Number, String, Boolean, Null&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Complex types:&lt;br /&gt;&lt;br /&gt;- Date, Array, ByteArray, Vector, Dictionary, RegExp, Function, Error&lt;br /&gt;- XML, XMLList, BitMap, Shape, MovieClip, Video, SimpleButton, TextField&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Declaration ===&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Package, import, class:&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;package com.example {&lt;br /&gt; import flash.net.URLLoader;&lt;br /&gt; import flash.net.URLRequest;&lt;br /&gt; public class Example {&lt;br /&gt;   // Class code goes here.&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Access modifiers:&lt;br /&gt;&lt;div class="ninja-quote"&gt;&lt;br /&gt;public : accessible outside the class (e.g., from an instance of the class).&lt;br /&gt;private : accessible only within the class.&lt;br /&gt;protected : accessible only within the class and its subclasses.&lt;br /&gt;internal : accessible only within the package.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Variable/constant, field/property:&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;var myObject: Object = {Param1:"Hi!", Param2:76};&lt;br /&gt;public var myString: String = "ABC";&lt;br /&gt;protected var myNumber: Number = 5;&lt;br /&gt;private var myInt: int = 12;&lt;br /&gt;var myBoolean: Boolean = true;&lt;br /&gt;var myArray: Array = [5,"Hello!",{a:5, b:7}]&lt;br /&gt;private var myDate: Date = new Date();&lt;br /&gt;var myButton: mx.controls.Button = new mx.controls.Button();&lt;br /&gt;static public const MY_TEST: String = "test constant";&lt;br /&gt;&lt;br /&gt;var authorsByBook:Object = new Object( );&lt;br /&gt;authorsByBook["Flex"] = "Mediocre, Ninja";&lt;br /&gt;authorsByBook["ActionScript 3"] = "bibo, ninja, mediocre";&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Function/method/constructor:&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;function test( ):void {&lt;br /&gt; var message:String = "function message";&lt;br /&gt; trace(message);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Formal syntax ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Expression/Statement/FlowControl&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;while(total &lt; int =" 0;"&gt; maxTotal + 20) {&lt;br /&gt; total -= 10;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt; total -= 5;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Inheritance&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;package com.example {&lt;br /&gt; import com.example.A;&lt;br /&gt; public class B extends A {&lt;br /&gt;   override public function run( ):void {&lt;br /&gt;     trace("B");&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Interface&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;package com.example {&lt;br /&gt; public interface IExample {&lt;br /&gt;   function a( ):String;&lt;br /&gt;   function b(one:String, two:uint):void;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;package com.example {&lt;br /&gt; import com.example.IExample;&lt;br /&gt; public class Example implements IExample {&lt;br /&gt;   public function Example( ) {&lt;br /&gt;   }&lt;br /&gt;   public function a( ):String {&lt;br /&gt;     return "a";&lt;br /&gt;   }&lt;br /&gt;   public function b(one:String, two:uint):void {&lt;br /&gt;     trace(one + " " + two);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Handling Event&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;  ;lt&amp;mx:Script;gt&amp;&lt;br /&gt;    ;lt&amp;![CDATA[&lt;br /&gt;      import flash.net.FileReference;&lt;br /&gt;      private function initializeHandler(event:Event):void {&lt;br /&gt;        var file:FileReference = new FileReference( );&lt;br /&gt;        file.browse( );&lt;br /&gt;        file.browse( );&lt;br /&gt;      }&lt;br /&gt;    ]];gt&amp;&lt;br /&gt;  ;lt&amp;/mx:Script;gt&amp;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Handling Error&lt;br /&gt;&lt;div class="ninja-code"&gt;&lt;br /&gt;try {&lt;br /&gt; // Code that might throw errors&lt;br /&gt;}&lt;br /&gt;catch (error:IOError) {&lt;br /&gt; // Code in case the specific error occurs&lt;br /&gt;}&lt;br /&gt;catch (error:Error) {&lt;br /&gt; // Code in case a non-specific error occurs&lt;br /&gt;}&lt;br /&gt;finally {&lt;br /&gt; // Code to run in any case&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(to be updated)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7870628288592063089?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7870628288592063089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7870628288592063089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7870628288592063089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7870628288592063089'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/actionscript-3-notes.html' title='ActionScript 3 notes'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-9132204144951212166</id><published>2008-12-17T22:07:00.004+07:00</published><updated>2008-12-29T23:09:19.604+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareEngineering'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>GoF Design Patterns [2]</title><content type='html'>Hãy bắt đầu bằng những Design Pattern đơn giản và dễ gặp nhất :-) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Singleton (creational)&lt;br /&gt;&lt;br /&gt;Bridge (structural)&lt;br /&gt;&lt;br /&gt;Command (behavioural)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;(will be updated on demand)&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-9132204144951212166?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/9132204144951212166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=9132204144951212166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9132204144951212166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/9132204144951212166'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns-2.html' title='GoF Design Patterns [2]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4074370846786679677</id><published>2008-12-15T23:45:00.006+07:00</published><updated>2008-12-28T17:00:43.863+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex-ActionScript-Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Rich Internet Application</title><content type='html'>Nói đơn giản, &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;Rich Internet applications&lt;/a&gt; là những ứng dụng (application) chạy trên mạng máy tính (cụ thể là Internet) mà có nhiều tính năng (rich features) như là ứng dụng chạy stand-alone trên máy không nối mạng (thường gọi là desktop application) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Sự ra đời của RIA === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Từ những ngày khởi thủy của những ứng dụng trên máy tính đều được thực hiện trên các máy tính lớn (mainframe). Các máy trạm chỉ làm nhiệm vụ hiển thị thông tin được xử lý từ các mainframe. Sau đó, tốc độ phát triển phần cứng cho các máy trạm (terminals - từ đây ta sẽ gọi chung là clients , mặc dù không đúng lắm ) nhanh như vũ bão. Từ tốc độ xử lý, hệ thống lưu trữ, bộ nhớ đến các thành phần khác dành cho clients đều phát triển rất nhanh.Như vậy, nếu chỉ dành toàn bộ việc tính tóan cho mainframe, và các clients chỉ để hiển thị thông tin sẽ vô cùng lãng phí tài nguyên. &lt;br /&gt;&lt;br /&gt;Sau đó đến giai đoạn phát triển của các ứng dụng dạng client/server. Lại có vấn đề về hệ thống phân tán. Sẽ mất nhiều công sức cho việc cài đặt, bảo dưỡng các ứng dụng trên clients. Rồi việc đảm bảo các ứng dụng trên clients phải tương thích với các platforms khác nhau.&lt;br /&gt;&lt;br /&gt;Vào những năm 90, internet ra đời. Việc sử dụng các web browsers cho các thin clients được áp dụng rất mạnh mẽ và hiệu quả. Nhưng (lại nhưng) kiểu lập trình page-to-page, khiến các nhà phát triển ứng dụng rất khó khăn, mệt mỏi và có rất nhiều hạn chế. Rồi các giao diện người dùng đơn điệu, không hiệu quả. Để cố gắng khắc phục những nhược điểm này, RIA đã ra đời. Vậy RIA có những khả năng gì? &lt;br /&gt;(Về định nghĩa, xin xem lại ở đầu bài này)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Khả năng của RIA === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Có khả năng tương tác với DOM (Document Object Model), xây dựng những ứng dụng chạy trên nhiều loại browsers và platforms.&lt;br /&gt;&lt;br /&gt;Có khả năng sử dụng được các đối tượng trên server như web services hay những công nghệ tương tự khác, làm cho các ứng dụng trên clients có thể kết nối với server minh bạch hơn, dễ dung hơn.&lt;br /&gt;&lt;br /&gt;Có khả năng làm việc “offline”. Dữ liệu được đưa về clients, xử lý tại clients, sau đó trả lạ cho server, tránh việc quá tải đường truyền cũng như hệ thống xử lý của server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Các khuynh hướng xây dựng RIAs === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hiện nay có 4 trường phái xây dựng RIAs : đầu tiên là Ajax (Asynchronous Javascript and XML) : sử các thư viện JavaScript như Dojo, OpenRico, Backbase và Yahoo ToolKit, etc . Tiếp theo là RIAs trên nền Flash Player với các công cụ như Flex, OpenLaszlo ( đây là công cụ Open source). Thứ 3 là Windows Presentation Foundation (WPF) sử dụng .NET framework 3, trong đó quan trọng là Silverlight. Cuối cùng là JavaFX, kết hợp với các công cụ GUI như : AWT/Swing, và Eclipse RCP (SWT/JFace). Trong đó, dường như WPF và JavaFX nhắm vào ứng dụng desktop hơn là RIAs, mặc dù chúng đều có thể phát triển cho RIAs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ajax : là 1 thuật ngữ. Nó được các nhà phát triển kết hợp từ nhiều công cụ (HTML,DHTML, Javascript), công nghệ, để chuyển dữ liệu từ server tới client mà không phải reload lại page. Thực ra, trước đây IFrames đã làm được những công việc này. Gần đây, Java script sử dụng XMLHttpRequest để thay thế applets, Iframe.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Flash : Là nền tảng để triển khai RIAs. Trước đây, flash được phát triển nhằm mục đích phục vụ xây dựng animations. Sau nhiều thập kỷ thành công, tới nay có tới 97% (theo Adobe Flex 3 : Training from the Source) các web browsers có cài đặt flash. Adobe nhận ra rằng, với flash có thể làm nhiều hơn việc chỉ phát triển animations. Vì thế Flex đã ra đời.&lt;br /&gt;&lt;br /&gt;OpenLaszlo : là phần mềm open source với nền tảng phát triển là Javascript và XML và chạy trên nền flash. Các ứng dụng cũng được biên dịch thành các files SWF. Vì là công cụ open source nên Laszlo cũng gắn bó chặt chẽ với LAMP (Linux, Apache, MySQL và PHP).&lt;br /&gt;&lt;br /&gt;Flex : (vì Flex là cái chúng ta đang quan tâm nên mình tách riêng ra 1 mục) được xây dựng với nền tảng là Eclipse. Flex 1 là phần mềm open source. Tuy nhiên, vào giữa năm 2006, Adobe đã thương mại hóa Flex 2, với những tính năng và ưu điểm vượt trội bản Flex 1. Gần đây, Adobe đã chính thức phát hành Flex 3 có những phần đáng chú ý như : Adobe AIR, cải thiện đáng kể hiệu năng của những files SWF. Có khả năng tích hợp các middle layers ngay trong ứng dụng như : PHP, ColdFusion, WebService, Flex Data Server (hay còn gọi là FDS). Từ phiên bản Flex 2 trở đi, các ứng dụng sử dụng ActionScript 3 và chạy trên nền Flash Player 9. Flex cho miễn phí Flex SDK, cũng như AIR SDK, chỉ thương mại Flex Builder (với giá bản full của Flex Builder 3 Pro là 699$). Thêm nữa, Flex là sự kết hợp không thể tách rời của ngôn MXML và ActionScript.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Windows Presentation Foundation (WPF) : là 1 tập hợp các công cụ để xây dựng các ứng dụng RIAs trên nền Windows.&lt;br /&gt;&lt;br /&gt;WPF : nền tảng để xây dựng và chạy RIAs.&lt;br /&gt;XAML : ngôn ngữ xây dựng nên RIAs.&lt;br /&gt;Visual C# : IDE để viết ra RIAs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java (JavaFX) : thật đáng tiếc , cho đến nay thì JavaFX vẫn chưa làm được gì nhiều và có vẻ đang tụt lại đáng kể trong cuộc đua này. Hy vọng Sun dẹp bớt những tham vọng ngu ngốc và hướng tới cộng đồng hơn, khi đó mới có thể hy vọng cạnh tranh thị phần RIA được. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(tạm thế đã , sẽ định dạng bài viết lại sau)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4074370846786679677?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4074370846786679677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4074370846786679677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4074370846786679677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4074370846786679677'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/rich-internet-application.html' title='Rich Internet Application'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4083233640804563005</id><published>2008-12-14T09:36:00.010+07:00</published><updated>2008-12-28T23:00:38.649+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>GoF Design Patterns</title><content type='html'>Có lẽ không cần giới thiệu nhiều về &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)"&gt;Design Patterns&lt;/a&gt; (Mẫu Thiết kế), cũng như &lt;a href="http://en.wikipedia.org/wiki/Design_Patterns"&gt;quyển sách kinh điển&lt;/a&gt; của &lt;a href="http://en.wikipedia.org/wiki/Gang_of_Four_(software)"&gt;Gang of Four&lt;/a&gt; (Bộ Tứ - a.k.a Bè lũ 4 tên) vì bây giờ đã quá nổi tiếng rồi. &lt;br /&gt;&lt;br /&gt;Việc nắm được các Design Patterns ngoài việc cải thiện tư duy &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/object-oriented-programming-principles.html"&gt;hướng đối tượng&lt;/a&gt;, nó giúp dự án nhanh chóng có được thiết kế tốt, vì thế &lt;b&gt;reduce cost &amp; development interval&lt;/b&gt;, đồng thời &lt;b&gt;improve productivity &amp; customer satisfaction&lt;/b&gt;. Đối với bản thân developer thì ít ra cũng hấp dẫn ở chỗ là có thể làm thay đổi đáng kể &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/individual-income-tax.html"&gt;mức lương&lt;/a&gt; :D . &lt;br /&gt;Do đó bạn nào muốn tìm hiểu kỹ hơn thì nên &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;nghiền ngẫm&lt;/a&gt; sách và code nhiều vào, chứ các bài blog như bài này chỉ nêu như cưỡi ngựa xem hoa thôi :D &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Trong sách DP của GoF, 23 mẫu được phân thành 3 categories là: &lt;i&gt;Creational&lt;/i&gt; (khởi tạo) - 5 mẫu , &lt;i&gt;Structural&lt;/i&gt; (cấu trúc) - 7 mẫu, và &lt;i&gt;Behavioural&lt;/i&gt; (hành vi) - 11 mẫu còn lại .&lt;br /&gt;&lt;br /&gt;Tuy nhiên theo tớ thì &lt;b&gt;không nên tiếp cận các DP the thứ tự tên ABC&lt;/b&gt;, hoặc theo từng category như trên, mà nên tiếp cận theo 1 trong 2 hướng: hoặc là &lt;b&gt;dễ hiểu nhất&lt;/b&gt;, hoặc là dễ gặp nhất.&lt;br /&gt;Ngoài ra không nên chạy theo các "xxx Design Patterns" khác (VD: Enterprise), vì đa số các pattern dạng này thuộc loại bùng nổ, hầu như cái gì cũng quơ vào làm pattern, hiệu quả thực tế chẳng bao nhiêu mà còn dễ dẫn đến "tẩu hỏa nhập ma" :D .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Creational DP === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C. Singleton&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Ensure a class only has one instance, and provide a global point of access to it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C. Factory Method&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Define an interface for creating an object, but let the subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C. Abstract Factory&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Provide an interface for creating families of related or dependent objects without specifying their concrete classes.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;C. Prototype&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;C. Builder&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Separate the construction of a complex object from its representation so that the same construction processes can create different representations.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Structural DP === &lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Bridge&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Decouple an abstraction from its implementation so that the two can vary independently.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Facade&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Provide a unified interface to a set of interfaces in a system. Façade defines a higher-level interface that makes the subsystem easier to use.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Adapter&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatibility interfaces.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Decorator:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;S. Proxy&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Provide a surrogate or placeholder for another object to control access to it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Composite&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;S. Flyweight&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Use sharing to support large numbers of fine-grained objects efficiently. A flyweight is a shared object that can be used in multiple contexts simultaneously. The flyweight acts as an independent object in each context; it’s indistinguishable from an instance of the object that’s not shared. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Behavioural DP === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Strategy:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Defines a family of algorithms, encapsulates each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients who use it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Chain of Responsibility&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Avoid coupling the sender of a request to its receiver by giving more then one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Template Method&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Define a skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Iterator&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Command&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;S. Observer&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Mediator&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and lets you vary their interaction independently.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. State&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Interpreter&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Memento&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;B. Visitor&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;( từ từ tớ sẽ giới thiệu cụ thể từng cái pattern sau... nếu có thời gian :D )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4083233640804563005?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4083233640804563005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4083233640804563005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4083233640804563005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4083233640804563005'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/gof-design-patterns.html' title='GoF Design Patterns'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-5707559060057748218</id><published>2008-12-12T21:00:00.008+07:00</published><updated>2008-12-28T23:07:21.073+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript-CSS-DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Javascript Libraries Overview</title><content type='html'>Từ khi những thuật ngữ như &lt;a href="http://en.wikipedia.org/wiki/AJAX"&gt;AJAX&lt;/a&gt; hay &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;RIA&lt;/a&gt; xuất hiện, Javascript đã được phát triển mạnh và hình thành các thư viện, hay cũng có thể gọi là các framework để hỗ trợ ứng dụng web. &lt;br /&gt;Hiểu biết về JavaScript đã trở thành 1 &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies.html"&gt;skill&lt;/a&gt; không thể thiếu với những ai làm &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/object-oriented-programming-principles.html"&gt;lập trình&lt;/a&gt; web, và cũng là 1 &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-2.html"&gt;skill&lt;/a&gt; khá quan trọng của các &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/linux-directory-structure.html"&gt;hacker&lt;/a&gt;. Tuy nhiên với web-development hiện nay thì lời khuyên là bạn nên nắm vững 1 thư viện nào đó, hơn là đi tìm kiếm các đoạn script mẫu ngắn phục vụ cho 1 mục đích nào đó.&lt;br /&gt;&lt;br /&gt;Các thư viện JS mã mở và hữu ích hiện nay có thể kể: &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt;, &lt;a href="http://mootools.net"&gt;mooTools&lt;/a&gt;, Prototype + &lt;a href="http://script.aculo.us"&gt;Scriptaculous&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui"&gt;YUI&lt;/a&gt; + ExtJS , Dojo, ... &lt;br /&gt;&lt;br /&gt;(ngoài ra còn 1 số công nghệ JS có cả phần server side như : qooxdoo, echo2, GWT, DWR, jMaki, Qcodo, AjaxCFC, ... ) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dưới đây là 1 slideshow so sánh cơ bản các thư viện JS trên để bạn có thể chọn cho mình 1 cái phù hợp : &lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_632753"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://mediocre-ninja.blogspot.com/2008/12/javascript-libraries-overview.html" title="JavaScript Library Overview"&gt;JavaScript Library Overview&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=jslibajaxexp08-1222984152388261-8&amp;stripped_title=javascript-library-overview-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=jslibajaxexp08-1222984152388261-8&amp;stripped_title=javascript-library-overview-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;from SlideShare (tags: &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/libraries"&gt;libraries&lt;/a&gt; &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/javascript"&gt;javascript&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Have fun :D !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-5707559060057748218?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/5707559060057748218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=5707559060057748218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5707559060057748218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/5707559060057748218'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/javascript-libraries-overview.html' title='Javascript Libraries Overview'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7853594669268279838</id><published>2008-12-08T23:23:00.006+07:00</published><updated>2010-07-07T20:48:34.052+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social-Career-SoftSkill'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Learning with YouTube</title><content type='html'>Well, maybe you already know flash-video sites such as &lt;a href="http://www.metacafe.com"&gt;MetaCafe&lt;/a&gt; , YouTube , &lt;a href="http://video.google.com"&gt;Google Video&lt;/a&gt;, ... but have you ever used them for learning ?&lt;br /&gt;&lt;br /&gt;My favourite lectures come from MIT and Standford :&lt;br /&gt;&lt;a href="http://www.youtube.com/results?search_query=MIT"&gt;MIT&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/results?search_query=Standford"&gt;Standford&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IMHO , this method is quite good if you have enough time. &lt;br /&gt;Try it yourself and see :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7853594669268279838?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7853594669268279838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7853594669268279838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7853594669268279838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7853594669268279838'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/learning-with-youtube.html' title='Learning with YouTube'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7821962354512396978</id><published>2008-12-07T21:12:00.009+07:00</published><updated>2010-09-11T19:49:05.178+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free-Libre-OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><title type='text'>VIM vs Notepad++</title><content type='html'>Ngoài 1 số điểm mà &lt;a href="http://notepad-plus.sourceforge.net"&gt;notepad-plus&lt;/a&gt; plus kết hợp plugins đuổi kịp &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies.html"&gt;VIM&lt;/a&gt;, vẫn còn một số ưu điểm không thể không nhắc đến của &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-2.html"&gt;vim&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:DarkOrange;"&gt; 1/ Mở &lt;b&gt;file lớn&lt;/b&gt;. (bạn thử mở 1 file &gt; 100 MB bằng vim với Notepad++ coi sao)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ Xử lý &lt;b&gt;nhiều cụm từ&lt;/b&gt; trong 1 file lớn (VD: thay thế vài ngàn từ bằng vim và Notepad++)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3/ Hỗ trợ highlight nhiều hơn (&lt;b&gt;syntax on&lt;/b&gt; hoặc &lt;b&gt;syntax enable&lt;/b&gt;), hiện nay Notepad++ đã được tăng nhiều nhưng vẫn chưa bằng vim (thử mở các file text như .conf, .cnf, .lst , .cnt , .*rc , ... )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4/ Customize màu sắc dễ hơn, adapt không chỉ 1 ngôn ngữ lập trình (&lt;b&gt;colorscheme, set background, set foreground, set guifont&lt;/b&gt;, tự chỉnh các file .vim , ... )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5/ Customized macro: recording các thao tác , chẳng hạn bạn đang viết blog đến từ "CSS", muốn link Wiki chỉ bấm 1, hoặc 2 phím đã recorded thành macro thì chữ CSS đó đã trở thành &lt;b&gt;&amp;lt;a href="http://en.wikipedia.org/wiki/CSS"&amp;gt;CSS&amp;lt/a&amp;gt;&lt;/b&gt; ,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6/ Customized hotkey: nếu macro không quá phức tạp mà lại hay dùng thì thường người ta &lt;b&gt;ánh xạ hotkey, hầu như không có giới hạn&lt;/b&gt; nào cả. Chẳng hạn nếu muốn thì Ctrl+B có thể là cặp thẻ &lt;b&gt; (cho HTML) , Ctrl+W rồi phím b là cặp thẻ [b] (cho forum BBcode) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;7/ Thao tác trên từng word, dòng, ..., di chuyển... bằng các phím cực nhanh. Chẳng hạn file có 1234 dòng, bạn muốn cut 543 dòng đầu tiên đem xuống cuối file rồi paste lại thì chỉ cần chuyển qua Normal mode rồi bấm (nhắm mắt luôn) :&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;gg543ddGp&lt;/span&gt;&lt;br /&gt;hoặc gõ tương ứng các lệnh đó rồi Enter cũng được&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8/ Viết &lt;a href="http://forum.vnoss.org/topic6330.html"&gt;script&lt;/a&gt;: vim có hỗ trợ cả các cú pháp if, else, func... Chẳng hạn có thể &lt;span style="font-weight: bold;"&gt;viết 1 function rồi map cho "Ctrl+/"&lt;/span&gt; : khi gặp file java, C, C++,... thì comment out cả đoạn bằng " // " , khi gặp file Perl, Shell,... thì comment out bằng " # " , gặp hợp ngữ thì comment bằng " ; " khi gặp file VIM thì comment out bằng " " " , ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9/ Kích hoạt shell command: bằng dấu "!" ngay sau dấu ":" , chẳng hạn &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;:!ps&lt;/span&gt;&lt;br /&gt;Một ví dụ tổng hợp: chẳng hạn dùng để map hotkey (kết hợp shellscript &amp;amp; perl) để mở Xterm tra dữ liệu &lt;a href="http://www.informatik.uni-leipzig.de/~duc/Dict/"&gt;từ điển Hồ Ngọc Đức&lt;/a&gt; trong vim console bằng phím F9 (gần giống kiểu click &amp;amp; see)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10/ "DIFF" 2 hoặc 3 file cùng lúc bằng lệnh&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ vimdiff copyBTL1.txt copyBTL2.txt&lt;/span&gt;&lt;br /&gt;hoặc&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ vim -d copyBTL2.txt copyBTL1.txt copyBTL3.txt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... more to come (&lt;span style="font-weight: bold;"&gt;&lt;a href="http://forum.vnoss.org/topic1928.html"&gt;vimrc&lt;/a&gt;, multiple buffer, multiple session, multiple split, vimshell, external edit&lt;/span&gt; ... ), &lt;a href="http://forum.vnoss.org/topic2435.html"&gt;làm biếng&lt;/a&gt; nghĩ tiếp quá &lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;have fun geeks !&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7821962354512396978?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7821962354512396978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7821962354512396978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7821962354512396978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7821962354512396978'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/12/vim-vs-notepad.html' title='VIM vs Notepad++'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-460666708636322786</id><published>2008-11-29T10:44:00.005+07:00</published><updated>2010-07-07T20:59:27.438+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware-Device-HandHeld'/><title type='text'>BIOS access keys</title><content type='html'>Most OEM PC or custom-built clone PC using third-party motherboard (MoBo) allows user to configure various settings in &lt;a href="http://en.wikipedia.org/wiki/BIOS"&gt;BIOS&lt;/a&gt; (CMOS setup) to enter BIOS Setup or Configuration Utility in order to enable or disable devices or ports available, and more commonly, boot device priority or sequence. Some advanced settings also allow user to tweak computer performance, such as CPU clock speed multiplier and CPU &lt;a href="http://en.wikipedia.org/wiki/Front_side_bus"&gt;front side bus&lt;/a&gt; (FSB) rate for overclocking, chipset features, DRAM parity, speed and timing, etc.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To access BIOS configuration screen, user need to press and invoke a specific hotkey or keys combination during the initial BIOS load screen (usually right after the computer is powered on). Here’s a list of the ways and access keys to press to access BIOS Setup Utility on variety of popular OEM computer systems, motherboard makers and major BIOS brands. Note that some BIOS or computer systems may have &lt;i&gt;more than one method of accessing BIOS&lt;/i&gt; depending on when the BIOS is released.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Acer (Aspire, Power, Veriton, Extensa, Ferrari, TravelMate, Altos)&lt;/strong&gt;: Press [F2] or [Del] Immediately After Power Up&lt;br /&gt;&lt;strong&gt;Acer (Altos 600 Server)&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Esc] or [F1] During Boot (for Advanced Options)&lt;br /&gt;&lt;strong&gt;Acer (Older PC)&lt;/strong&gt;: Press [F1] or [Ctrl]+[Alt]+[Esc] to Access BIOS&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AMI (American Megatrends AMIBIOS, AMI BIOS)&lt;/strong&gt;: Press [Delete] During Boot&lt;br /&gt;AMI&lt;br /&gt;&lt;strong&gt;AMI (American Megatrends AMIBIOS, AMI BIOS) - Old Version&lt;/strong&gt;: Press [F1] or [F2] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Award BIOS (AwardBIOS)&lt;/strong&gt;: Press [Del] After Powering Up Computer&lt;br /&gt;&lt;strong&gt;Award BIOS (AwardBIOS) - Old Version &lt;/strong&gt;: Press [Ctrl]+[Alt]+[Esc] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ALR&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Esc] or [Ctrl]+[Alt]+[Del] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ARI&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Esc] or [Ctrl]+[Alt]+[Del] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AST Advantage&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Esc] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Compaq (Presario, Prolinea, Deskpro, Systempro, Portable)&lt;/strong&gt;: Press [F10] When Blinking Cursor Jumps To Top Right Corner of Screen&lt;br /&gt;&lt;strong&gt;Compaq (Presario, Prolinea, Deskpro, Systempro, Portable)&lt;/strong&gt;: Press [F10] When Logo Screen Is Displayed&lt;br /&gt;&lt;strong&gt;Compaq (Older Computers)&lt;/strong&gt;: Press [F1], [F2], [F10], or [Del] Key&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cybermax&lt;/strong&gt;: Press [Esc] Key&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dell (XPS, Dimension, Inspiron, Latitude. OptiPlex, Precision, Vostro)&lt;/strong&gt;: Press F2 When Dell Logo Is Displayed Until “Entering Setup” Appears&lt;br /&gt;&lt;strong&gt;Dell (Older 486 Models)&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Enter] During Boot&lt;br /&gt;&lt;strong&gt;Dell (Some Models)&lt;/strong&gt;: Press Reset Button Twice (i.e. Power Reset Button)&lt;br /&gt;&lt;strong&gt;Dell Dimension L566cx System&lt;/strong&gt;: Press [Del]&lt;br /&gt;&lt;strong&gt;Dell (Older &lt;a id="KonaLink1" target="undefined" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://www.mydigitallife.info/2008/07/06/comprehensive-list-of-how-key-to-press-to-access-bios-for-various-oem-and-computer-systems/#"&gt;&lt;span style=""&gt;&lt;span class="kLink" style=""&gt;Laptop&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; Models) &lt;/strong&gt;: Press [Fn]+[Esc] or [Fn]+[F1]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DTK (Datatech Enterprises)&lt;/strong&gt;: Press [Esc] Key Right After Powering On the PC.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;EISA Computer&lt;/strong&gt;: Press the Reset button on the Front of the Computer, then Press [Ctrl]+[Alt]+[Esc] immediately when the memory count begins or Press [Crtl]+[Alt]+[S].&lt;/p&gt;&lt;p&gt;&lt;strong&gt;eMachines (eMonster, eTower, eOne, S-Series, T-Series)&lt;/strong&gt;: Press [Tab] or [Del] During Boot&lt;br /&gt;&lt;strong&gt;eMachine (Some Older Computers)&lt;/strong&gt;: Press [F2]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fujitsu (LifeBook, Esprimo, Amilo, Tablet, DeskPower)&lt;/strong&gt;: Press [F2] When Fujitsu Logo Is Appearing.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Gateway Using Phoenix BIOS (DX, FX, One, GM, GT, GX, Profile, Astro)&lt;/strong&gt;: Press [F1]&lt;br /&gt;&lt;strong&gt;Gateway (Some Older PCs)&lt;/strong&gt;: Press [F2]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hewlett-Parkard (HP Pavilion, TouchSmart, Vectra, OmniBook, Tablet)&lt;/strong&gt;: Press [F1] Upon Startup or Bootup&lt;br /&gt;&lt;strong&gt;Hewlett-Parkard (HP Alternative)&lt;/strong&gt;: Press [F2] or [Esc]&lt;br /&gt;&lt;strong&gt;Hewlett-Parkard (HP) Tablet PC&lt;/strong&gt;: Press [F10] or [F12]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;IBM ThinkPad using IBM BIOS (Early Models)&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Ins] When Cursor Is At Upper-Right Corner of Screen&lt;br /&gt;&lt;strong&gt;IBM ThinkPad using IBM BIOS (Later Models)&lt;/strong&gt;: Press and Hold [F1] When Powering Up Laptop&lt;br /&gt;&lt;strong&gt;IBM ThinkPad using Phoenix BIOS&lt;/strong&gt;: Press [Ctrl]+[Alt]+[F11] from DOS Prompt&lt;/p&gt;&lt;p&gt;&lt;strong&gt;IBM PS/1 (Late Models), PS/ValuePoint and 330s&lt;/strong&gt;: Press [Ctrl]+[Alt]+[?]&lt;br /&gt;&lt;strong&gt;IBM PS/2 with Reference Partition&lt;/strong&gt;: Press [Insert] During Boot&lt;br /&gt;&lt;strong&gt;IBM PS/2&lt;/strong&gt;: Press [Ctrl]+[Ins] When Pointer Is At Top Right of Screen&lt;br /&gt;&lt;strong&gt;IBM PS/2&lt;/strong&gt;: Need Reference Disk and ADF Disk for Setup&lt;br /&gt;&lt;strong&gt;IBM PS/2 75 and 90&lt;/strong&gt;: Press [Ctrl]+[Alt]+[?]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;IBM (PC, XT, AT)&lt;/strong&gt;: Press [F1] Immediately On Powering On the Computer&lt;br /&gt;&lt;strong&gt;IBM (Older Computers or Notebooks)&lt;/strong&gt;: Press [F2]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lenovo (ThinkPad, IdeaPad, 3000 Series, ThinkCentre, ThinkStation)&lt;/strong&gt;: Press [F1] or [F2] on Boot Up&lt;br /&gt;&lt;strong&gt;Lenovo (Older Products)&lt;/strong&gt;: Press [Ctrl]+[Alt]+[F3], [Ctrl]+[Alt]+[Ins] or [Fn]+[F1].&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Microid Research MR BIOS&lt;/strong&gt;: Press [F1]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Micron (MPC Computers ClientPro, TransPort)&lt;/strong&gt;: Press [F1], [F2] or [Del] On Startup&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NEC (PowerMate, Versa, W-Series)&lt;/strong&gt;: Press [F2] During Boot&lt;br /&gt;&lt;strong&gt;NEC Versa Notebook&lt;/strong&gt;: Press and Hold Down [F1] Upon Startup or Bootup&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Olivetti PC Pro&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Shift]+[Del](in Num Pad) During Boot&lt;br /&gt;&lt;strong&gt;Packard Bell (8900 Series, 9000 Series, Pulsar, Platinum, EasyNote, imedia, iextreme)&lt;/strong&gt;: Press [F1], [F2], or [Del].&lt;br /&gt;&lt;strong&gt;Packard Bell (Early 386 and 486 Dodels)&lt;/strong&gt;: Press [Ctrl]+[Alt]+[S] Sequence&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Phoenix BIOS (Phoenix-Award BIOS)&lt;/strong&gt;: Press [Del] During Power On Self-Test&lt;br /&gt;&lt;strong&gt;Phoenix BIOS (Phoenix-Award BIOS) - Old Version&lt;/strong&gt;: Press [Ctrl]+[Alt]+[S], [Ctrl]+[Alt]+[Esc], [Ctrl]+[Alt]+[Ins] or [Ctrl]+[S] During Power On Boot Self-Test Right After Startup&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sharp (Notebook Laptops, Actius UltraLite)&lt;/strong&gt;: Press [F2] On Computer Starts&lt;br /&gt;&lt;strong&gt;Sharp (Old PCs)&lt;/strong&gt;: Require Setup Diagnostics Disk to Access BIOS&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shuttle (Glamor G-Series, D’vo, Prima P2-Series, Workstation, X Mini XPC, Surveillance)&lt;/strong&gt;: Press [F2] or [Del] on System Startup&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sony (VAIO, PCG-Series, VGN-Series)&lt;/strong&gt;: Press [F1], [F2] or [F3] After Turning On the Computer&lt;br /&gt;&lt;strong&gt;Sony Vaio 320 Series&lt;/strong&gt;: Press [F2] During Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tandon 386&lt;/strong&gt;: press [Ctrl]+[Shift]+[Esc]&lt;br /&gt;&lt;strong&gt;Tandon&lt;/strong&gt;: press [Ctrl]+[Shift]+[Esc]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Toshiba (Portégé, Satellite, Tecra)&lt;/strong&gt;: Press [Esc] During Boot&lt;br /&gt;&lt;strong&gt;Toshiba (Portégé, Satellite, Tecra with Phoenix BIOS)&lt;/strong&gt;: Press [F1] during Boot&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Zenith, Phoenix&lt;/strong&gt;: Press [Ctrl]+[Alt]+[Ins] During Boot&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Miscellaneous and Other Common BIOS Key Sequences&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[Ctrl]+[Esc]&lt;br /&gt;[Ctrl]+[Ins]&lt;br /&gt;[Ctrl]+[Alt]&lt;br /&gt;[Ctrl]+[Alt]+[+]&lt;br /&gt;[Ctrl]+[Alt]+[F3]&lt;br /&gt;[Ctrl]+[Alt]+[Del]&lt;br /&gt;[Ctrl]+[Alt]+[S]&lt;br /&gt;[Ctrl]+[Alt]+[Enter]&lt;br /&gt;[Ctrl]+[Alt]+[Ins]&lt;br /&gt;[Ctrl]+[Alt]+[Esc]&lt;br /&gt;[Ctrl]+[Shift]+[Esc]&lt;br /&gt;[Tab]&lt;br /&gt;[F1]&lt;br /&gt;[F3]&lt;br /&gt;[F4]&lt;br /&gt;[F10]&lt;br /&gt;[F12]&lt;br /&gt;[Fn]+[Function Key]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note that for some older system with Phoenix BIOS, the following steps are required to get to BIOS setup screen:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Exit or boot up to DOS.&lt;/li&gt;&lt;li&gt;Press [Ctrl]+[Alt]+[Esc] to enter setup screen.&lt;/li&gt;&lt;li&gt;If hot key sequence above doesn’t work due to changes or problems been made on the system, then try to use the key to lock the keyboard while leaving computer switched on.&lt;/li&gt;&lt;li&gt; Press the Reset button on the front of the computer. A message will appear asking user to unlock the keyboard.&lt;/li&gt;&lt;li&gt;Unlock the keyboard and press [F2] to run the CMOS setup. &lt;/li&gt;&lt;li&gt;Press [Del] to bring up the CMOS setup program. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;( From &lt;a href="http://mydigitallife.info"&gt;myDigitalLife&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BONUS: CMOS PASSWORD TOOL http://www.cgsecurity.org/wiki/CmosPwd&lt;br /&gt;&lt;br /&gt;Hopefully this list might help some laptops :-) ,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-460666708636322786?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/460666708636322786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=460666708636322786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/460666708636322786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/460666708636322786'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/bios-access-keys.html' title='BIOS access keys'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1986841742725315599</id><published>2008-11-26T20:39:00.006+07:00</published><updated>2009-01-01T11:02:30.059+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>J2EE with NetBeans</title><content type='html'>You can download the following simple demo presentation: &lt;br /&gt;(the presenter's pronounciation is very clear, feel free to practice your listening skill :D ): &lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;http://mediacast.sun.com/users/ArunGupta/media/v3prelude-nb65-webapp.flv&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;IMHO GlassFish is a fairly good Application Server, compared to JBoss, although the core servlet containers of both are derived from the same (Tomcat).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1986841742725315599?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1986841742725315599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1986841742725315599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1986841742725315599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1986841742725315599'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/j2ee-with-netbeans.html' title='J2EE with NetBeans'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8198638440042046208</id><published>2008-11-25T20:44:00.005+07:00</published><updated>2010-07-13T23:22:04.044+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Technical forum structure</title><content type='html'>Nhân thấy các bạn bên forum của CLB tin học &lt;a href="http://www.cse.hcmut.edu.vn/"&gt;khoa CSE&lt;/a&gt; của &lt;a href="http://www.hcmut.edu.vn/"&gt;trường ĐHBK HCM&lt;/a&gt; tranh luận về việc định hướng và tái cấu trúc forum, tớ thử nghĩ ra cấu trúc cho 1 forum định hướng &lt;a href="http://diendantinhoc.org/"&gt;kỹ thuật&lt;/a&gt; để thu hút được &lt;a href="http://diendantinhoc.com/"&gt;nhiều&lt;/a&gt; &lt;a href="http://reaonline.net"&gt;người&lt;/a&gt; &lt;a href="http://forum.vnoss.org/"&gt;giỏi&lt;/a&gt; &lt;a href="http://diendantinhoc.vn/"&gt;tham gia&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tuy nhiên chưa kịp post lên forum đó thì tớ đã bị "ban" nick vì "có quá nhiều sense of humour", đến nỗi vài anh bạn không-có-óc-hài-hước cảm thấy tủi thân. &lt;br /&gt;(nghĩ kỹ thì nhờ bị "banned" mà tiết kiệm được mấy $ mỗi giờ, hehe )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thôi thì cứ để các bạn ấy trưởng thành vậy, mình lo kiếm cơm qua ngày là đủ mệt rồi, gánh chi chuyện thiên hạ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8198638440042046208?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8198638440042046208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8198638440042046208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8198638440042046208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8198638440042046208'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/technical-forum-structure.html' title='Technical forum structure'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2899136014890499613</id><published>2008-11-24T20:44:00.019+07:00</published><updated>2008-12-20T22:06:00.421+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>VIM for dummies [2]</title><content type='html'>Sau khi biết được &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies.html"&gt;cơ bản về VIM&lt;/a&gt; thì các bạn đã bắt đầu có thể dùng vim để &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/best-text-editors.html"&gt;soạn thảo&lt;/a&gt; (edit) rồi, nhưng để hiệu quả hơn thì cần biết thêm một số thiết lập, phím tắt và lệnh. &lt;br /&gt;&lt;br /&gt;Bài này sẽ ôn lại một số điểm trong post trước và giới thiệu thêm một số thao tác thường gặp của vim . Hy vọng  sau bài này thì các bạn yêu thích máy tính sẽ cảm thấy hứng thú với việc dùng vim trên &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/linux-directory-structure.html"&gt;Linux&lt;/a&gt;/BSD.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Khởi động vim === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vim myfile.txt&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Bài này thì ta khởi động cách khác: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vim &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Khởi động kiểu này sẽ thấy hiện giữa màn hình các thông tin về tác giả (&lt;a href="http://en.wikipedia.org/wiki/Bram_Moolenaar"&gt;Bram Moolenaar&lt;/a&gt; - hiện đang làm cho Google), phiên bản (7.x.yz) , cách quit bằng &lt;b&gt;:q&lt;/b&gt; , cách xem trợ giúp bằng &lt;b&gt;:h&lt;/b&gt; , ... &lt;br /&gt;Bây giờ để bắt đầu soạn thảo 1 file (giả sử tên myfile.txt) , ta gõ lệnh &lt;br /&gt;&lt;b&gt;:edit myfile.txt&lt;/b&gt;&lt;br /&gt;hoặc đơn giản hơn chỉ cần &lt;b&gt;:e myfile.txt&lt;/b&gt; . &lt;br /&gt;&lt;br /&gt;Trong trường hợp bạn muốn mở nhiều file cùng lúc (ví dụ: &lt;i&gt;file1.js , file2.cpp, file3.java, ...&lt;/i&gt;), thì vim cũng hỗ trợ nhiều cách. Nếu phiên bản vim của bạn hỗ trợ tab các file, thì nên mở bằng cách sau: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vim -p file1.js file2.cpp &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Hoặc khi đang ở trong chế độ normal của vim, bạn dùng lệnh: &lt;br /&gt;&lt;b&gt;:tabedit file3.java&lt;/b&gt;&lt;br /&gt;thì vim sẽ mở cho bạn file3.java trong 1 tab mới :) .&lt;br /&gt;(Để ngắn gọn hơn có thể gõ &lt;b&gt;:tabe file3.java&lt;/b&gt; )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Di chuyển / Cuộn màn hình === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;* trái và phải : là "h" và tương ứng "l"&lt;br /&gt;* còn xuống , lên : là "j" , "k" &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Di chuyển bằng các phím (ở normal mode): &lt;br /&gt;+ Đến tab kế tiếp: &lt;b&gt;gt&lt;/b&gt; , tab trước đó: &lt;b&gt;gT&lt;/b&gt;&lt;br /&gt;+ Đến file mà tên nằm ở dấu nháy: &lt;b&gt;gf&lt;/b&gt; (để trở lại, dùng &lt;b&gt;Ctrl+o&lt;/b&gt; hoặc &lt;b&gt;Ctrl+6&lt;/b&gt; )&lt;br /&gt;&lt;br /&gt;+ Đến đầu file: &lt;b&gt;gg&lt;/b&gt;&lt;br /&gt;+ Đến (đầu) dòng cuối file: &lt;b&gt;G&lt;/b&gt; (tức là Shift+g )&lt;br /&gt;+ Đến dòng thứ 17: &lt;b&gt;17G&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Đến cuối dòng: &lt;b&gt;$&lt;/b&gt; &lt;br /&gt;+ Đến đầu dòng (ký tự đầu): &lt;b&gt;^&lt;/b&gt; &lt;br /&gt;+ Đến đầu dòng (cột 0): &lt;b&gt;0&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cuộn màn hình : &lt;br /&gt;+ Cả trang : &lt;b&gt;Ctrl+f&lt;/b&gt; (forward), &lt;b&gt;Ctrl+b&lt;/b&gt; (backward)&lt;br /&gt;+ Nửa trang : &lt;b&gt;Ctrl+d&lt;/b&gt; (down), &lt;b&gt;Ctrl+u&lt;/b&gt; (up)&lt;br /&gt;+ Từng dòng : &lt;b&gt;Ctrl+n&lt;/b&gt; (next), &lt;b&gt;Ctrl+p&lt;/b&gt; (previous) . Hoặc phím cũ là Ctrl+e và Ctrl+y&lt;br /&gt;&lt;br /&gt;Lưu ý: các &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/some-linux-hotkeys.html"&gt;tổ hợp phím&lt;/a&gt; scroll màn hình này cũng giống như khi dùng lệnh &lt;b&gt;man&lt;/b&gt;, &lt;b&gt;more&lt;/b&gt; hoặc &lt;b&gt;less&lt;/b&gt; , nên khi xem manpage hay file nào các bạn cũng có thể scroll bằng các tổ hợp phím kể trên.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Tìm kiếm / Thay thế === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;phím &lt;b&gt;/&lt;/b&gt; : tìm từ trên xuống&lt;br /&gt;phím &lt;b&gt;?&lt;/b&gt;: tìm từ dưới lên (thường dùng để tìm cụm từ có chứa &lt;b&gt;/&lt;/b&gt; )  &lt;br /&gt;Khi đã tìm thấy thì có thể bấm tiếp phím &lt;b&gt;n&lt;/b&gt; hoặc &lt;b&gt;N&lt;/b&gt; để tìm đến từ kế tiếp (next) .&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Tìm ngay các từ giống từ đang ở dấu nháy (cursor) : phím &lt;b&gt;*&lt;/b&gt; , hoặc &lt;b&gt;#&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thay thế (&lt;i&gt;substitute&lt;/i&gt;) thì dùng cú pháp mới gần giống sed: ( s/OLD/NEW/option )&lt;br /&gt;+ thay toàn bộ chuỗi "OLD" bằng chuỗi "NEW" trong cả file: &lt;br /&gt;&lt;b&gt;:%s/OLD/NEW/g&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ thay toàn bộ chuỗi "OLD" bằng chuỗi "NEW" trong đoạn từ dòng 5 đến dòng 17 : &lt;br /&gt;&lt;b&gt;:5,17s/OLD/NEW/g&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ thay toàn bộ chuỗi "OLD" bằng chuỗi "NEW" trong 1 dòng (đang chứa cursor) : &lt;br /&gt;&lt;b&gt;:s/OLD/NEW/g&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ chỉ thay chuỗi "OLD" đầu tiên trong dòng bằng chuỗi "NEW" thì ko cần "g" : &lt;br /&gt;&lt;b&gt;:s/OLD/NEW&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ nếu muốn có xác nhận (confirm) trước khi thay thì ta thêm option là "c" :&lt;br /&gt;&lt;b&gt;:%s/OLD/NEW/gc&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Các thao tác tìm kiếm và thay thế trên VIM cũng hỗ trợ biểu thức chính quy (Regular Expression) khá tốt. Các Regex được hỗ trợ trên vim hiện nay giống như của egrep, khá giống của perl . Nhưng để tránh phức tạp cho người mới dùng thì tớ chưa nêu ví dụ ở đây :D . &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Sao chép / Xóa / Dán === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Đơn giản: &lt;br /&gt;- chép (copy/yank) : phím &lt;b&gt;y&lt;/b&gt; &lt;br /&gt;- xóa : phím &lt;b&gt;d&lt;/b&gt; (hoặc phím &lt;b&gt;x&lt;/b&gt;)&lt;br /&gt;- dán : phím &lt;b&gt;p&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;btw, trong VIM thì xóa (delete) luôn có nghĩa là cắt (cut), tức là mất đi trên màn hình hiển thị , nhưng ngay lúc đó đã lưu lại trong vùng nhớ nào đó (gọi là vùng register hoặc còn gọi là vùng buffer). Khi đó có thể dán (paste) lại màn hình soạn thảo của vim bằng phím &lt;b&gt;p&lt;/b&gt; . &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Để xóa 1 đoạn thì ta có thể làm các cánh sau: &lt;br /&gt;&lt;br /&gt;1/ chuyển qua chế độ visual rồi chọn vùng cần xóa và bấm phím xóa &lt;br /&gt;&lt;br /&gt;2/ dùng chức năng đánh dấu (mark) bằng phím &lt;b&gt;m&lt;/b&gt; , đánh dấu 2 điểm rồi xóa từ điểm đầu đến điểm cuối &lt;br /&gt;&lt;br /&gt;3/ chuyển sang chế độ chuột &lt;b&gt;&lt;br /&gt;set mouse=a&lt;br /&gt;&lt;/b&gt;hoặc &lt;b&gt;&lt;br /&gt;set mouse=i&lt;br /&gt;&lt;/b&gt; rồi dùng chuột để chọn vùng cần xóa, rồi bấm phím xóa.&lt;br /&gt;&lt;br /&gt;4/ Ánh xạ các thao tác xóa thành tổ hợp phím nào đó (VD: kiểu Ctrl+C của Windows) , để chọn và xóa dễ hơn. &lt;br /&gt;&lt;br /&gt;5/ Chuyển sang chế độ soạn thảo giống các chương trình trên Windows , tức là dùng lệnh behave mswin để nó chuyển chế độ chuột và các phím tắt giống kiểu Notepad++ trên Windows.&lt;br /&gt;&lt;br /&gt; Đại khái như vậy, nhưng phần này tớ khoan nói rõ, ai quan tâm sẽ tự tìm hiểu :D .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Thiết lập / vimrc === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;* Chuyển theme màu khác cho vim, chẳng hạn theme "murphy" :&lt;b&gt;&lt;br /&gt;:colorscheme murphy&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật syntax highlight màu cho các ngôn ngữ lập trình, script :&lt;b&gt;&lt;br /&gt;:syntax on&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật số dòng (line number) lên cho dễ theo dõi:&lt;b&gt;&lt;br /&gt;:set number&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật chức năng hiện các lệnh (show command) đã gõ :&lt;b&gt;&lt;br /&gt;:set showcmd&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật "cây thước" để hiện số dòng, số cột, số ký tự đã gõ:&lt;b&gt;&lt;br /&gt;:set ruler&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật chức năng highlight các từ được search :&lt;b&gt;&lt;br /&gt;:set hlsearch&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;* Bật chức năng ignore case của từ được search để tìm được nhiều hơn :&lt;b&gt;&lt;br /&gt;:set ignorecase&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Ánh xạ phím tắt === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;Để undo, thì trước tiên &lt;b&gt;chuyển về normal mode&lt;/b&gt; (nhấn ESC) , rồi bấm &lt;b&gt;phím u&lt;/b&gt; , thế là undo 1 lần. Muốn undo nữa thì nhấn u nữa, cứ thế. Còn để &lt;b&gt;redo thì ở Normal mode ta bấm Ctrl+r&lt;/b&gt; (trong VIM thường ký hiệu là C-R) . Nếu muốn redo nữa thì lại bấm &lt;b&gt;Ctrl+r&lt;/b&gt; tiếp, bạn có thể redo đến hết lần undo liên tục gần nhất. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Một số tham khảo === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ôn lại bài trước: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;:h word&lt;/b&gt;&lt;br /&gt;(với "word" là từ mà mình muốn coi help) &lt;br /&gt;&lt;br /&gt;vim cũng có built-in sẵn 1 cái tutor về cách dùng VIM:&lt;br /&gt;&lt;b&gt;$ vimtutor&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2899136014890499613?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2899136014890499613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2899136014890499613' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2899136014890499613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2899136014890499613'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-2.html' title='VIM for dummies [2]'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-855908030354040117</id><published>2008-11-23T13:17:00.012+07:00</published><updated>2008-11-30T19:12:11.023+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Object-oriented programming principles</title><content type='html'>Sau khi đã biết được &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;các nguyên lý cơ bản để phát triển phần mềm&lt;/a&gt;, một lập trình viên nên biết qua về các nguyên lý &lt;b&gt;lập trình&lt;/b&gt; hướng đối tượng. &lt;br /&gt;&lt;br /&gt;Một số bạn thì gọi cái này là các nguyên tắc &lt;b&gt;thiết kế&lt;/b&gt; hướng đối tượng (OOD principles) . Theo tôi thì gọi như vậy là không chính xác. Các nguyên tắc OO này áp dụng cho lập trình (programming), từ thiết kế (design) đến viết mã (coding) đến kiểm thử (testing) , đều cần biết các nguyên tắc này và nên áp dụng ở từng giai đoạn luôn chứ không chỉ ở giai đoạn design. &lt;br /&gt;&lt;br /&gt;Nói một cách ví von, so với cờ thì: các nguyên lý KISS, DRY, YAGNI,... là các thế tàn cuộc cơ bản, các nguyên lý OOP là các cách chơi trung cuộc, còn như Design Patterns thì là các kiểu khai cuộc . Mặc dù ngày nay Design Patterns được nhắc đến nhiều nhưng thực sự thì để nâng cao nội lực thì nên nắm vững OOP principles , còn DP thì ban đầu chỉ cần biết một ít đủ để áp dụng OOP là được. &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Trong vài bài post sau này chúng ta sẽ thảo luận về Design Patterns , còn bây giờ tôi sẽ nêu 4 nguyên lý OOP cơ bản : &lt;br /&gt;&lt;br /&gt;1/ &lt;a href="http://en.wikipedia.org/wiki/Open/closed_principle"&gt;Nguyên lý đóng mở&lt;/a&gt; - OCP : (&lt;a href="http://www.objectmentor.com/resources/articles/ocp.pdf"&gt;open close principle&lt;/a&gt;)&lt;br /&gt;&lt;b&gt;Open for extension, but closed for modification.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tạm dịch: &lt;i&gt;Dễ mở rộng các hành vi, mà không cần phải sửa lại&lt;/i&gt; (class/interface/method)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2/ &lt;a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle"&gt;Nguyên lý thay thế Liskov&lt;/a&gt; - LSP : (&lt;a href="http://www.objectmentor.com/resources/articles/lsp.pdf"&gt;Liskov substitute principle&lt;/a&gt;)&lt;br /&gt;&lt;b&gt;Derived classes must be substitutable for their base classes.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tạm dịch: &lt;i&gt;Các lớp dẫn xuất phải có khả năng thay thế hẳn lớp cơ sở&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3/ &lt;a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle"&gt;Nguyên lý nghịch đảo phụ thuộc&lt;/a&gt; - DIP : (dependency inversion principle)&lt;br /&gt;&lt;b&gt;Depend on abstractions, not on concretions.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tạm dịch: &lt;i&gt;Nên phụ thuộc ở mức trừu tượng, tránh phụ thuộc cụ thể&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4/ Nguyên lý phân tách giao diện - ISP : (&lt;a href="http://www.objectmentor.com/resources/articles/isp.pdf"&gt;interface segregation principle&lt;/a&gt;) &lt;br /&gt;&lt;b&gt;Make fine grained interfaces that are client specific.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Tạm dịch: &lt;i&gt;Tạo các interfaces đã lọc kỹ và hướng tới người dùng&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4 revisited/ &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Nguyên lý trách nhiệm đơn định&lt;/a&gt; - SRP: (&lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;single responsibility principle&lt;/a&gt;)&lt;br /&gt;(Cái này là 1 góc nhìn khác của ISP, nếu bạn thích gọi là nguyên lý 5 thì cũng không sai mấy)&lt;br /&gt;&lt;b&gt;A class should have one, and only one, reason to change.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Tạm dịch: &lt;i&gt;Khi thay đổi, mỗi lớp chỉ nên có 1 và chỉ 1 lý do&lt;/i&gt; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ngoài ra còn các nguyên lý về phân gói (package), chia làm 2 nhóm: &lt;br /&gt;+ tăng độ kết dính (increase cohesion) : &lt;a href="http://objectmentor.com/resources/articles/granularity.pdf"&gt;REP, CCP, CRP&lt;/a&gt; &lt;br /&gt;+ giảm độ ghép cặp (decrease coupling) : &lt;a href="http://objectmentor.com/resources/articles/granularity.pdf"&gt;ADP&lt;/a&gt;, &lt;a href="http://objectmentor.com/resources/articles/stability.pdf"&gt;SDP&lt;/a&gt;, &lt;a href="http://objectmentor.com/resources/articles/stability.pdf"&gt;SAP&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Tuy nhiên nên nắm vững 4 nguyên lý cơ bản ở trên trước khi tìm hiểu các nguyên lý về package &amp; granuality .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-855908030354040117?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/855908030354040117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=855908030354040117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/855908030354040117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/855908030354040117'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/object-oriented-programming-principles.html' title='Object-oriented programming principles'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4845707327895868565</id><published>2008-11-22T10:05:00.007+07:00</published><updated>2010-07-13T23:22:04.046+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Double-clicked Java</title><content type='html'>&lt;b&gt;Nice article from &lt;a href="http://www.linkedin.com/in/dmitryleskov"&gt;Dmitry Leskov&lt;/a&gt;: &lt;br /&gt;http://javalobby.org/articles/java2exe/&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"How do I make an .EXE file from my Java application?"&lt;/i&gt;, &lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Need help converting jar to exe"&lt;/i&gt;, &lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Is it possible to create a Windows executable using Java?"&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;--- these and similar questions are among the most popular topics on Java developer forums. Should you start such a topic today, you are likely to encounter the following three types of replies:&lt;br /&gt;&lt;br /&gt;1/ "You cannot"&lt;br /&gt;2/ "You should not, because that would kill the very purpose of &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-coding-convention.html"&gt;Java&lt;/a&gt;"&lt;br /&gt;3/ "You can do that with third party software X and Y"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      The truth is that there exist two completely different approaches to the creation of native executables from Java applications, addressing different sets of problems. Moreover, under certain conditions some of those problems may be solved without making an EXE. So the most correct way to reply to such a post would be a request for more information, namely what is the goal of conversion to EXE. And the most frequent answer would be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Simplify Java Application Deployment ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Java compiles to platform-independent bytecode (.class files), which is not directly supported by PC hardware. So a Java program needs a Java Runtime Environment (&lt;a href="http://en.wikipedia.org/wiki/JRE"&gt;JRE&lt;/a&gt;) to run, which would either interpret the bytecode instructions or compile them to native code on the fly. This in turn means that the author of that program has to ensure somehow that the proper version of the JRE is installed on an end user system.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In a general case you may not expect that your end users will know what a JRE is, how to check its version, and how to download and install it. This is especially true for consumer applications, such as games or multimedia. And those who already have a JRE installed may not like the idea about installing a different version, because it may break their existing Java applications and favorite applets.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then, even if you can make sure the right version of the JRE is properly installed on enduser systems, which is quite possible in a classroom or enterprise environment, the command line required to launch your Java application can be quite long:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;    java -Xmx200m -cp whatever.jar -Dsome.property MyApp&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Yes, you may put that line into a batch file and call it runme.bat, but it looks so much easier to give your program to a friend, teacher or colleague as a single file that can be run by a double-click. Or, even better, enable it to be installed and uninstalled in a native manner without affecting other applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So it comes as no surprise that the primary motivation for seeking a way to convert a Java application into an EXE file is to make its deployment and use simpler and safer for an average user, that is, a &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/which-software-to-install-after-windows.html"&gt;Windows&lt;/a&gt; user. What surprises newbie Java developers is that the JDK does not offer such functionality. Before J2SE 1.4, all you could make with JDK tools were&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Executable Jars ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can make your Java application runnable via a double-click by packaging it into a so called executable &lt;a href="http://en.wikipedia.org/wiki/JAR_(file_format)"&gt;jar&lt;/a&gt;. You do that by specifying the main class of your application, any extra jar files it may require and so on in the jar's manifest file&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;    Main-Class: MyAppMain&lt;br /&gt;    Class-Path: mylib.jar&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Then you use the jar utility from the Java SDK to package your classes and resource files, specifying the m option and the name of your manifest file:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;    jar cvfm MyApp.jar MyApp.mf *.class *.gif&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This will result in the creation of MyApp.jar. Now, if you type&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;br /&gt;    java -jar MyApp.jar&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;the Java launcher will read the manifest from MyApp.jar and invoke the main method from the class MyAppMain. Moreover, if you double-click that jar file on a system that has JRE installed, the java launcher will be invoked automatically.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note: As of &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-tiger-and-mustang.html"&gt;J2SE 5.0&lt;/a&gt;, jar files are associated with the javaw launcher on Windows, which does not open a console on startup. If your application needs a console, write a batch file which would start it using the java launcher.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If your application consists of more than one jar file, there is an open source tool called One-JAR that claims to correctly repackage multiple jars into one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The major problem with executable jars is compatibility. The default JRE may be of an older version than is required by your application or may not have the necessary Java Optional Packages (previously known as Standard Extensions) installed. For instance, if your app uses the java.nio package introduced in Java 2 version 1.4, it will not work on JRE 1.3.x. Similarly, if it uses JavaMail 1.3, and the default JRE has JavaMail 1.2 or JavaMail is not present at all, the double-clicked jar will not run.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fortunately, Sun has created a Java application deployment technology that eliminates this compatibility problem and adds some nice features. It is part of the Java 2 platform since version 1.4 and is called&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Java Web Start ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Java Web Start (JWS) and the underlying Java Network Launch Protocol (&lt;a href="http://en.wikipedia.org/wiki/JNLP"&gt;JNLP&lt;/a&gt;) enable Java application delivery from a standard Web server. The end user initiates application installation by clicking on an URL. If the Java Web Start engine is not present on the system, the user is prompted to download and install it. Once Java Web Start is in place, clicking on the same URL will initiate the application download and installation procedures. It may involve download and installation of the required version of the JRE and Optional Packages. Upon their successful completion, the application is launched. The application will be cached on the user's system so next time the user clicks on the same URL, the JWS engine will launch the local copy of the application from the cache, if it detects that the computer is offline or the application was not updated on the Web site.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another important feature of JWS is its ability to run your application in a sandbox - a restricted container based on Java security architecture. But, unlike an applet, your application can gain access to local system resources like the filesystem, printer and system clipboard using the JNLP API even if it comes from an untrusted environment, after prompting the user for confirmation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java Web Start is available for Windows, &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/linux-directory-structure.html"&gt;Linux&lt;/a&gt;, and Solaris, and is part of MacOS X since v10.1. There are also third-party implementations of the JNLP protocol, some of them also include tools that assist you in the creation and maintenance of JNLP packages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That was the bright side. Now, what is not so good about JNLP? First off, for seamless operation both the browser and the Web server that hosts the JNLP-enabled application must support &lt;a href="http://en.wikipedia.org/wiki/MIME"&gt;application/x-java-jnlp-file&lt;/a&gt; MIME type. Some hosting providers do not support it. Moreover, versioning and incremental updates require additional support from the Web server, which has to be implemented using servlets, cgi-bin scripts, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On the client side, a major browser would be configured to recognize the above MIME type during installation of the JWS engine, but users of less popular browsers, such as Opera, may have to do that manually.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JNLP-enabling an application may involve minor changes in its code and (re)packaging it into a set of jar files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before J2SE 5.0, JWS had very little to offer in terms of desktop integration - all it could do was create a desktop icon and/or a Start Menu entry for the application. On Windows, the application will not show up in Add/Remove Programs, so end users would have to run the Java Web Start application manager in order to remove your application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally, JWS user interface needs much polishing. As of &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-tiger-and-mustang-2.html"&gt;J2SE 5.0&lt;/a&gt;, users still complain about ugly windows with incomprehensible messages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To sum it up, JWS can be a viable option in a controlled environment, such as corporate intranet, but it is not ready for the consumer market, where you may be better off using&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Custom Java Launchers And Wrappers === &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When a Java program is invoked using one of the methods discussed above (batch file, executable jar, or Java Web Start/JNLP), the operating system runs a Java launcher from the JRE. The Windows version of the JRE has separate launchers for command-line and GUI apps, called java.exe and javaw.exe respectively.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a result, all running Java applications have the same Taskbar/Alt-Tab icons and appear in the Windows Task Manager as either java.exe or javaw.exe. If you have two or more Java apps running, you have no means to distinguish between multiple instances of the standard Java launcher in the Task Manager.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In fact, those launchers are just small native programs that load the Java Virtual Machine from a DLL/shared library and then feed your program to that JVM using the Invocation API. That API is part of the Java Native Interface (&lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;JNI&lt;/a&gt;), so it is standardized, and it is also very simple. This makes it relatively easy to write your own launcher with a unique name and icon. What it has to do is find a suitable JRE on the end user's system (unless you bundle the JRE with your application), load and initialize the JVM, and run your application on it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you do not have the right tools, skills, or time to develop a custom launcher for your Java application, there are quite a few third-party Java launcher generators listed in the Tools section of the frame. Some of them provide additional features such as instant splash screen, stdout and stderr redirection, and so on, the most notable being wrapping.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A Java wrapper is essentially a custom Java launcher that is also a self-extracting archive containing all the application's classes, jars and auxiliary files. The wrapper unpacks those files on startup and removes on termination. This way, your application is distributed as a single executable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A wrapper normally looks up the JRE upon startup. If the JRE is not present or its version does not match the application's compatibility requirements, some wrappers may install the JRE (if you have included it when wrapping your application) and/or download and install the required version of the JRE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The most sophisticated wrappers may also setup file associations and create shortcuts on first run. But if you need something more complex, such as support for automatic updates or uniform cross-platform deployment, have a look at&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Java-Aware Setup Authoring Tools ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If all you need is install a private copy of the JRE alongside your application and create shortcuts that run your application on that JRE, you may use any setup generator. However, using a Java-aware tool may give you the following benefits:&lt;br /&gt;&lt;br /&gt;    * Install-time JRE detection and download&lt;br /&gt;    * Generation of native launchers&lt;br /&gt;    * User-editable JVM parameter files&lt;br /&gt;    * Redirection of stderr and stdout for saving logs and exception stack traces.&lt;br /&gt;    * Registration of Java applications as Windows services and Unix daemons&lt;br /&gt;&lt;br /&gt;This category is the most diversified in terms of tool pricing and &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;functionality&lt;/a&gt;. The differences are explained below by example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Windows-centric tools, such as Advanced Installer for Java enable you to build MSI (Windows Installer) packages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Multi-platform tools can generate native installers for multiple platforms - Windows, &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/ubuntu-post-installation-notes.html"&gt;Linux&lt;/a&gt;, Mac OS X, as well as RPMs and tarballs. install4j is one such tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There exist also Java-based setup authoring tools enabling you to create cross-platform installations, Those installations are essentially executable jars with platform-specific logic selected at run time. InstallAnywhere is perhaps the most well known tool of this type, but if its pricing is beyond your budget, consider the cheaper JExpress or the open source IzPack.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally, there is One Tool to Rule Them All - InstallShield, which can create both Windows desktop (MSI) and cross-platform installations, plus server and mobile ones, for any type of application and for a multitude of platforms. And yes, it does support JRE lookup and bundling, native launchers, and so on.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For straightforward installations, however, InstallShield is an overkill. Also note that InstallAnywhere and InstallShield are aimed at the enterprise developer and are priced accordingly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All the above solutions do not change the fundamental principle mentioned in the first section of this article. Whether you make an executable jar or create a sophisticated installer, your Java program is still deployed as platform-independent bytecode. In the early days of Java, the only way to execute a Java program on a common PC hardware was to interpret that bytecode. Today, any decent J2SE implementation contains a Just-In-Time (&lt;a href="http://en.wikipedia.org/wiki/Just-in-time_compilation"&gt;JIT&lt;/a&gt;) compiler that compiles frequently executed methods to native code. So it sounds quite natural to take one step further and compile the entire application down to native code before it is deployed. Such tools exist and they are called&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Ahead-Of-Time Compilers ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;AOT compilers are known also as "static compilers" and "native code compilers". The latter term is the most used and, as it often happens, the least correct from the technical standpoint, because JIT compilers also produce native code.&lt;br /&gt;&lt;br /&gt;An Ahead-Of-Time (&lt;a href="http://en.wikipedia.org/wiki/AOT_compiler"&gt;AOT&lt;/a&gt;) compiler takes as input your jars and class files and produces a conventional native executable for the target platform, such as Windows EXE or &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/ubuntu-post-installation-notes.html"&gt;Linux&lt;/a&gt; ELF binary. Just like any other technical solution, this has its advantages and drawbacks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Advantages&lt;br /&gt;&lt;br /&gt;    * &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/php-performance-tips.html"&gt;Performance&lt;/a&gt;. A JIT compiler works at application's runtime and shares CPU and memory resources with the application it compiles and possibly other applications. An AOT compiler runs on the developer's system with no resource or compilation time constraints. Therefore it can potentially use more powerful resource-intensive optimizations, yielding better code.&lt;br /&gt;&lt;br /&gt;      This advantage is amplified if you application will be deployed to embedded systems or low-end desktop PCs, where the JIT compilers simply may not have enough resources to work.&lt;br /&gt;&lt;br /&gt;    * Intellectual Property Protection. Java bytecode is very easy to decompile - just google for "download java decompiler" and you will get your source code back in 5 minutes. Yes, you may obfuscate names of public classes and methods not accessed via reflection, but control flow obfuscation can render your bytecode unverifiable on future JVMs and hinders optimizations implemented in JIT compilers. Finally, encrypting your Java bytecode does not protect it at all regardless of the encryption algorithm you use.&lt;br /&gt;&lt;br /&gt;      In contrast, native code produced by an optimizing AOT Java compiler is about as hard to reverse engineer as if you have coded the original program in C++. Needless to say, there is no performance loss. If you are concerned about protecting your intellectual property, have a closer look at native compilation.&lt;br /&gt;&lt;br /&gt;    * User Perception. Java client applications often suffer from the so called warm-up cycle syndrome. Starting up a Java application involves bytecode interpretation, profiling and JIT-compilation. So Java programs tend to start much longer than their native counterparts and the initial response time of a Java app GUI element is much worse than after it has been used several times, which are the two major reasons for Java still being perceived as slow by many users.&lt;br /&gt;&lt;br /&gt;      A native executable runs directly on hardware, without the interpret-profile-compile overhead, so it may start faster and immediately demonstrates the best response times.&lt;br /&gt;&lt;br /&gt;    * Native deployment. Even the most sophisticated Java-aware setup tools have to generate native launchers for better desktop integration, and may need to take care of the JRE download and installation.&lt;br /&gt;&lt;br /&gt;      Executables produced by an AOT Java compiler do not depend on the JRE and can be deployed using any setup authoring tool available for the target platform. Moreover, AOT compilers may come with specifically tailored setup generators that create compact, professional installers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Drawbacks&lt;br /&gt;&lt;br /&gt;    * Dynamic applications. Classes that the application loads dynamically at runtime may be unavailable to the application developer. These can be third-party plug-ins, dynamic proxies and other classes generated at runtime and so on. So the runtime system has to include a Java bytecode interpreter and/or a JIT compiler.&lt;br /&gt;&lt;br /&gt;      Moreover, in the general case only classes that are loaded by either system or application classloader may be precompiled to native code. So applications that use custom classloaders extensively may only be partially precompiled.&lt;br /&gt;&lt;br /&gt;    * Hardware-specific optimizations. A JIT compiler has a potential advantage over AOT compilers in that it can select code generation patterns according to the actual hardware on which the application is executing. For instance, it may use Intel MMX/SSE/SSE2 extensions to speedup floating point calculations. An AOT compiler must either produce code for the lowest common denominator or apply versioning to the most CPU-intensive methods, which may result in code size increase.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FYI, there used to be half a dozen AOT Java compilers on the market in the year 2000, but the only two that have survived are Excelsior JET and &lt;a href="http://en.wikipedia.org/wiki/GCJ"&gt;GCJ&lt;/a&gt; (GNU Compiler for Java). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;./.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To discuss about this article, please go to &lt;a href="http://www.javalobby.org/java/forums/t19231.html"&gt;JavaLobby forum&lt;/a&gt; :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-4845707327895868565?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/4845707327895868565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=4845707327895868565' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4845707327895868565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/4845707327895868565'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/double-clicked-java.html' title='Double-clicked Java'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1294035377711846912</id><published>2008-11-20T20:46:00.010+07:00</published><updated>2010-09-12T15:58:16.758+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Scrum software development</title><content type='html'>Việc phát triển phần mềm ngày nay càng lúc càng lưu ý hơn đến việc sử dụng lại (re-use) và đáp ứng (adapt) với thay đổi của yêu cầu khách hàng, bởi kinh nghiệm cho thấy đó là điều tất yếu không thể tránh khỏi. &lt;br /&gt;Vì thế các quy trình phát triển phần mềm cổ điển như &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;WaterFall&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Spiral_model"&gt;Spiral&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process"&gt;RUP&lt;/a&gt;, ... càng lúc càng ít được dùng, mà thay vào đó là các phương pháp có tính &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;reusable và flexible&lt;/a&gt; cao. Các quy trình tập trung vào 2 tính năng trên được gọi là quy trình linh hoạt (&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile&lt;/a&gt; process) . &lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://www.readwriteweb.com/images/waterfalldevmodel.jpg" alt="WaterFall fails" &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Trong họ Agile software development process thì đến nay đã được khoảng năm bảy loại, nhưng nổi bật nhất là Extreme Programming (&lt;a href="http://extremeprogramming.org/"&gt;XP&lt;/a&gt;) và &lt;a href="http://learningscrum.com"&gt;Scrum&lt;/a&gt; . &lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://www.readwriteweb.com/images/agiledevelopment-overview.jpg" alt="Agile Basis" &gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tuy nhiên đến bây giờ thì Scrum xem như đã vượt qua XP và &lt;a href="http://en.wikipedia.org/wiki/Feature_Driven_Development"&gt;FDD&lt;/a&gt; để trở thành mô hình Agile được công nhận rộng rãi nhất. Bởi Scrum vừa tập hợp các best practices từ các mô hình khác (&lt;i&gt;daily meeting, test automation, iterations,...&lt;/i&gt; ), vừa khai thác triệt để các giá trị Agile (&lt;b&gt;team interaction, run first, customer collaboration, embrace change&lt;/b&gt;) .  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Các thuật ngữ và khái niệm trong quy trình Scrum mới nghe thì hơi khó hiểu hơn bên XP, chẳng hạn chia Roles thành &lt;b&gt;Pig&lt;/b&gt; và &lt;b&gt;Chicken&lt;/b&gt; , rồi nào là &lt;b&gt;Sprint&lt;/b&gt;, nào là &lt;b&gt;BackLog&lt;/b&gt;, rồi &lt;b&gt;BurnDownChart&lt;/b&gt;, etc... liệu có vi phạm &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;KISS&lt;/a&gt; ? (trong Agile thường dùng thuật ngữ "Assume Simplicity" hơn là K.I.S.S) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lúc đầu tôi cũng nghĩ là chia như vậy hơi rắc rối, làm sao mà lại tốt hơn quy trình XP được. Nhưng sau quá trình chấp nhận làm quen thuật ngữ và áp dụng triệt để Scrum tôi đã cảm thấy nó nhỉnh hơn XP (có lẽ nhờ kinh nghiệm XP đã làm trước đây chăng? ) . Dẫu sao đi nữa thì nó cũng là một quy trình đáng giá và sẽ rất tốt nếu áp dụng cho 1 team gồm những lập trình viên có kinh nghiệm. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hẹn lại trong 1 bài khác tôi sẽ trình bày rõ hơn các khái niệm trong quy trình Scrum và vì sao nó lại được đánh giá cao trong giới Agile. Nếu có thời gian thì giới thiệu sơ luôn các quy trình Agile khác như: AUP, DSDM, FDD, Getting Real, ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1294035377711846912?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1294035377711846912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1294035377711846912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1294035377711846912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1294035377711846912'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/scrum-software-development.html' title='Scrum software development'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-8287682057190138506</id><published>2008-11-18T22:27:00.005+07:00</published><updated>2008-12-28T21:55:52.884+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Some eponymous laws</title><content type='html'>which relates to software development or project management :D .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Brooks’ Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Adding manpower to a late software project makes it later.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Parkinson’s Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Work expands so as to fill the time available for its completion.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hoare’s Law of Large Programs&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Inside every large problem is a small problem struggling to get out.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lister’s Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;People under time pressure don’t think faster.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pareto Principle&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;For many phenomena, 80% of consequences stem from 20% of the causes.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Peter Principle&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;In a hierarchy, every employee tends to rise to his level of incompetence.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conway’s Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Any piece of software reflects the organizational structure that produced it.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fitts’ Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;The time to acquire a target is a function of the distance to and the size of the target.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tesler’s Law of Conservation as Complexity&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;You cannot reduce the complexity of a given task beyond a certain point. Once you’ve reached that point, you can only shift the burden around.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Occam’s Razor&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;The explanation requiring the fewest assumptions is most likely to be correct.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hofstadter’s Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;A task always takes longer than you expect, even when you take into account Hofstadter’s Law.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ninety-ninety Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hartree’s Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Whatever the state of a project, the time a project-leader will estimate for completion is constant.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jakob’s Law of the Internet User Experience&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;Users spend most of their time on other sites. This means that users prefer your site to work the same way as all the other sites they already know.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fisher’s Fundamental Theorem&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;The more highly adapted an organism becomes, the less adaptable it is to any new change.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clarke’s Second Law&lt;br /&gt;&lt;br /&gt;    &lt;div class=ninja-quote&gt;The only way of discovering the limits of the possible is to venture a little way past them into the impossible.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-8287682057190138506?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/8287682057190138506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=8287682057190138506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8287682057190138506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/8287682057190138506'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/some-eponymous-laws.html' title='Some eponymous laws'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-950656413403648739</id><published>2008-11-16T15:19:00.003+07:00</published><updated>2008-11-22T12:51:34.989+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Computer hackers exposed !</title><content type='html'>&lt;p class="snap_preview"&gt;&lt;strong&gt;Alan Cox&lt;/strong&gt; là lập trình viên máy tính và là người đóng góp chính vào sự phát triển của nhân Linux từ thuở sơ khai 1991.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Alan-Cox-1.jpg" height="225" width="240" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Alan-Cox-2.jpg" height="224" width="240" /&gt;&lt;br /&gt;&lt;span id="more-39"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;John Gilmore&lt;/strong&gt; là một trong những người sáng lập ra Electronic Frontier Foundation, Cypherpunks và Cygnus Solutions. Ông tạo ra thuyết phân cấp alt.* trong Usenet và là người đóng góp chính của dự án GNU.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/John-Gilmore-1.jpg" height="251" width="220" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/John-Gilmore-2.jpg" height="254" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Jon “maddog” Hall&lt;/strong&gt; là Giám đốc điều hành của Linux International, một tổ chức phi quyền lợi lập nên từ những nhà cung cấp máy tính muốn hỗ trợ và đẩy mạnh hệ điều hành Linux.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/John-Hall-1.jpg" height="261" width="220" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/John-Hall-2.jpg" height="246" width="230" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Grace Murray Hopper&lt;/strong&gt; là một nhà khoa học máy tính Mỹ và sĩ quan Hải quân Mỹ. Bà là một trong những lập trình viên kì cựu của Harvard Mark I, và phát triển trình biên dịch đầu tiên cho một ngôn ngữ lập trình. Do những thành tích đó mà người ta còn gọi bà là “Amazing Grace”.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Grace-Murray-Hopper-1.jpg" height="240" width="194" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Grace-Murray-Hopper-2.jpg" height="240" width="204" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;David Korn&lt;/strong&gt;, sáng lập ra Korn Shell, thường mặc áo thun in hình ban nhạc Korn. (Cool)!&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/David-Korn-1.jpg" height="250" width="208" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/David-Korn-2.jpg" height="250" width="233" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Eric Steven Raymond&lt;/strong&gt; là một lập trình viên, nhà văn và luật sư nổi tiếng trong cộng đồng mã nguồn mở. Ông nổi tiếng với câu nói: “Câu văn luộm thuộm thì tư duy cũng luộm thuộm”.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Eric-Raymond-1.jpg" height="175" width="200" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Eric-Raymond-2.jpg" height="175" width="234" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Eric-Raymond-3.jpg" height="205" width="161" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Eric-Raymond-4.jpg" height="205" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Richard Matthew Stallman&lt;/strong&gt; là một nhà phát triển phần mềm kiêm hacker. Năm 1983, ông khởi xướng dự án GNU tạo nên Hệ điều hành Unix. Ông còn là người phát triển trình soạn thảo Emacs gốc, GNU Compiler Collection (GCC), và GNU Debugger.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Richard-Stallman-1.jpg" height="208" width="200" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Richard-Stallman-2.jpg" height="205" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Richard-Stallman-3.jpg" height="213" width="300" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bjarne Stroustrup&lt;/strong&gt; là một nhà khoa học máy tính Đan Mạch. Ông đã thiết kế và phát triển ngôn ngữ lập trình C++ vào năm 1983.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bjarne-Stroustrup-1.jpg" height="200" width="243" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bjarne-Stroustrup-2.jpg" height="200" width="173" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bjarne-Stroustrup-3.jpg" height="200" width="217" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Linus Benedict Torvalds&lt;/strong&gt; - cha đẻ của chim cánh cụt Linux khi còn là 1 SV trường ĐH Helsinki (Phần Lan).&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Linus-Torvalds-1.jpg" height="200" width="215" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Linus-Torvalds-2.jpg" height="200" width="229" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Linus-Torvalds-3.jpg" height="230" width="157" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Larry Wall&lt;/strong&gt; là lập trình viên, nhà ngôn ngữ học và nhà văn. Ông tạo ra ngôn ngữ nổi tiếng Perl. Các hacker ngày nay cần phải cám ơn ông rất nhiều.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Larry-Wall-1.jpg" height="200" width="220" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Larry-Wall-2.jpg" height="200" width="190" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Larry-Wall-3.jpg" height="230" width="181" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stephan Gary “Woz” Wozniak&lt;/strong&gt; - đồng sáng lập Apple cùng Steve Jobs.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Steven-Gary-Wozniak-1.jpg" height="202" width="143" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Steven-Gary-Wozniak-2.jpg" height="204" width="158" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Steven-Gary-Wozniak-3.jpg" height="200" width="182" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dennis MacAlistair Ritchie&lt;/strong&gt; và &lt;strong&gt;Kenneth Lane Thompson&lt;/strong&gt; - cha đẻ Unix. Ken Thompson tạo ra ngôn ngữ B còn Dennis Ritchie tạo ra ngôn ngữ C.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Ken-Thompson-Dennis-Ritchie-1.jpg" height="160" width="246" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Ken-Thompson-Dennis-Ritchie-2.jpg" height="160" width="223" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Ken-Thompson-Dennis-Ritchie-3.jpg" height="208" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bill Gates&lt;/strong&gt; và &lt;strong&gt;Paul Allen&lt;/strong&gt; - miễn bình luận!&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bill-Gates-Paul-Allen-1.jpg" height="160" width="141" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bill-Gates-Paul-Allen-2.jpg" height="160" width="194" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Loyd Blankenship&lt;/strong&gt;, biệt danh: The Mentor (người cố vấn) được biết đến như 1 hacker khét tiếng và là nhà văn từ những năm 1980, khi ông còn là thành viên của các tổ chức hacker Extasyy Elite và Legion of &lt;strong&gt;Doom&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Loyd-Blankenship-1.jpg" height="260" width="186" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Loyd-Blankenship-2.jpg" height="260" width="188" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Riley Eller&lt;/strong&gt;, biệt danh: Caezar, là thành viên của Ghetto Hackers.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Riley-Eller-1.jpg" height="200" width="144" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Riley-Eller-2.jpg" height="200" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dan Farmer&lt;/strong&gt; là 1 chuyên viên an minh máy tính. Sau khi tốt nghiệp ĐH Purdue, ông bắt đầu phát triển chương trình COPS, chương trình này giải thích tại sao Unix bảo mật đến như vậy. Năm 1995, ông và Wietse Venema sáng lập ra &lt;strong&gt;SATAN&lt;/strong&gt; (Security Administrator Tool for Analyzing Networks). Nhìn ông này trông giống tay vocal của Kreator.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Dan-Farmer-1.jpg" height="188" width="221" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Dan-Farmer-2.jpg" height="188" width="200" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Dan-Farmer-3.jpg" height="216" width="169" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Susan Lynn Headley&lt;/strong&gt;, biệt danh: Thunder, là 1 trong số ít ỏi các nữ hacker, cô là thành viên của Roscoe Gang.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Susan-Lynn-Headley.jpg" height="272" width="250" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Richard Pryce&lt;/strong&gt; - khi mới 16 tuổi, cậu sinh viên âm nhạc này đã nổi danh như cồn vì thành tích phá vỡ hệ thống hàng trăm máy tính của Griffiths Air Force Base, NASA và Korean Atomic Research Institute.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Richard-Pryce-1.jpg" height="185" width="186" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Richard-Pryce-2.jpg" height="185" width="177" /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bruce Schneier&lt;/strong&gt; là một chuyên gia an minh mạng, 1 nhà mật mã học. Ông là tác giả 1 vài cuốn sách viết về bảo mật và mật mã. Ông phát minh ra các thuật toán Blowfish và Twofish.&lt;/p&gt; &lt;p&gt;&lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bruce-Schneier-1.jpg" height="190" width="153" /&gt; &lt;img src="http://freenet-homepage.de/rstore/geeksaresexy/Bruce-Schneier-2.jpg" height="161" width="159" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kết luận : &lt;/span&gt;&lt;br /&gt;Hackers là những người... tóc dài hoặc rậm râu ! (hoặc cả 2)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con đường thành nerd/geek vẫn còn xa quá !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-950656413403648739?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/950656413403648739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=950656413403648739' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/950656413403648739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/950656413403648739'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/computer-hackers-exposed.html' title='Computer hackers exposed !'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3474040791293979881</id><published>2008-11-16T09:28:00.011+07:00</published><updated>2010-07-07T20:53:41.538+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>Apache Maven2 POM</title><content type='html'>Các fan của Java chắc hẳn ít nhiều gì cũng biết đến &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; , nhưng ít lập trình viên VN biết rằng &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt; đã vượt qua mặt Ant để trở thành build tool chính cho rất nhiều dự án chuyên nghiệp .&lt;br /&gt;&lt;br /&gt;Maven ban đầu được đặt tên là &lt;a href="http://en.wikipedia.org/wiki/Project_Object_Model"&gt;Project Object Model&lt;/a&gt; , nên file cấu hình của nó là pom.xml (lúc mới ra Maven1 thì là project.xml) . Cũng giống như để sử dụng Ant phải biết cấu trúc buildfile (build.xml) , muốn sử dụng tốt Maven thì nên nắm rõ cấu trúc pom.xml . Đại khái cấu trúc của nó như sau:&lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://www.javaworld.com/javaworld/jw-05-2006/images/jw-0529-maven1.gif" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;hoặc đơn giản hơn: &lt;br /&gt;&lt;br /&gt;&lt;div class="ninja-image"&gt;&lt;img src="http://www.sonatype.com/books/maven-book/reference/figs/web/pom-relationships_pom-small.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[BASIC]&lt;br /&gt;groupId&lt;br /&gt;artifactId&lt;br /&gt;version&lt;br /&gt;packaging&lt;br /&gt;&lt;br /&gt;parent&lt;br /&gt;&lt;br /&gt;modules&lt;br /&gt;&lt;br /&gt;properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[DEPENDENCIES]&lt;br /&gt;dependencies&lt;br /&gt;-[dependency[groupId, artifactId, version, scope, type, classifier]]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[BUILD]&lt;br /&gt;build &lt;br /&gt;-[sourceDirectory, resources, testResources, plugins[plugin[artifactId, executions[execution[phase, goals, configuration]]]]&lt;br /&gt;&lt;br /&gt;reporting&lt;br /&gt;-[outputDirectory, plugins[...]]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[PROJECT INFOR]&lt;br /&gt;name&lt;br /&gt;description&lt;br /&gt;url&lt;br /&gt;licenses&lt;br /&gt;inceptionYear&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[ENVIRONMENT]&lt;br /&gt;profiles&lt;br /&gt;repositories&lt;br /&gt;pluginRepositories&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, more confident now ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3474040791293979881?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3474040791293979881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3474040791293979881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3474040791293979881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3474040791293979881'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/apache-maven2-pom.html' title='Apache Maven2 POM'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-2279414939547379289</id><published>2008-11-13T21:08:00.014+07:00</published><updated>2009-01-11T21:51:33.277+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='top5-bestTool-performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>VIM for dummies</title><content type='html'>Trong bài &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/best-text-editors.html"&gt;so sánh các Text Editor&lt;/a&gt;, tôi đã đề cập đến &lt;a href="http://en.wikipedia.org/wiki/Vi"&gt;vi&lt;/a&gt; và các dẫn xuất của nó, mà nổi tiếng nhất là vim (&lt;a href="http://en.wikipedia.org/wiki/Vim_(text_editor)"&gt;Vi IMprove&lt;/a&gt;) . &lt;br /&gt;Hầu như trong bản phân phối Linux nào hiện nay cũng có &lt;b&gt;vim&lt;/b&gt; và lệnh &lt;b&gt;vi&lt;/b&gt; sẽ được ánh xạ (symbolic link) đến vim , một số ít khác thì ánh xạ đến vài biến thể khác của vi như &lt;b&gt;elvis&lt;/b&gt;, &lt;b&gt;nvi&lt;/b&gt; . Cho nên nếu bạn có thấy các tips hoặc trick hiện nay cho &lt;b&gt;vi&lt;/b&gt; , đó nghĩa là dành cho VIM . Thỉnh thoảng cũng có vài *nix cũ (như Solaris) là còn xài &lt;b&gt;vi&lt;/b&gt; chính hiệu, nhưng cứ yên tâm là nếu đã rành vim thì gặp &lt;b&gt;vi&lt;/b&gt; nguyên thủy cũng chẳng phải lo :D  &lt;br /&gt; &lt;br /&gt;Ngoài ra còn 1 trình soạn thảo code khác cũng rất nổi tiếng và phổ biến trong giới *nix là &lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;Emacs&lt;/a&gt; . Đã từng có những tranh cãi dữ dội giữa các fan của vi và Emacs , nhưng rồi cũng chẳng đi đến đâu. Thôi quay lại với các tips nhỏ cho VIM nào : &lt;br /&gt;&lt;i&gt;&lt;br /&gt;(for those who don't know: VI/vim is a very good powerful and lightweight editor. It can run on console, i.e. command-line, of ALL the modern Operating Systems. VI/vim is incredibly hard to learn; it has a virtual cliff-face learning curve. But, once you’ve mastered it, you are the most effective manipulator of text possible. Watching experienced VIM coders typing prolly make you impressed, people say that the cursor just follows their eyes ! )&lt;br /&gt;&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Cài đặt VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tuy nói là trên Linux nào cũng có vim/vi , nhưng cũng có trường hợp các bản vim cài đặt sẵn trong hệ điều hành là bản thiếu chức năng. Thật không may, trong bản phân phối phổ biến nhất hiện nay là Ubuntu thì vim cài sẵn rất thiếu hấp dẫn: không hỗ trợ Unicode, tab, vimshell, ... Và thậm chí với phiên bản Ubuntu 8 trở lên thì vim đi kèm còn thiếu cả chức năng highlight màu ! OK, thực ra cũng chẳng có vấn đề gì nếu bạn có thể cài bản vim mới cho Ubuntu :&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ sudo apt-get install vim vim-runtime&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Nếu muốn đầy đủ, có cả GUI (gvim, evim, ...) thì cài thêm:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ sudo apt-get install vim-full&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Khởi động VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Thường ta dùng vim mở tập tin có tên "myfile.txt" bằng cách gõ lệnh: &lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vim myfile.txt&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;hoặc để đơn giản, ta gõ ngắn gọn &lt;b&gt;vi&lt;/b&gt; , Linux (Ubuntu/Fedora/SUSE/...) cũng sẽ hiểu là vim:&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vi myfile.txt&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;(nếu ở thư mục đó chưa có tập tin myfile.txt thì vim sẽ tạo ra 1 file rỗng và đặt tên là myfile.txt luôn)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Thoát khỏi VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bấm phím Escapse (phím Esc ở góc trên, bên trái màn phím), sau đó gõ &lt;br /&gt;&lt;b&gt;:q&lt;/b&gt;&lt;br /&gt;rồi bấm Enter để thoát khỏi 1 cửa sổ vim .&lt;br /&gt;&lt;br /&gt;Nếu có warning là chưa save, nên chưa quit được, thì bạn thêm dấu chấm than sau chữ q để thực hiện luôn lệnh thoát khỏi cần xác nhận:&lt;br /&gt;&lt;b&gt;:q!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Trong trường hợp muốn lưu lại các chỉnh sửa trên file đang làm (myfile.txt) và thoát khỏi thì dùng lệnh write quit:&lt;br /&gt;&lt;b&gt;:wq&lt;/b&gt;&lt;br /&gt;(ngoài ra còn lệnh cùng chức năng lưu và thoát &lt;b&gt;:x&lt;/b&gt; cũng là &lt;b&gt;:wq!&lt;/b&gt; , nhưng lệnh này không được khuyến khích với người mới làm quen vim vì nó chỉ exit mà không thể hiện là write quit)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Các chế độ của VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Khác với nhiều trình soạn thảo (text editor) quen thuộc trên Windows chỉ có 1 chế độ là edit , vim có ít nhất là 2 chế độ : command-mode và edit-mode (còn gọi là &lt;b&gt;normal-mode&lt;/b&gt; và &lt;b&gt;insert mode&lt;/b&gt;) , trong đó chế độ command (normal) là mặc định khi mới khởi động vim lên. &lt;br /&gt;Để bắt đầu chuyển sang chế độ edit (insert) thì đơn giản nhất là bạn nhấn phím &lt;b&gt;"i"&lt;/b&gt; , sau đó bạn đã có thể gõ, chỉnh sửa văn bản được rồi ! &lt;br /&gt;Sau đó để lưu (save) lại các thay đổi vào tập tin đang soạn, bạn đừng bấm Ctrl+S nhé :D , mà phải &lt;b&gt;bấm phím Escape để chuyển lại chế độ normal&lt;/b&gt; (command), rồi gõ lệnh write&lt;br /&gt;&lt;b&gt;:w&lt;/b&gt; &lt;br /&gt;Còn nếu muốn lưu thành (save as) tập tin có tên khác, chẳng hạn file2.txt, thì gõ : &lt;br /&gt;&lt;b&gt;:w file2.txt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sau đó để soạn thảo tiếp thì bạn lại phải trước tiên chuyển sang chế độ insert (bấm phím &lt;b&gt;"i"&lt;/b&gt;) . Rồi khi nào muốn thoát thì lại bấm Esc để chuyển sang chế độ normal và dùng các lệnh ở phần thoát khỏi  vim ở trên :-) &lt;br /&gt;(thực ra để chuyển chế độ normal sang insert, ngoài phím i còn có thể dùng phím a hoặc o )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Di chuyển trong VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Một điểm nữa trong vim cũng khá lạ với các bạn mới làm quen, đó là vim có thể di chuyển cursor mà không dùng các phím mũi tên , thay vào đó dùng 4 phím liền nhau: "h", "j" , "k" , "l" tương ứng:&lt;br /&gt;&lt;b&gt;* trái và phải : là "h" và tương ứng "l" &lt;/b&gt;&lt;br /&gt;&lt;b&gt;* còn xuống , lên : là  "j" , "k" &lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Tại sao lại có kiểu chế độ di chuyển bằng phím này? Và kể cả phím Esc để đổi chế độ trên kia? Câu trả lời rất đơn giản: vi ban đầu được viết theo chương trình &lt;b&gt;ed&lt;/b&gt; , chương trình này chỉ xử lý tuần tự kiểu soạn thảo 1 loạt, rồi các thao tác xử lý (như replace) thì lại 1 loạt, nên 2 chế độ kia tách rời cho phù hợp. Tác giả của vi, &lt;a href="http://en.wikipedia.org/wiki/Bill_Joy"&gt;Bill Joy, cũng là đồng sáng lập hãng Sun Microsystem&lt;/a&gt; , lại luôn lập trình trên loại bàn phím ADM3A , có hình bên dưới:&lt;br /&gt;&lt;div class=ninja-image&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/KB_Terminal_ADM3A.svg/800px-KB_Terminal_ADM3A.svg.png"&gt;&lt;br /&gt;&lt;/img&gt;&lt;/div&gt;&lt;br /&gt;Các bạn cũng thấy đó, trên bàn phím đó thì vị trí Esc cũng như Tab bây giờ, khá dễ bấm, và KHÔNG CÓ CÁC PHÍM MŨI TÊN RIÊNG để di chuyển. Chính vì lý do đó mà khi viết ra vi , Bill Joy đã làm ra các chức năng tương ứng các phím nói trên :D . Đến bây giờ thì các hậu duệ của vi vẫn giữ các tính năng này, mặc dù đã bổ sung nhiều tính năng mới phù hợp với kiểu bàn phím mới , xu hướng mới. &lt;br /&gt;&lt;br /&gt;(cũng tương tự như vậy, bạn có thể xoá ký tự trong vim mà chỉ dùng các phím chữ, chứ không cần dùng phím Delete hay Backspace. Bài sau sẽ giới thiệu kỹ hơn tính năng này) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;=== Thiết lập các tuỳ chọn VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Khi đang ở trong chế độ gõ lệnh (normal mode) của vim, bạn có thể dùng các lệnh sau để bật một số tuỳ chọn hữu ích cho vim (vốn bị ẩn đi trong Ubuntu mặc định) : &lt;br /&gt;&lt;br /&gt;* Chuyển theme màu khác cho vim, chẳng hạn theme "murphy" : &lt;br /&gt;&lt;b&gt;:colorscheme murphy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật syntax highlight màu cho các ngôn ngữ lập trình, script :&lt;br /&gt;&lt;b&gt;:syntax on&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật số dòng (line number) lên cho dễ theo dõi: &lt;br /&gt;&lt;b&gt;:set number&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật chức năng hiện các lệnh (show command) đã gõ :&lt;br /&gt;&lt;b&gt;:set showcmd&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật "cây thước" để hiện số dòng, số cột, số ký tự đã gõ:&lt;br /&gt;&lt;b&gt;:set ruler&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật chức năng highlight các từ được search :&lt;br /&gt;&lt;b&gt;:set hlsearch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* Bật chức năng ignore case của từ được search để tìm được nhiều hơn :&lt;br /&gt;&lt;b&gt;:set ignorecase&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Tìm kiếm từ trong VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Trước tiên bạn nên chuyển về chế độ normal (nhấn phím Esc) , sau đó nhấn phím slash ( &lt;b&gt;/&lt;/b&gt; ) rồi gõ từ cần tìm và nhấn Enter/Return để bắt đầu tìm . &lt;br /&gt;&lt;br /&gt;Ngoài phím &lt;b&gt;/&lt;/b&gt; , còn có thể dùng phím &lt;b&gt;?&lt;/b&gt; để tìm kiếm , giống như dùng / . Khác biệt giữa 2 kiểu này là / sẽ tìm các từ theo thứ tự từ đầu file đến cuối file (trên xuống), còn ? sẽ tìm cũng từ đó nhưng theo thứ tự ngược lại (tìm từ dưới lên). &lt;br /&gt;&lt;br /&gt;Nếu trong cụm từ muốn tìm kiếm, có chứa dấu / , ví dụ "directory1/file1" , thì khi tìm bằng &lt;b&gt;/&lt;/b&gt; bạn có thể thêm 1 dấu Backslash (\) ở trước dấu slash (/) để phân biệt: &lt;b&gt;/directory\/file1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tuy nhiên trong thực tế, khi tìm từ có dấu slash &lt;b&gt;/&lt;/b&gt; , ví dụ tìm cụm từ "http://google.com/" người ta thường dùng ? để tìm, còn lại thì tìm bằng / bình thường. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Bỏ làm và làm lại với VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hehe, chính là các thao tác "undo" và "redo" cũng khá phổ biến trong các chương trình soạn thảo. Các editor thông thường chỉ hỗ trợ vài chục đến khoảng trăm lần undo/redo liên tục, nhưng vim thì hỗ trợ vô hạn , tới mức tối đa mà máy tính của bạn chịu nổi, nên cứ yên tâm. &lt;br /&gt;&lt;br /&gt;Để undo, thì trước tiên &lt;b&gt;chuyển về normal mode (nhấn ESC) , rồi bấm phím u&lt;/b&gt; , thế là undo 1 lần. Muốn undo nữa thì nhấn &lt;b&gt;u&lt;/b&gt; nữa, cứ thế. Còn &lt;b&gt;để redo thì ở Normal mode ta bấm Ctrl+r&lt;/b&gt; (trong VIM thường ký hiệu là C-R) . Nếu muốn redo nữa thì lại bấm &lt;b&gt;Ctrl+r&lt;/b&gt; tiếp, bạn có thể redo đến hết lần undo liên tục gần nhất. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Xem phần trợ giúp về VIM ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Thông thường các lệnh, tập tin trong Linux bạn có thể coi nhanh cách dùng bằng tuỳ chọn --help , hoặc dùng &lt;b&gt;man&lt;/b&gt; để xem đầy đủ manual . Tuy nhiên trong bản thân vim cũng đã built-in các lệnh nên bạn có thể coi bằng cách dùng lệnh :h như sau trong chế độ normal (command ) : &lt;br /&gt;&lt;b&gt;:h word&lt;/b&gt;&lt;br /&gt;(với "word" là từ mà mình muốn coi help) &lt;br /&gt;&lt;br /&gt;Còn các tuỳ chọn (options) của lệnh &lt;b&gt;:set&lt;/b&gt; mà bạn muốn tìm hiểu thêm thì gõ: &lt;br /&gt;&lt;b&gt;:options&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Để thoát khỏi cửa sổ help của vim, cũng dùng cách thoát như đã nói ở phần trên ( :q ) &lt;br /&gt;&lt;br /&gt;vim cũng có built-in sẵn 1 cái tutor về cách dùng VIM , bạn có thể dùng lệnh sau để xem và thực hành tutor đó của vim: &lt;br /&gt;&lt;br /&gt;&lt;div class=ninja-quote&gt;&lt;b&gt;$ vimtutor&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Cuối cùng, xin nhắc các bạn là các lệnh của vim cũng như các lệnh trong Linux shell, đều là dạng viết tắt (hoặc đúng) chức năng tương ứng bằng tiếng Anh, khi gõ nếu không nhớ hết có thể gõ thêm phím Tab để tự bung ra các lệnh có cùng prefix. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OK, thế là xong các thao tác cơ bản nhất của VIM. Hy vọng vậy là đủ cho các bạn lần đầu làm quen với vi/vim . Khả năng của vim là rất lớn nhưng nếu ghi ra nhiều ở đây có thể làm các bạn nản chí nên chỉ tạm thế đã, hehe.  &lt;br /&gt;Nếu các bạn có hứng thú tớ sẽ &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-2.html"&gt;viết thêm&lt;/a&gt; dần 1 số tips &amp; tricks về vi/vim , trong &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-3.html"&gt;các&lt;/a&gt; &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-4.html"&gt;bài&lt;/a&gt; &lt;&lt;a href="http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-5.html"&gt;sau&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-2279414939547379289?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/2279414939547379289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=2279414939547379289' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2279414939547379289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/2279414939547379289'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies.html' title='VIM for dummies'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-1263153856974741810</id><published>2008-11-11T23:20:00.011+07:00</published><updated>2008-12-28T21:25:39.144+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>Individual Income Tax</title><content type='html'>Hic, VN sắp đổi luật Thuế Thu Nhập Cá Nhân (PIT) mới rồi , thiệt tình từ ngày bác Dũng lên Prime Minister toàn ra quyết định ngược lòng dân: cho mở Casino, sáp nhập Hà Tây, fake giá USD, nâng giá xăng... nay lại thêm cái này nữa, chán không tả.&lt;br /&gt;&lt;br /&gt;Luật thuế TNCN đã có từ năm 2007, nhưng trước đây thực hiện theo hướng dẫn khác: &lt;br /&gt;&lt;div class=ninja-image&gt;&lt;br /&gt;&lt;img src="http://img80.imageshack.us/img80/9260/thuetncn2007es2.png" alt="ThueThuNhapCaNhan2007"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Cách thực hiện theo thông tư sắp tới thì có 2 điểm đáng chú ý là:&lt;br /&gt;&lt;br /&gt;- hạ mức bắt đầu nộp thuế từ 60 triệu VNĐ/năm xuống còn 48 triệu VNĐ/năm&lt;br /&gt;(tức là thu nhập bình quân trên 4tr VNĐ/tháng đã đóng, thay vì trên 5tr VNĐ/tháng)&lt;br /&gt;&lt;br /&gt;- thực hiện giảm trừ gia cảnh, mỗi nhân thân phù hợp được giảm 1.6 triệu/tháng .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ai muốn xem kỹ hơn thuế TNCN 2007 thì tải ở đây: &lt;br /&gt;&lt;a href="http://giadinh.net.vn/UserFiles/File/Luat%20thue%20thu%20nhap%20ca%20nhan%202007.pdf"&gt;Luat Thue Thu Nhap Ca Nhan 2007.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Năm nay là 1 năm ảm đạm với nền kinh tế, đang tăng trưởng nhanh trở thành chậm và có thể là suy thoái, thậm chí khủng hoảng. Chẳng hiểu sao bác Ba lại đưa ra nhiều chính sách tồi quá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-1263153856974741810?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/1263153856974741810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=1263153856974741810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1263153856974741810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/1263153856974741810'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/individual-income-tax.html' title='Individual Income Tax'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-7718855056354699479</id><published>2008-11-10T23:27:00.003+07:00</published><updated>2010-07-13T23:25:16.803+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='OperatingSystem'/><title type='text'>Which virtual machine?</title><content type='html'>Of course not about software runtime, I am talking about virtual machine softwares like VMWare.&lt;br /&gt;  &lt;br /&gt;Which one do you think is best ? &lt;br /&gt;&lt;br /&gt;- VMWare Server&lt;br /&gt;&lt;br /&gt;- VMWare Player&lt;br /&gt;&lt;br /&gt;- VMWare Workstation&lt;br /&gt;&lt;br /&gt;- XenServer&lt;br /&gt;&lt;br /&gt;- VirtualBox&lt;br /&gt;&lt;br /&gt;- Qemu&lt;br /&gt;&lt;br /&gt;- Kvm&lt;br /&gt;&lt;br /&gt;- another ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-7718855056354699479?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/7718855056354699479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=7718855056354699479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7718855056354699479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/7718855056354699479'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/which-virtual-machine.html' title='Which virtual machine?'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3745453152375704824</id><published>2008-11-09T08:46:00.006+07:00</published><updated>2010-09-12T13:21:33.695+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social-Career-SoftSkill'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><title type='text'>English Listening Practice</title><content type='html'>&lt;b&gt;A. NGHE THỤ ĐỘNG:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. - ‘Tắm’ ngôn ngữ.&lt;/b&gt; Nghe không cần hiểu: Hãy nghe! Đừng hiểu.&lt;br /&gt;&lt;br /&gt;Bạn chép vào CD một số bài tiếng Anh (ví dụ các bài ghi âm từ các băng, &lt;a href="http://voanews.com"&gt;VOA&lt;/a&gt;, BBC...) . Mỗi bài có thể dài từ 1 đến 5 phút.&lt;br /&gt;Khi nào bạn ở nhà một mình, thì mở các bài đó ra vừa đủ nghe, và cứ lặp đi lặp lại mãi ra rả như âm thanh nền suốt ngày. Bạn không cần để ý đến nó. Bạn cứ làm việc của mình, đánh răng, rửa mặt, học bài làm bài, vào internet… với tiếng lải nhải của bài tiếng Anh. (thậm chí, trong lúc bạn ngủ cũng có thể để cho nó nói).&lt;br /&gt;&lt;br /&gt;Trường hợp bạn có CD player, USB player hay &lt;a href="http://en.wikipedia.org/wiki/IPod"&gt;iPod&lt;/a&gt;, thì đem theo để mở nghe khi mình có thời gian chết - ví dụ: di chuyển lâu giờ trên xe, đợi ai hay đợi đến phiên mình tại phòng mạch.&lt;br /&gt;&lt;br /&gt;Công việc &lt;b&gt;‘tắm ngôn ngữ’ này rất quan trọng&lt;/b&gt;, vì cho ta nghe đúng với từng âm của một ngôn ngữ lạ. Tai của chúng ta bắt rất nhanh một âm quen, nhưng loại trừ những âm lạ. Ví dụ: Nếu bạn nghe câu: ‘&lt;i&gt;mặt trời mọc cánh khi chim voi truy cập chén chó&lt;/i&gt;’, một câu hoàn toàn vô nghĩa, nhưng bảo bạn lặp lại thì bạn lặp lại được ngay, vì bạn đã quá quen với các âm ấy. Nhưng khi một người nói một câu bằng chừng ấy âm (nghĩa là 11 âm/vần), trong ngôn ngữ bạn chưa từng học, và bảo bạn lặp lại thì bạn không thể nào lặp lại được, và bảo rằng… không nghe được! (Bạn có điếc đâu! Vấn đề là tai bạn không nhận ra được các âm!) .&lt;br /&gt;Lối 'tắm ngôn ngữ' đó chỉ là vấn đề làm quen đôi tai, và sau một thời gian (lâu đấy chứ không phải vài ngày) bạn sẽ bắt được các âm của tiếng Anh, và thấy rằng âm ấy rất dễ nghe, nhưng hoàn toàn khác với âm Việt. Đừng nản lòng vì lâu ngày mình vẫn không phân biệt âm: hãy nhớ rằng bạn đã tắm ngôn ngữ tiếng Việt ít ra là 9 tháng liên tục ngày đêm trước khi mở miệng nói được tiếng nói đầu tiên và hiểu được một hai tiếng ngắn của cha mẹ; và sau đó lại tiếp tục 'tắm ngôn ngữ' Việt cho đến 4, 5 năm nữa!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2 - Nghe với hình ảnh động.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nếu có giờ thì xem một số tin tức bằng tiếng Anh (một điều khuyên tránh: &lt;b&gt;đừng xem chương trình tiếng Anh của các đài Việt Nam&lt;/b&gt;, ít ra là giai đoạn đầu, vì xướng ngôn viên Việt Nam, phần lớn, nói rất gần với âm Việt Nam (kể cả pronounciation), nên mình dễ quen nghe, và từ đó lỗ tai mình lại hỏng, về sau lại khó nghe người bản xứ nói tiếng Anh - thế là phải học lại lần thứ hai!).&lt;br /&gt;Các hình ảnh đính kèm làm cho ta ‘hiểu’ được ít nhiều nội dung bản tin, mà không cần phải ‘dịch’ từng câu của những gì xướng ngôn viên nói. Bạn sẽ yên tâm hơn, sau khi nghe 15 phút tin tức, tự tóm lược lại, thì mình thấy rằng mình đã nắm bắt được phần chính yếu của nội dung bản tin. Và đây là cách thư hai để tắm ngôn ngữ.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;B. NGHE CHỦ ĐỘNG:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Bản tin english news:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- Thu một bản tin, và nghe lại rồi chép ra nhiều chừng nào hay chừng nấy… nhớ là đừng tra cứu tự điển hay tìm hiểu nghĩa vội. Đoán nghĩa trong nội dung câu, và nhớ lại âm thanh của từ, hay cụm từ đó, sau này tự nó sẽ rõ nghĩa, nếu trở đi trở lại hoài.&lt;br /&gt;&lt;br /&gt;( Ngày xưa, trên đài VOA, sau mỗi chương trình tôi thường nghe một cụm từ tương tự như: statue, statute hay statu gì đó, mà không biết viết thế nào, tuy vẫn hiểu đại loại là: hãy đợi đấy để nghe tiếp. Mãi sau này tôi mới biết rằng thuật ngữ rất quen thuộc ấy là 'stay tune', nhưng một thời gian dài, chính tả của chữ ấy đối với tôi không thành vấn đề! )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Chăm chú nghe lại một số bài mình từng nghe&lt;/b&gt; trong giai đoạn ‘tắm ngôn ngữ’&lt;br /&gt;&lt;br /&gt;- Lấy lại script của &lt;b&gt;những bài mình từng nghe, đọc lại&lt;/b&gt; và nhớ lại trong tưởng tượng lời đọc mà mình từng nghe nhiều lần.&lt;br /&gt;&lt;br /&gt;Sau đó xếp bản script và nghe lại để hiểu. Lần này: tự nhiên mình sẽ nghe rõ từng tiếng và hiểu. Trường hợp không hiểu một từ hay cụm từ, thì gắng lặp lại nhiều lần đúng như mình đã nghe, sau đó lật lại script để so sánh.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Một số bài Audio trong các băng luyện nghe, luyện chứng chỉ&lt;/b&gt; :&lt;br /&gt;&lt;br /&gt;nghe nhiều lần, trước khi đọc script. Sau đó, đọc lại script, chủ yếu &lt;b&gt;kiểm tra những từ mình đã nghe&lt;/b&gt; hoặc đoán, hoặc những từ mà mình có thể phát âm lại nhưng không hiểu viết và nghĩa thế nào.&lt;br /&gt;Qua việc này, nhiều khi ta phát hiện rằng một từ mình rất quen thuộc mà từ xưa đến nay mình cứ in trí là phải nói một cách nào đó, thì thực ra cần phải nói khác hẳn và phát âm như thế thì mới mong nghe đúng và nói cho người khác hiểu. Sau đó, xếp bản script và nghe lại một hai lần nữa.&lt;br /&gt;(Ví dụ: hai chữ tomb, bury, khi xưa tôi cứ đinh ninh là sẽ phát âm là 'tôm-b(ơ), bơri' - sau này nghe chữ 'tum, beri' tôi chẳng hiểu gì cả - dù cho tôi nghe rõ ràng là tum, beri -cho đến khi xem script thì mới vỡ lẽ!)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Học hát tiếng Anh, và hát theo trong khi nghe.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nghe bài hát là cách hiệu quả nhất cho những người mới bắt đầu hoặc ít kiên nhẫn.&lt;br /&gt;&lt;br /&gt;Chọn một số &lt;b&gt;bài hát mà mình thích, tìm lyrics của nó rồi vừa nghe vừa nhìn lyrics&lt;/b&gt;. Sau đó học thuộc lòng và hát song song với ca sĩ, và gắng phát âm cũng như giữ tốc độ và trường độ cho đúng. Khi nào buồn buồn cũng có thể tự hát cho mình nghe (nếu không có giọng tốt và hát sai giọng một tí cũng không sao, vì chủ yếu là tập phát âm, tốc độ, trường độ và âm điệu tiếng Anh ) .&lt;br /&gt;&lt;br /&gt;Và nói cho đúng giọng (qua hát) cũng là một cách giúp mình sau này nhạy tai hơn khi nghe, vì thường thường ngôn ngữ trong các bài hát khó nghe hơn những câu nói bình thường rất nhiều.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Nghe đối thoại tiếng Anh trong phim&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Khi xem phim Mỹ, Anh, ... dù phim đã có thuyết minh hay phụ đề thì bạn cũng nên cố gắng nghe thử xem có giống như phụ đề hay không. Dần dần bạn sẽ phát hiện khả năng nghe của mình được cải thiện hẳn, và có thể xem phim gốc (không lồng tiếng, không thuyết minh, không phụ đề) vẫn hiểu được.&lt;br /&gt;Tuy &lt;b&gt;hiệu quả cao&lt;/b&gt; nhưng cách này hơi khó áp dụng thường xuyên và lâu dài cũng không tốt cho mắt, nên ở đây đành xếp cách này sau cùng.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Nguồn: &lt;a href="http://vn.360plus.yahoo.com/forever_lone_wolf"&gt;http://vn.360plus.yahoo.com/forever_lone_wolf&lt;/a&gt; )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3745453152375704824?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3745453152375704824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3745453152375704824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3745453152375704824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3745453152375704824'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/english-listening-practice.html' title='English Listening Practice'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-3333799098605096787</id><published>2008-11-08T12:35:00.007+07:00</published><updated>2008-11-13T22:19:38.783+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl-PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>PHP performance tips</title><content type='html'>Đã kiểm tra trên PHP5, còn PHP4 thì chưa, nhưng chắc cũng vậy. &lt;br /&gt;&lt;br /&gt;1/ foreach nhanh hơn for, for nhanh hơn while&lt;br /&gt;&lt;br /&gt;2/ echo nhanh hơn print&lt;br /&gt;&lt;br /&gt;3/ include nhanh hơn include_once&lt;br /&gt;&lt;br /&gt;4/ single quote string (') nhanh hơn double quote (")&lt;br /&gt;&lt;br /&gt;5/ phương thức static nhanh hơn non-static &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nguyên do :&lt;br /&gt;&lt;br /&gt;Các kết quả trên khá hợp lý nếu bạn nghĩ kỹ 1 chút về cú pháp PHP và ý nghĩa của các phần trên trong đó :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-3333799098605096787?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/3333799098605096787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=3333799098605096787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3333799098605096787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/3333799098605096787'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/php-performance-tips.html' title='PHP performance tips'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6816059430471186416</id><published>2008-11-05T23:53:00.006+07:00</published><updated>2010-07-13T23:22:04.048+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web2.0-PageRank-SEO'/><category scheme='http://www.blogger.com/atom/ns#' term='Vietnamese'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Sample code Java</title><content type='html'>Lúc này lên mấy diễn đàn vẫn thấy nhiều câu hỏi kiểu &lt;i&gt;"cho em xin đoạn source code có chức năng X"&lt;/i&gt; hoặc &lt;i&gt;"ai có source mẫu để làm việc Y hay không"&lt;/i&gt; . Mặc dù các câu hỏi dạng này không được xem là &lt;a href="http://NewbieLearnLinux.googlePages.com/SmartQuestions"&gt;thông minh&lt;/a&gt; lắm , và người có trình độ càng cao càng &lt;a href="http://newbielearnlinux.googlepages.com/smartquestions#8"&gt;ít muốn trả lời&lt;/a&gt; câu hỏi loại này, nhưng tớ thấy cũng nên có ai đó chỉ ra vài lần thay vì đơn giản "Google is your friend" hoặc "&lt;a href="http://newbielearnlinux.googlepages.com/smartquestions#6.1"&gt;STFW&lt;/a&gt;" . Vậy là có entry này :D &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Trước khi đặt request về mã nguồn Java, bạn hãy thử tìm trước ở những nơi sau đây: &lt;br /&gt;1/ thư mục sample và demo ở JAVA_HOME &lt;br /&gt;2/ &lt;a href="http://exampledepot.com"&gt;JavaAlmanac&lt;/a&gt;&lt;br /&gt;3/ &lt;a href="http://java2s.com"&gt;Java2s&lt;/a&gt;&lt;br /&gt;4/ &lt;a href="http://kodejava.org"&gt;KodeJava&lt;/a&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nếu muốn tìm luôn ứng dụng kèm mã nguồn thì lên các trang host mã mở: &lt;br /&gt;1/ &lt;a href="http://sourceforge.net"&gt;SourceForge&lt;/a&gt;&lt;br /&gt;2/ &lt;a href="http://freshmeat.net"&gt;FreshMeat&lt;/a&gt;&lt;br /&gt;3/ &lt;a href="http://ohloh.net"&gt;OhLoh&lt;/a&gt;&lt;br /&gt;4/ &lt;a href="http://apache.org"&gt;Apache&lt;/a&gt;&lt;br /&gt;5/ &lt;a href="http://code.google.com"&gt;CodeGoogle&lt;/a&gt;&lt;br /&gt;6/ &lt;a href="http://lauchpad.net"&gt;LauchPad&lt;/a&gt;&lt;br /&gt;7/ &lt;a href="http://savannah.gnu.org"&gt;Savannah&lt;/a&gt;&lt;br /&gt;8/ &lt;a href="http://ospdev.net"&gt;OspDev&lt;/a&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;Nếu muốn tìm nhanh 1 đoạn code chức năng hơi khó thì có thể dùng một số search engine chuyên tìm mã nguồn như:&lt;br /&gt;1/ &lt;a href="http://krugle.com"&gt;Krugle&lt;/a&gt;&lt;br /&gt;2/ &lt;a href="http://codase.com"&gt;Codase&lt;/a&gt;&lt;br /&gt;3/ &lt;a href="http://koders.com"&gt;Koders&lt;/a&gt;&lt;br /&gt;4/ &lt;a href="http://google.com/codesearch"&gt;GoogleCodeSearch&lt;/a&gt;&lt;br /&gt;5/ &lt;a href="http://jexamples.com"&gt;JExamples&lt;/a&gt;&lt;br /&gt;... &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Good luck &amp; Have fun !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6816059430471186416?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6816059430471186416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6816059430471186416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6816059430471186416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6816059430471186416'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/sample-code-java.html' title='Sample code Java'/><author><name>Newbie.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/06072253934755328603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-6477858007925619954</id><published>2008-11-04T22:32:00.023+07:00</published><updated>2009-01-24T16:21:53.174+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java-Groovy-Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='project-management-plan'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Java Coding Convention</title><content type='html'>&lt;b&gt;=== WHAT ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Coding convention&lt;/b&gt; (quy ước viết mã) : set of conventions (recommendations) for naming, formatting, and documentation requirements.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Coding standard of XYZ&lt;/b&gt; (chuẩn viết mã của XYZ) : set of standards (rules) of XYZ for naming, formatting, and documentation requirements.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Coding style&lt;/b&gt; (phong cách viết mã): the way somebody writes code and layouts. To get more effective and productive when programming, we should have common coding style and good practices; therefore we should follow practical coding conventions or coding standards.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== WHY ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first and most important reason is &lt;b&gt;Readablity&lt;/b&gt; (and &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/software-development-principles.html"&gt;reusability&lt;/a&gt;, of course) : easier for developers to read and understand each other's code . As a result: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ Quicker adapt to source code of new project, regardless of debugging/&lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-test-tools.html"&gt;testing&lt;/a&gt;/coding&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ Quicker transfer knowledge across projects, very useful for newcomers &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And also the conventions can &lt;b&gt;reduce name confliction&lt;/b&gt;, make &lt;b&gt;better proliferation&lt;/b&gt; (e.g. &lt;i&gt;pointTotal, totalPoints&lt;/i&gt;), &lt;b&gt;emphasize relationship&lt;/b&gt; among related items (e.g. &lt;i&gt;Customer { customerName, customerAddress, ... }&lt;/i&gt; ) , and &lt;b&gt;compensate for language&lt;/b&gt;'s weakness‏es .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== WHEN ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ Multiple developers are working on a project.&lt;br /&gt;&lt;br /&gt;+ Your program is so large that you can't hold the whole thing in your brain at once and must think about it in pieces.&lt;br /&gt;&lt;br /&gt;+ The program will be long-lived enough that you might put it aside for a few weeks or months before working on it again.&lt;br /&gt;&lt;br /&gt;+ Plan to turn a program over to another programmer for modifications and maintenance (which is nearly always).&lt;br /&gt;&lt;br /&gt;+ Your programs are reviewed by other programmers in your organization.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== HOW ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here are some &lt;a href="http://mediocre-ninja.blogspot.com/2008/11/java-power-tools.html"&gt;recommended&lt;/a&gt; coding conventions for &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/java-tiger-and-mustang.html"&gt;Java&lt;/a&gt;, yet it can be applied for other popular programming languages (PHP, ActionScript, Ruby, ...) , with a slight modification. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;File name&lt;/b&gt;: should be &lt;b&gt;alphanumeric&lt;/b&gt; (to be exact: [A-Za-z][A-Za-z0-9] ) and &lt;b&gt;underscore ( _ ) , hyphen ( - ) , dot ( . )&lt;/b&gt; only . Fortunately the Java compiler requires ".java" as an extension , and it will produce ".class" byte code file, so we can prevent some sudden inspiration with file names :D .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;File organization&lt;/b&gt;: In a file, we should use blank lines to separate sections, make it clean and clear. Usually 1 or 2 blank lines is sufficient, depends on how "big" that section is. In some extreme case we can use 3 blank lines to separate. Note that in modern languages such as Java we can alway separate a big program into at least several classes (and corresponding files) , so a file with more than 2000 lines is cumbersome and should be divided (to conquer) !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;File sections&lt;/b&gt;: should be the following order: header comments, package declaration, import declaration, main class/interface, internal classes (if exists). Example:&lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;/*&lt;br /&gt; * @(#)MyClass.java 1.54, 2008 Jan 01&lt;br /&gt; *&lt;br /&gt; * Copyleft 2008 Mediocre-Ninja. Use is subject to license terms.&lt;br /&gt; */&lt;br /&gt;package org.opensource;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * This is the dummy class for demonstration.&lt;br /&gt; *&lt;br /&gt; * @author  Mediocre-Ninja&lt;br /&gt; * @author  unascribed&lt;br /&gt; * @since 2008 Jan&lt;br /&gt; */&lt;br /&gt;public class MyClass {&lt;br /&gt;  //...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MyInternalClass {&lt;br /&gt;  //...&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;Class (or interface) declaration&lt;/b&gt;: should be the following order&lt;br /&gt;&lt;br /&gt;- Class or interface statement&lt;br /&gt;&lt;br /&gt;- Class or interface implementation comment, if necessary&lt;br /&gt;&lt;br /&gt;- Class (static) fields: public, protected, private&lt;br /&gt;&lt;br /&gt;- Instance fields: public, protected, private&lt;br /&gt;&lt;br /&gt;- Constructors.&lt;br /&gt;&lt;br /&gt;- Method: grouped by functionality rather than by scope&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;Indentation, line length and breaks&lt;/b&gt;: as following&lt;br /&gt;&lt;br /&gt;- A tab width is considered "indentation unit", but &lt;b&gt;replace the tab character by 2-4 spaces&lt;/b&gt;. [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-4.html"&gt;CONTROVERSIAL&lt;/a&gt;] The concrete number of spaces depends on the project. Usually 4 spaces for Java/JavaScript, 3 spaces for ActionScript/MXML/XML, 2 spaces for Python/Ruby/Perl/C...&lt;br /&gt;&lt;br /&gt;- Try to avoid lines longer than 80 characters, since they’re not handled well by many terminals and tools.&lt;br /&gt;&lt;br /&gt;- Principles when breaking lines: break AFTER A COMMA, break BEFORE AN OPERATOR, align the broken line as the same indentation (if it leads to confusing code then use 1 more "indentation unit", i.e. total 2 "units")&lt;br /&gt;&lt;br /&gt;- Example:&lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;longNameResult = longName2 * (longName3 + longName4 - longName5) &lt;br /&gt;                 + 4 * longname6; &lt;br /&gt;&lt;br /&gt;var = someMethod1(longExpressionHere,&lt;br /&gt;          someMethod2(longExpressionAgain,&lt;br /&gt;              longExpressionYetAnother)); &lt;br /&gt;&lt;br /&gt;if ( (condition1 &amp;&amp; condition2) || (condition3 &amp;&amp; condition4)&lt;br /&gt;        || !(condition5 &amp;&amp; condition6) ) {&lt;br /&gt;    doSomethingAboutIt();&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;private static synchronized horkingLongMethodName(int anArg,&lt;br /&gt;        Object anotherArg, String yetAnotherArg,&lt;br /&gt;        Object andStillAnother) {&lt;br /&gt;    //...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;alphaResult = (aLongBooleanExpressionForTernaryOne)&lt;br /&gt;                ? betaValueHere &lt;br /&gt;                : gammaExpressionHere;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;Comments&lt;/b&gt;: in Java can be classified as 2 kinds: Documentation (javadoc) comments, and implementation comments (both block comment (C-style) and line comment (C++ style) ). &lt;br /&gt;&lt;br /&gt;- trailing comments should be seperate (i.e. at least 1 space) from the semi-colon or left-most character&lt;br /&gt;&lt;br /&gt;- non-trailing comments should be preceded by a blank line&lt;br /&gt;&lt;br /&gt;- summary points should be in uppercase. Example: // TO DO: , // FIX ME:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;Naming convention&lt;/b&gt;: &lt;br /&gt;&lt;br /&gt;- &lt;i&gt;packages&lt;/i&gt;: use lowercase, group by function rather than scope&lt;br /&gt;&lt;br /&gt;- &lt;i&gt;classes&lt;/i&gt;: should be nouns, in mixed case with the first letter of each internal word capitalized. Also known as &lt;b&gt;"PascalCase"&lt;/b&gt; or &lt;b&gt;"UpperCamelCase"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- &lt;i&gt;interfaces&lt;/i&gt;: like classes&lt;br /&gt;&lt;br /&gt;- &lt;i&gt;constants&lt;/i&gt;: should be all uppercase with words separated by underscores ("_"). &lt;br /&gt;&lt;br /&gt;- &lt;i&gt;methods&lt;/i&gt;: should describe actions or states, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized. Also known as &lt;b&gt;"camelCase"&lt;/b&gt; or &lt;b&gt;"lowerCamelCase"&lt;/b&gt; . [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-2.html"&gt;CONTROLVERSIAL&lt;/a&gt;] Use &lt;b&gt;strict camelCase (either UpperCamel or lowerCamel) for abbreviations&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;- &lt;i&gt;variables&lt;/i&gt;: should be nouns, short yet meaningful, capitalized as "camelCase" . Should not start with '$' dollar-sign. [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-3.html"&gt;CONTROVERSIAL&lt;/a&gt;] To &lt;b&gt;distinguish fields and other variables, use 1 underscore '_' as prefix for field names&lt;/b&gt;. [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-3.html"&gt;CONTROVERSIAL&lt;/a&gt;] To &lt;b&gt;distinguish method parameters and other variables, use 1 underscore '_' as postfix for method parameters&lt;/b&gt;. [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-4.html"&gt;CONTROVERSIAL&lt;/a&gt;] Should &lt;b&gt;not use "Hungarian" notation, use "postfix Object" instead&lt;/b&gt;. Example: &lt;br /&gt;&lt;div class=ninja-code&gt;&lt;br /&gt;//import done&lt;br /&gt;public class MyObject {&lt;br /&gt;&lt;br /&gt;  private String _objectName;&lt;br /&gt;&lt;br /&gt;  public String setObjectName(String objectName_) {&lt;br /&gt;    this._objectName = objectName_ ;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected String downloadXmlThroughHttp(String xmlFileName_, URL httpUrl) {&lt;br /&gt;    //...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args_) {&lt;br /&gt;&lt;br /&gt;    public String objectName ; // don't use "strObjectName"&lt;br /&gt;    public String myMessage = args_[0]; // don't use "strMsg"&lt;br /&gt;&lt;br /&gt;    JTextArea commentTextArea; // don't use "txtComment"&lt;br /&gt;    protected JButton cancelButton; // don't use "btnCancel"&lt;br /&gt;    protected JButton saveButton; // don't use "btnSave"&lt;br /&gt;&lt;br /&gt;    private DataInputStream myDataIS; // don't use "dis"&lt;br /&gt;    private BufferedOutputStream myBufferedOS; // don't use "bufferedOutputStream"&lt;br /&gt;&lt;br /&gt;    //...&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;b&gt;Miscellaneous&lt;/b&gt; recommendations: &lt;br /&gt;&lt;br /&gt;- [&lt;a href="http://mediocre-ninja.blogspot.com/2009/01/java-coding-convention-4.html"&gt;CONTROVERSIAL&lt;/a&gt;] &lt;b&gt;Open brace '{' appears at the end of the same line&lt;/b&gt; as the declaration statement. Also known as &lt;b&gt;"one true brace"&lt;/b&gt; .&lt;br /&gt;&lt;br /&gt;- Each line should contain one statement, at most.&lt;br /&gt;&lt;br /&gt;- Use braces for single-statement block (if, else, do, while, for, try, catch,... )&lt;br /&gt;&lt;br /&gt;- Always have 1 space (at least) to seperate operator, casting, parameters from others.&lt;br /&gt;&lt;br /&gt;- No space between a method name and the parenthesis '(' which starts the parameter list&lt;br /&gt;&lt;br /&gt;- Try to initialize local variables where they’re declared&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;=== Reference ===&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;+ &lt;a href="http://ontko.com/java/java_coding_standards.html"&gt;Ontko's Java coding standard collections&lt;/a&gt; (including Sun's, Dough Lea's, ...)&lt;br /&gt;&lt;br /&gt;+ &lt;a href="http://www.amazon.com/review/product/0672328968"&gt;Agile Java Development&lt;/a&gt; book, Appendix B&lt;br /&gt;&lt;br /&gt;+ &lt;a href="http://www.amazon.com/review/product/0596527934"&gt;Java Power Tools&lt;/a&gt; book, part 6&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7731436080983282128-6477858007925619954?l=mediocre-ninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mediocre-ninja.blogspot.com/feeds/6477858007925619954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7731436080983282128&amp;postID=6477858007925619954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6477858007925619954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7731436080983282128/posts/default/6477858007925619954'/><link rel='alternate' type='text/html' href='http://mediocre-ninja.blogspot.com/2008/11/java-coding-convention.html' title='Java Coding Convention'/><author><name>Admin.Mediocre-Ninja</name><uri>http://www.blogger.com/profile/11478668482729947756</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7731436080983282128.post-4185287618621006736</id><published>2008-11-03T19:38:00.009+07:00</published><updated>2008-11-16T17:33:03.428+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux-BSD-Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Ubuntu post-installation notes [2]</title><content type='html'>In the &lt;a href="http://mediocre-ninja.blogspot.com/2008/10/ubuntu-post-installation-notes.html"&gt;previous article&lt;/a&gt; I have mentioned some basic steps after installing ubuntu.&lt;br /&gt;&lt;br /&gt;Now what? &lt;br /&gt;Well, some more basic steps for those who are new to Ubuntu: &lt;br /&gt;&lt;br /&gt;(assumed you have done 
