<?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-8390553214395009892</id><updated>2012-01-20T17:54:33.812-08:00</updated><category term='linux'/><category term='javafx'/><category term='android'/><category term='javascript'/><category term='java'/><category term='python'/><category term='jpa'/><category term='software'/><category term='sts'/><category term='maven'/><category term='gwt'/><category term='voip'/><category term='skype'/><category term='network'/><category term='performance'/><category term='eclipse'/><category term='applet'/><category term='ftp'/><category term='openoffice'/><category term='oracle'/><category term='netbeans'/><title type='text'>Coding, since 1985</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-4047907568824032245</id><published>2012-01-20T17:54:00.000-08:00</published><updated>2012-01-20T17:54:19.445-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>What Ubuntu Unity means to Linux community</title><content type='html'>Being a long-term Ubuntu Gnome user, I can definitely understand how die hard hackers hate Unity. But on the other hand, Unity makes some Ubuntu users re-think what they take for granted for last 5 - 6 years and re-examine the world around.&lt;br /&gt;&lt;br /&gt;Let's check the Linux users that accessed Wikipedia in September and October 2011 to see the huge impact of Unity.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://stats.wikimedia.org/archive/squid_reports/2011-09/SquidReportOperatingSystems.htm" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-LHLR3RbUh5Q/TxoVuGkXLrI/AAAAAAAAADY/rVfJOKbMPVo/s1600/2011-09.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;September 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://stats.wikimedia.org/archive/squid_reports/2011-10/SquidReportOperatingSystems.htm" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-wvX0efgdHSY/TxoWA6y0NPI/AAAAAAAAADg/qIhfJG7J5ZI/s1600/2011-10.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;October 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;A controversial product from Apple and Microsoft will hurt their users, while Linux users as a whole will benefit from such a product. And this is the spirit of FOSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-4047907568824032245?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/4047907568824032245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2012/01/what-ubuntu-unity-means-to-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4047907568824032245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4047907568824032245'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2012/01/what-ubuntu-unity-means-to-linux.html' title='What Ubuntu Unity means to Linux community'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/-LHLR3RbUh5Q/TxoVuGkXLrI/AAAAAAAAADY/rVfJOKbMPVo/s72-c/2011-09.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-6819506611277763249</id><published>2011-12-16T00:27:00.000-08:00</published><updated>2011-12-16T00:27:35.836-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>My 1st Android App - Sudokroll</title><content type='html'>I know how to solve Sudoku puzzles but have never solved one by myself. I'm just too lazy to do that.&lt;br /&gt;&lt;br /&gt;I developed a Sudoku solver a while ago. It has a command line interface, so just input your puzzle as follows and it'll get solved.&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_____8_7_&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;91___45__&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_7_5__8__&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_3__86_5_&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;7_______3&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_4_12__8_&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;__2__7_6_&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;__34___21&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_9_8_____&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Pretty cool, huh?&lt;br /&gt;&lt;br /&gt;As I always said, Android development is a bonus to Java developers. I ported my Sudoku solver and made it an Android application. It's called &lt;a href="https://dl.dropbox.com/u/14817847/sudokroll.apk"&gt;Sudokroll&lt;/a&gt;. As the name suggests, you touch a cell and scroll on the screen to assign a number for the cell.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-kx9NkG2z_Jg/Tur_QpUC6-I/AAAAAAAAADQ/SCU8kEq6ubY/s640/Screenshot+at+2011-12-16+19%253A16%253A35.png" width="443" /&gt;&lt;/div&gt;&lt;br /&gt;For better look and feel, it's for Android 2.3 Gingerbread and above. Have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6819506611277763249?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6819506611277763249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/12/my-1st-android-app-sudokroll.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6819506611277763249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6819506611277763249'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/12/my-1st-android-app-sudokroll.html' title='My 1st Android App - Sudokroll'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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://1.bp.blogspot.com/-kx9NkG2z_Jg/Tur_QpUC6-I/AAAAAAAAADQ/SCU8kEq6ubY/s72-c/Screenshot+at+2011-12-16+19%253A16%253A35.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-8903814233242286938</id><published>2011-12-01T03:09:00.001-08:00</published><updated>2011-12-01T03:15:06.213-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>When not to use Dependency Injection?</title><content type='html'>Dependency Inject and Inversion of Control are too popular for people to think when not to use them.&lt;br /&gt;&lt;br /&gt;DI / IoC encourages high-level modules define abstract services for low-level modules toimplement. The changes of the implementation in low-level modules won't affect the defined interfaces,so high-level modules can remain stable. Unit tests to high-level modules can be conducted even whenmocked low-level modules are provided.&lt;br /&gt;&lt;br /&gt;From this understanding, it’s always a good idea to use DI / IoC between layers in a multi-tiersoftware architecture. On the contrary, whether or not to use DI / IoC within the same tier shouldbe carefully examined. In most cases, factory method or even new statement will do. Here are a couple ofreasons.&lt;br /&gt;&lt;br /&gt;1. The components within same tier are usually tightly coupled. Changing one component and relatedcomponents need to change accordingly is sometimes reasonable, if compared to inter-tier cases.&lt;br /&gt;&lt;br /&gt;2. Within same tier, large amount of business objects may be created. This is very different from injectinga low-level service provider to high-level module. The performance of reflection in creating large amountof objects in IoC container may hurt the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8903814233242286938?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8903814233242286938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/12/when-not-to-use-dependency-injection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8903814233242286938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8903814233242286938'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/12/when-not-to-use-dependency-injection.html' title='When not to use Dependency Injection?'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-9029254274024912799</id><published>2011-11-09T21:41:00.000-08:00</published><updated>2011-12-01T03:16:35.465-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Upgraded to Subversion 1.7</title><content type='html'>&lt;br /&gt;If I am asked why you don't like SVN, the evil .svn folders is the answer. With the newly introduced &lt;a href="http://subversion.apache.org/docs/release-notes/1.7.html#wc-ng"&gt;Centralized Metadata Storage&lt;/a&gt;, there is only one .svn directory for each project, just like the .git folder in Git repository. Is it time to re-love Subversion? Well, yes and no.&lt;br /&gt;&lt;br /&gt;In order to support this new feature, you have to install &lt;a href="http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA"&gt;Eclipse Subclipse plugin&lt;/a&gt; 1.8.x. But before that, it's better do a&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;svn cleanup&lt;/span&gt;&lt;/blockquote&gt;for all of your working copies. Although I didn't do it and so far so good, don't risk it.&lt;br /&gt;&lt;br /&gt;If you followed &lt;a href="http://codingsince1985.blogspot.com/2011/09/java-development-using-ubuntu-1110-and.html"&gt;this tutorial&lt;/a&gt; and installed libsvn-java, please uninstall it. Because at the time of writing, the version of libsvn-java in Ubuntu repository is 1.6.12. When you try to access SVN server, you'll get&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Incompatible JavaHL library loaded. 1.7.x or later required.&lt;/span&gt;&lt;/blockquote&gt;Follow &lt;a href="http://stackoverflow.com/questions/7876091/incompatible-javahl-library-for-subclipse-in-64-bit-kubuntu/7885204#7885204"&gt;this &lt;/a&gt;to install libsvn-java 1.7.0 and upgrade your working copies with&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;snv upgrade&lt;/div&gt;&lt;/blockquote&gt;Now you have a centralized .svn folder. But don't think you can operate directories and files freely from now on. I use Subclipse 1.8.2 on Eclipse 3.7 SR 1 on Ubuntu 11.10 and found if you delete files and folders directly from file system, the deleted files and folders wouldn't show up in Synchronize view. However, if you add new files and folders, or modify files directly in file system, the plugin will get all the changes.&lt;br /&gt;&lt;br /&gt;Even if you delete a folder from Eclipse, and copy a folder with same name but with some changed files, you may get&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;blockquote class="tr_bq"&gt;Could not remove /home/jerry/java/workspace/...&lt;/blockquote&gt;&lt;/div&gt;It looks like the metadata fails keeping integrity. I suggest you keep all the folder structure and remove all the files in a folder tree in Eclipse, and copy a whole folder tree with files into project later. Although you may still have following errors, after you refresh project, everything should be fine.&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;blockquote class="tr_bq"&gt;Errors occurred while updating the change sets for SVNStatusSubscriber&lt;br /&gt;org.apache.subversion.javahl.ClientException: SQLite error&lt;br /&gt;svn: database table is locked&lt;br /&gt;svn: database table is locked: WORK_QUEUE&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;blockquote class="tr_bq"&gt;Errors have occurred while calculating the synchronization state for SVNStatusSubscriber.&lt;br /&gt;org.apache.subversion.javahl.ClientException: SQLite error&lt;br /&gt;svn: database table is locked&lt;br /&gt;svn: database table is locked: WC_LOCK&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;blockquote class="tr_bq"&gt;org.apache.subversion.javahl.ClientException: SQLite error&lt;br /&gt;svn: database table is locked&lt;br /&gt;svn: database table is locked: NODES&lt;/blockquote&gt;&lt;/div&gt;I summarize my suggestions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;always delete files from IDE;&lt;/li&gt;&lt;li&gt;if files changed but folder structure remain the same, don't delete folders from IDE&lt;/li&gt;&lt;/ul&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/8390553214395009892-9029254274024912799?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/9029254274024912799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/11/upgraded-to-subversion-17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9029254274024912799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9029254274024912799'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/11/upgraded-to-subversion-17.html' title='Upgraded to Subversion 1.7'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-2314004242754307979</id><published>2011-11-01T03:19:00.000-07:00</published><updated>2011-11-01T05:33:06.391-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Funny statements regarding Database and ORM</title><content type='html'>Twitter is great to share things that's hard to misunderstand. 140 characters are just inadequate to explain your philosophy of software development, even a series of tweets. Is a meaningful tweet to you also meaningful to your thousands of followers?&lt;br /&gt;&lt;br /&gt;I saw a series tweets from &lt;a href="http://twitter.com/#!/unclebobmartin"&gt;Uncle Bob Martin&lt;/a&gt; today and found them very confusing to me, and maybe misleading to others.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#%21/unclebobmartin/status/130998716604760065"&gt;Databases are details to be hidden.  They are not your central abstraction, nor are they the core of your application.   Ever.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In any multi-tier software architecture, lower tier provides service to the tier that sits on it. Modern theory tells us, upper tier defines the contract for lower tier to implement, rather than vice versa. Databases, as a repository service, is by no means a central abstraction, or the core of the whole application. Otherwise, my garage is the core of my house because I store everything there.&lt;br /&gt;&lt;br /&gt;But, databases provide an abstraction (no central here) to the tier just above the database layer. As long as the JDBC URL (from a Java developer's perspective, luckily Java is not unpopular so far in enterprise software development) is not used outside data access layer, we can say databases are hidden.&lt;br /&gt;&lt;br /&gt;Personally, I really don't know how not to make databases hidden, how not to think databases are not central abstraction, or not the core of an application.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#%21/unclebobmartin/status/131055807658856448"&gt;relational tables hold data structures, not objects.  Objects are bags of behavior.  Data structures are bags of data.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think he wanted to express either relational tables hold data structures, not classes; or relational tables hold structured data, not objects. But anyway. Relational tables don't hold objects / classes is just the reason why we need ORM to map them to objects / classes, and operate hidden data though interfaces.&lt;br /&gt;&lt;br /&gt;Any bridge is used to connect two different entities. ORM is the bridge between data and objects, or tables and classes. If the mapped objects don't provide something else convenient to application development, why do we do the mapping? From a bags of data to another bags of data? Yes, we can. But only in mapping to something like C.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#%21/unclebobmartin/status/131056036604936192"&gt;The O in ORM is in error.  It should be DS for Data Structure.  No simple tool can map tables to objects.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here comes the funniest part. Everyone knows ORM is first introduced in Java. That's easy to understand why ORM has a O in it. Java doesn't have &lt;i&gt;struct&lt;/i&gt; keyword, so it's ridiculous to criticize the naming of ORM. Can't we teach Data Structure in Java? The getters and setters in mapped objects are not behavior?&lt;br /&gt;&lt;br /&gt;Unless you apply Domain Driven Development, there are no operations other than getters and setters in mapped objects. Even if you apply DDD, the operations in mapped objects are not mapped from table, they come from business rules. For example, what, in a User table, can be mapped to a addUser() behavior in User class? Don't tell me it's mapped from a stored procedure called add_user. We're talking about tables, right? Stored procedures live inside databases, not tables.&lt;br /&gt;&lt;br /&gt;If anyone really likes this kind of naming game, here is a free topic for you if you have thousands of followers like this guy. &lt;i&gt;The disk in &lt;a href="http://en.wikipedia.org/wiki/RAM_disk"&gt;RAM disk&lt;/a&gt; is in error&lt;/i&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/8390553214395009892-2314004242754307979?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/2314004242754307979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/11/funny-statements-regarding-database-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2314004242754307979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2314004242754307979'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/11/funny-statements-regarding-database-and.html' title='Funny statements regarding Database and ORM'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-7395794890367283652</id><published>2011-10-19T22:46:00.000-07:00</published><updated>2011-10-19T22:46:13.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sts'/><title type='text'>Merit Certificate in Science Talent Search 2011</title><content type='html'>Not as lucky as in&amp;nbsp;&lt;a href="http://codingsince1985.blogspot.com/2009/10/major-bursary-in-science-talent-search.html"&gt;last&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2010/10/major-bursary-in-science-talent-search.html"&gt;two&lt;/a&gt; years.&lt;br /&gt;&lt;br /&gt;It's a great project, got excellent comments from 2 judges, but failed to get another Bursary. If you check out all the Prime Factorization projects on&amp;nbsp;&lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;, you'll find out it's the best so far.&lt;br /&gt;&lt;br /&gt;Be your personal best is all we can do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-7395794890367283652?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/7395794890367283652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/10/merit-certificate-in-science-talent.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7395794890367283652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7395794890367283652'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/10/merit-certificate-in-science-talent.html' title='Merit Certificate in Science Talent Search 2011'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1002510487660500787</id><published>2011-09-24T22:54:00.000-07:00</published><updated>2011-09-24T22:56:52.638-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Requirement for swap space (or virtual memory), not again</title><content type='html'>More and more users have more and more memory installed. In order to take advantage of their memory, some users move cache of &lt;a href="http://codingsince1985.blogspot.com/2010/08/tmpfs-and-postgresql.html"&gt;Firefox&lt;/a&gt; or &lt;a href="http://codingsince1985.blogspot.com/2010/10/change-cache-location-for-chromium.html"&gt;Chrome&lt;/a&gt; to memory from their disk, some Linux users move their temp directories to &lt;a href="http://codingsince1985.blogspot.com/2010/08/tmpfs-and-postgresql.html"&gt;tempfs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I &lt;a href="http://codingsince1985.blogspot.com/2011/04/natty-narwhal-installed.html"&gt;mentioned&lt;/a&gt; MyEclipse needs swap, or virtual memory, during installation. I came across almost the same problem when I installed Oracle Database Express Edition.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;This system does not meet the minimum requirements for swap space. &amp;nbsp;Based on the amount of physical memory available on the system, Oracle Database 10g Express Edition requires 1024 MB of swap space. This system has 0 MB of swap space. &amp;nbsp;Configure more swap space on the system and retry the installation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't have swap partition or swap file at that time, but the installer &lt;b&gt;ignored&lt;/b&gt; its own warning and installed itself successfully. I thank Oracle.&lt;br /&gt;&lt;br /&gt;I repeat my point here, swap is not necessary in Linux desktop. Hope those applications that still require swap or virtual memory consider it. For those still not sure whether you can remove swap, please reduce your &lt;a href="http://en.wikipedia.org/wiki/Swappiness"&gt;swappiness&lt;/a&gt;&amp;nbsp;to 0 to see if you can live without swap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1002510487660500787?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1002510487660500787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/09/requirement-for-swap-space-or-virtual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1002510487660500787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1002510487660500787'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/09/requirement-for-swap-space-or-virtual.html' title='Requirement for swap space (or virtual memory), not again'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-742456989316060787</id><published>2011-09-07T00:44:00.000-07:00</published><updated>2011-12-01T03:16:21.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Java development using Ubuntu 11.10 and OpenJDK 7</title><content type='html'>&lt;br /&gt;I tried Ubuntu 11.10 Oneiric Ocelot Beta 1.&amp;nbsp;LightDM is lighter and&amp;nbsp;beautiful. Maybe I can keep using Ubuntu on my ThinkPad T42, rather than jumping onto Lubuntu.&lt;br /&gt;&lt;br /&gt;Due to the &lt;a href="http://robilad.livejournal.com/90792.html"&gt;retiring of the "Operating System Distributor License for Java (DLJ)"&lt;/a&gt;, Sun / Oracle JDKs / JREs cannot be installed by enabling Canonical Partners' repository any more. It's a good news to OpenJDK. With more usage of OpenJDK, we can expect higher priority and fewer bugs.&lt;br /&gt;&lt;br /&gt;Since Java 7 is out, the first thing I did is installing OpenJDK 7. From Ubuntu Software Centre, you can only install JRE. I miss Synaptic Package Manager.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo apt-get install openjdk-7-jdk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Change default JRE of system from OpenJDK 6 to 7.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo update-alternatives --config java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I got following error when installing Subclipse plugin to Eclipse.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;An internal error occurred during: "Install download0".&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Library /usr/lib/i386-linux-gnu/libsoftokn3.so does not exist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creating a symbolic link sovled it.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd /usr/lib/i386-linux-gnu/&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo ln -s nss/libsoftokn3.so libsoftokn3.so&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After Subclipse is installed, I had a small problem in starting Eclipse 3.7 Indigo, but it's a common one.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo apt-get install libsvn-java&lt;/span&gt;&lt;br /&gt;and&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-Djava.library.path=/usr/lib/jni&lt;/span&gt;&lt;br /&gt;in eclipse.ini solved it.&lt;br /&gt;&lt;br /&gt;m2eclipse and Google plugin for Eclipse work out of box. Maven 3.0.3 works fine with OpenJDK 7.&lt;br /&gt;&lt;br /&gt;Apache Tomcat 7.0.21 works fine with OpenJDK 1.7.0 but if you haven't created the above symbolic link, you'll get below error when starting Tomcat.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;java.security.ProviderException: Library /usr/lib/i386-linux-gnu/libsoftokn3.so does not exist&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;at sun.security.pkcs11.SunPKCS11.&lt;init&gt;(SunPKCS11.java:292)&lt;/init&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;at sun.security.pkcs11.SunPKCS11.&lt;init&gt;(SunPKCS11.java:103)&lt;/init&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I also tried to install Gnome Shell.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo apt-get purge gnome-shell&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Installation&amp;nbsp;finished successfully but later when I specified Gnome to login, I got a dialog box saying&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;failed to load session "gnome"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a couple of solutions to the problem but none works for me, so I installed classic Gnome.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sudo apt-get install gnome-session-fallback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A fantastic experience, I'm looking forward to its release next month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-742456989316060787?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/742456989316060787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/09/java-development-using-ubuntu-1110-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/742456989316060787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/742456989316060787'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/09/java-development-using-ubuntu-1110-and.html' title='Java development using Ubuntu 11.10 and OpenJDK 7'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1194233791538924871</id><published>2011-08-09T22:52:00.000-07:00</published><updated>2011-08-09T22:52:51.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Return code 400 when creating a new feature type</title><content type='html'>I came across a 400 return code when I tried to use REST Configuration API of GeoServer to create a new feature type. The &lt;a href="http://docs.geoserver.org/stable/en/user/restconfig/rest-config-api.html"&gt;reference&lt;/a&gt; doesn't give any explanation to it. From GeoServer's log, I got&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;ERROR [geoserver.rest] - No such feature type:&lt;br /&gt;ERROR [geoserver.rest] -org.geoserver.rest.RestletException&lt;br /&gt;        at org.geoserver.catalog.rest.FeatureTypeFinder.findTarget(FeatureTypeFinder.java:40)&lt;br /&gt;        at org.restlet.Finder.handle(Finder.java:268)&lt;br /&gt;        at org.geoserver.rest.BeanDelegatingRestlet.handle(BeanDelegatingRestlet.java:37)&lt;br /&gt;        at org.restlet.Filter.doHandle(Filter.java:105)&lt;br /&gt;        at org.restlet.Filter.handle(Filter.java:134)&lt;br /&gt;        at org.restlet.Router.handle(Router.java:444)&lt;br /&gt;        at com.noelios.restlet.ext.servlet.ServletConverter.service(ServletConverter.java:129)&lt;br /&gt;        at org.geoserver.rest.RESTDispatcher.handleRequestInternal(RESTDispatcher.java:77)&lt;br /&gt;&lt;br /&gt;INFO [org.geoserver] - Loaded feature type '', enabled&lt;br /&gt;&lt;br /&gt;ERROR [geoserver.rest] - Trying to create new feature type inside the store, but no attributes were specified&lt;br /&gt;ERROR [geoserver.rest] -org.geoserver.rest.RestletException&lt;br /&gt;        at org.geoserver.catalog.rest.FeatureTypeResource.buildFeatureType(FeatureTypeResource.java:174)&lt;br /&gt;        at org.geoserver.catalog.rest.FeatureTypeResource.handleObjectPost(FeatureTypeResource.java:124)&lt;br /&gt;        at org.geoserver.rest.ReflectiveResource.handlePost(ReflectiveResource.java:122)&lt;br /&gt;        at org.restlet.Finder.handle(Finder.java:296)&lt;br /&gt;        at org.geoserver.rest.BeanDelegatingRestlet.handle(BeanDelegatingRestlet.java:37)&lt;br /&gt;        at org.restlet.Filter.doHandle(Filter.java:105)&lt;br /&gt;        at org.restlet.Filter.handle(Filter.java:134)&lt;br /&gt;        at org.restlet.Router.handle(Router.java:444)&lt;br /&gt;        at com.noelios.restlet.ext.servlet.ServletConverter.service(ServletConverter.java:129)&lt;br /&gt;        at org.geoserver.rest.RESTDispatcher.handleRequestInternal(RESTDispatcher.java:77)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;It shows that I'm trying to publish a feature type that doesn't exist. Problem solved here but I'd like to go the extra mile, check the source of FeatureTypeResource#buildFeatureType.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;170  if(fti.getName() == null) {&lt;br /&gt;171     throw new RestletException("Trying to create new feature type inside the store, " +&lt;br /&gt;172              "but no feature type name was specified", Status.CLIENT_ERROR_BAD_REQUEST);&lt;br /&gt;173  } else if(fti.getAttributes() == null || fti.getAttributes() == null) {&lt;br /&gt;174      throw new RestletException("Trying to create new feature type inside the store, " +&lt;br /&gt;175              "but no attributes were specified", Status.CLIENT_ERROR_BAD_REQUEST);&lt;br /&gt;176  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;WTF is line 173 doing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1194233791538924871?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1194233791538924871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/08/return-code-400-when-creating-new.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1194233791538924871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1194233791538924871'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/08/return-code-400-when-creating-new.html' title='Return code 400 when creating a new feature type'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3875077994945798186</id><published>2011-07-20T04:17:00.000-07:00</published><updated>2011-11-20T17:10:54.859-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Version Lock-in</title><content type='html'>Free and open source products are very popular in recent years. This helps to avoid vendor lock-in, but I noticed more and more version lock-in in using FOSS.&amp;nbsp;As the name suggests, version lock-in is the state that a product that depends on specific version of a 3rd-party product.&lt;br /&gt;&lt;br /&gt;When a project is developed from scratch, all the versions of 3rd-party products must be determined. Nothing wrong here. But if a 3rd-party product used is not its latest version, we have to take it very seriously. Sure you can say that version has everything you need, it also has potential bugs and performance issues you don't want. Imagine using a very old version of Yahoo! Mail web interface now and you'll get the idea.&lt;br /&gt;&lt;br /&gt;If a project is forked from another one, re-examine all the versions of 3rd-party products as early as possible, and keep an eye on them until the project is deployed. I don't remember how many times I searched an exception and found it's a bug and fixed in version x.&lt;br /&gt;&lt;br /&gt;On the other hand, by always trying to use latest version, you will be able to contribute to the community better. Consider when you &lt;a href="http://codingsince1985.blogspot.com/2010/06/soapui-351-on-ubuntu-1004.html"&gt;share&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2011/06/gvfs-bin-is-not-included-in-ubuntu-1104.html"&gt;an&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2011/06/performance-of-virtual-machine.html"&gt;experience&lt;/a&gt; or &lt;a href="http://codingsince1985.blogspot.com/2010/01/submitted-another-bug-to-eclipse.html"&gt;file&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2010/07/one-more-bug-submitted.html"&gt;a&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2010/11/bug-in-gwt-designer.html"&gt;bug&lt;/a&gt;, it makes much more sense when they're based on latest version.&lt;br /&gt;&lt;br /&gt;Be brave to use latest versions, or be braver to be version locked-in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3875077994945798186?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3875077994945798186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/07/version-lock-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3875077994945798186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3875077994945798186'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/07/version-lock-in.html' title='Version Lock-in'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3611569001904122896</id><published>2011-06-16T23:43:00.000-07:00</published><updated>2011-12-01T03:16:48.518-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Performance of Virtual Machine</title><content type='html'>I gave up dual boot when I upgraded to Ubuntu 11.04 and moved Windows into virtual machine. The performance of Windows guest was good, 35 seconds from power on to desktop (very good as my HDD is 5400 rpm), until I began using it seriously.&lt;br /&gt;&lt;br /&gt;I've done a benchmark of compiling one of my GWT project in Eclipse four times. I still remember Turbo C can compile 10 lines of code per second, while Turbo Pascal can compile 100 lines per second when I was in university. Compilation is quite suitable for benchmark because it involves both CPU and I/O tasks.&lt;br /&gt;&lt;style type="text/css"&gt;table.tableizer-table {border: 1px solid #CCC; font-family: Arial, Helvetica, sans-serif; font-size: 12px;} .tableizer-table td {padding: 4px; margin: 3px; border: 1px solid #ccc;}.tableizer-table th {background-color: #104E8B; color: #FFF; font-weight: bold;}&lt;/style&gt;&lt;br /&gt;&lt;table class="tableizer-table"&gt;&lt;tbody&gt;&lt;tr class="tableizer-firstrow"&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;1st&lt;/th&gt;&lt;th&gt;2nd&lt;/th&gt;&lt;th&gt;3rd&lt;/th&gt;&lt;th&gt;4th&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;native in Ubuntu&lt;/td&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;81&lt;/td&gt;&lt;td&gt;80&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;in VirtualBox&lt;/td&gt;&lt;td&gt;143&lt;/td&gt;&lt;td&gt;195&lt;/td&gt;&lt;td&gt;196&lt;/td&gt;&lt;td&gt;265&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;in Vmware Player&lt;/td&gt;&lt;td&gt;112&lt;/td&gt;&lt;td&gt;107&lt;/td&gt;&lt;td&gt;108&lt;/td&gt;&lt;td&gt;108&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The Windows I'm using in virtual machines is Windows 7 Professional 32-bit. IDE is Eclipse for Java EE 3.6.2 32-bit for Linux and Windows. Virtual machine software are Oracle VirtualBox 4.0.8 and VMware Player&amp;nbsp;3.1.4, for Linux of course.&lt;br /&gt;&lt;br /&gt;This is by no means a scientific benchmark, but what I got is if you plan to use a Windows guest &lt;i&gt;heavily&lt;/i&gt; in a Linux host, VMware Player is the one to go with at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3611569001904122896?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3611569001904122896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/06/performance-of-virtual-machine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3611569001904122896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3611569001904122896'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/06/performance-of-virtual-machine.html' title='Performance of Virtual Machine'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3022627214087243279</id><published>2011-06-07T22:51:00.000-07:00</published><updated>2011-12-01T03:17:26.309-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>gvfs-bin is not included in Ubuntu 11.04 by default</title><content type='html'>I developed a backup software running on Ubuntu at home. To get maximum transfer performance when copying files to remote machine, I use some VFS system commands like gvfs-rm, gvfs-copy and gvfs-mkdir. It's much faster than operating files and folders in ~/.gvfs, which, in my case, can get only up to 500kB/s.&lt;br /&gt;&lt;br /&gt;However the first time I used it after I upgraded to Natty Narwhal was a nightmare, I took for granted that those gvfs commands are ready to use but I was wrong.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; sudo apt-get install gvfs-bin &amp;nbsp;&lt;/code&gt;&lt;code style="color: black; word-wrap: normal;"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Murphy's law applies everywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3022627214087243279?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3022627214087243279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/06/gvfs-bin-is-not-included-in-ubuntu-1104.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3022627214087243279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3022627214087243279'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/06/gvfs-bin-is-not-included-in-ubuntu-1104.html' title='gvfs-bin is not included in Ubuntu 11.04 by default'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-8341928654517557757</id><published>2011-04-29T18:24:00.000-07:00</published><updated>2011-12-01T03:17:48.580-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Natty Narwhal installed</title><content type='html'>&lt;a href="http://codingsince1985.blogspot.com/2010/04/lucid-lynx-installed.html"&gt;As&lt;/a&gt; &lt;a href="http://codingsince1985.blogspot.com/2010/10/upgraded-to-ubuntu-1010-maverick.html"&gt;always&lt;/a&gt;, I installed latest Ubuntu 11.04 at the first time. Unity is not that bad but I did experienced a problem that I had to force power off my laptop. Unity 3D doesn't require decent graphic card. Auto-hide launcher and global menu help to save screen real estate, new scroll bar is cool. But to be on safe side, I stick with classic Gnome at the moment.&lt;br /&gt;&lt;br /&gt;One interesting issue occurred when I was installing MyEclipse 9.0 on my new system. Since I have 4GB memory I didn't create Swap partition. That's a reasonable choice but I got following prompt&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Insufficient Memory&lt;/blockquote&gt;&lt;blockquote&gt;Your system does not have sufficient memory to support MyEclipse. MyEclipse requires 256 MBs physical memory and 64 MBs virtual memory. Your system only has 3913160 MBs of physical memory, and 0 MBs of virtual memory.&lt;/blockquote&gt;&lt;br /&gt;I don't know why Eclipse doesn't require virtual memory while MyEclipse does. And why&amp;nbsp;3913160 MBs (I didn't say I have 4 TB memory, MyEclipse said that) of physical memory is not sufficient.&lt;br /&gt;&lt;br /&gt;Anyway, I'm pretty happy with new Ubuntu release but if part of Ubuntu users switch to Fedora 15, which will be released next month, I won't be surprised.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8341928654517557757?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8341928654517557757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/04/natty-narwhal-installed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8341928654517557757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8341928654517557757'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/04/natty-narwhal-installed.html' title='Natty Narwhal installed'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1507457512262006456</id><published>2011-04-07T05:48:00.000-07:00</published><updated>2012-01-07T03:07:43.616-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Performance Tuning</title><content type='html'>It's a common sense in the industry that performance tuning should be done after feature complete. But very likely there is only a small time frame between feature complete and code freeze, and during this short time period we need to do so many more important things. There is another common sense after product release, if it ain't broken, don't fix it. Performance issues, if any, are far from being broken.&lt;br /&gt;&lt;br /&gt;Sounds weird, but such is life. Thanks to modern programming languages, revolutionary methodologies, cutting edge hardware, we are in a time that you don't need to know how many registers are there in a CPU to development software. And more importantly, nobody actually knows what performance can be achieved for a certain system on a specific platform. I have some real life performance tuning examples and the amazing results here.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;From 5 Minutes to 90 Seconds&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When I worked in a product called Public Content Management 8 years back, there was a home-made caching system in this product. It worked beautifully after system is started but it took 5 minutes for the system to start. It became so frustrating that my manager gave me a week to figure it out if we could do something. By the end of the 4th day, the product was able to start in 1.5 minutes. After this, I began to pay more attention on what can be done to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;finish a time consuming task in (much) less time; and&lt;/li&gt;&lt;li&gt; leave more CPU cycles to customers.&lt;/li&gt;&lt;/ul&gt;And from that time, I put "Performance Tuning" as a speciality in my profile.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;From 7 Seconds to 70&lt;/b&gt;&lt;b&gt; Millisecond&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Last year I participated in a system called Marin Safety. From my development environment, the loading of Waterway Management page took 7 seconds. I knew that this was mainly because I was using a remote database instance, which was not the case in a production environment. An amplified performance issue, ignore it or not? Several hours later, I shortened the loading time to 70 ms.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;From 26 Seconds to 18 Seconds to 6 Seconds&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Last month, I did a module to update the content of a column in a database table. I started with Statement operations, realising that there might be thousands of records to update, I changed to PreparedStatement. It turned out to be 25,000 records and again remote database made it easy to spot the problem. 26 seconds in Statement and 18 seconds in PreparedStatement without batch updates. Changed to batch updates, the operation finished in 6 seconds.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;From 13 Seconds to 182 Millisecond&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Last week, I needed to parse some returning strings of WMS calls from a GeoServer. I could select format from text/html and text/plain. I should have one more choice, text/xml, according to the protocol. XML format was obviously the choice because it's self-explained and way easy to get parsed, but GeoServer doesn't even support it. HTML format is reasonably my next choice, it's at lease easier to parse than plain text. But for a sample request, it took GeoServer 13 seconds to return an HTML format result while only 182 ms to return a plain text result. I'm sure you know my answer at this point of time. Do the hard work myself and save user 10+ seconds per call.&lt;br /&gt;&lt;br /&gt;From the above examples I just want to give you an idea about performance tuning. It can be done and should be done any time, especially when the environment is not ideal. The fact is, ideal environment (usually production environment) can only cover the performance issues, it won't solve them. It's too late to start performance tuning when you start thinking upgrade your sever or losing your impatient customers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1507457512262006456?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1507457512262006456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/04/performance-tuning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1507457512262006456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1507457512262006456'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/04/performance-tuning.html' title='Performance Tuning'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-8785206337855437751</id><published>2011-03-24T02:18:00.000-07:00</published><updated>2012-01-07T03:07:58.980-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><title type='text'>How to add another data source in JPA</title><content type='html'>It's quite easy to create a data source using JPA support of Spring framework. It not so difficult to add another data source to your application as well.&lt;br /&gt;&lt;br /&gt;In META-INF/persistence.xml, define another persistence unit.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;     &amp;lt;persistence-unit name="anotherUnit" transaction-type="RESOURCE_LOCAL"&amp;gt;  &lt;br /&gt;         &amp;lt;class&amp;gt;com.youcompany.YourClass&amp;lt;/class&amp;gt;  &lt;br /&gt;         &amp;lt;exclude-unlisted-classes&amp;gt;true&amp;lt;/exclude-unlisted-classes&amp;gt;  &lt;br /&gt;         &amp;lt;properties&amp;gt;  &lt;br /&gt;             &amp;lt;property name="hibernate.hbm2ddl.auto" value="update" /&amp;gt;  &lt;br /&gt;             &amp;lt;!-- validate | update | create | create-drop --&amp;gt;  &lt;br /&gt;         &amp;lt;/properties&amp;gt;  &lt;br /&gt;     &amp;lt;/persistence-unit&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Note that you should define all the domain classes you will be using in the defined persistence unit in &amp;lt;class&amp;gt; elements.&lt;br /&gt;&lt;br /&gt;Define another database context xml file.&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;  &lt;br /&gt; &amp;lt;beans xmlns="http://www.springframework.org/schema/beans"  &lt;br /&gt;     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  &lt;br /&gt;     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"  &lt;br /&gt;     xmlns:aop="http://www.springframework.org/schema/aop"  &lt;br /&gt;     xsi:schemaLocation="http://www.springframework.org/schema/beans &lt;br /&gt;     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;     http://www.springframework.org/schema/context&lt;br /&gt;     http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;     http://www.springframework.org/schema/aop&lt;br /&gt;     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&amp;gt;  &lt;br /&gt;     &amp;lt;!-- holding properties for database connectivity / --&amp;gt;  &lt;br /&gt;     &amp;lt;context:property-placeholder location="classpath:config.properties" /&amp;gt;  &lt;br /&gt;     &amp;lt;bean id="anotherDataSource" class="org.apache.commons.dbcp.BasicDataSource"  &lt;br /&gt;         destroy-method="close"&amp;gt;  &lt;br /&gt;         &amp;lt;property name="driverClassName" value="${db.driver}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="url" value="${db.url}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="username" value="${db.user}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="password" value="${db.pass}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="validationQuery" value="${dbcp.validationQuery}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="testWhileIdle" value="${dbcp.testWhileIdle}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="numTestsPerEvictionRun" value="${dbcp.numTestsPerEvictionRun}" /&amp;gt;  &lt;br /&gt;         &amp;lt;property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" /&amp;gt;  &lt;br /&gt;     &amp;lt;/bean&amp;gt;  &lt;br /&gt;     &amp;lt;bean id="anotherJpaAdapter"  &lt;br /&gt;         class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"  &lt;br /&gt;         p:database="${db.database}" p:showSql="${db.showSql}" /&amp;gt;  &lt;br /&gt;     &amp;lt;bean id="anotherEntityManagerFactory"  &lt;br /&gt;         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  &lt;br /&gt;         p:dataSource-ref="anotherDataSource" p:jpaVendorAdapter-ref="anotherJpaAdapter"&amp;gt;  &lt;br /&gt;         &amp;lt;property name="loadTimeWeaver"&amp;gt;  &lt;br /&gt;             &amp;lt;bean  &lt;br /&gt;                 class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /&amp;gt;  &lt;br /&gt;         &amp;lt;/property&amp;gt;  &lt;br /&gt;         &amp;lt;property name="persistenceUnitName" value="anotherUnit"&amp;gt;&amp;lt;/property&amp;gt;  &lt;br /&gt;     &amp;lt;/bean&amp;gt;  &lt;br /&gt;     &amp;lt;bean id="anotherTxManager" class="org.springframework.orm.jpa.JpaTransactionManager"  &lt;br /&gt;         p:entityManagerFactory-ref="anotherEntityManagerFactory" /&amp;gt;  &lt;br /&gt; &amp;lt;/beans&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In the JPA implementation of generic DAO class, annotate the 1st persistence unit in the setter of EntityManager.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;     protected EntityManager entityManager;  &lt;br /&gt;     @PersistenceContext(unitName="firstUnit")  &lt;br /&gt;     public void setEntityManager(EntityManager entityManager) {  &lt;br /&gt;         this.entityManager = entityManager;  &lt;br /&gt;     }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Create another generic DAO class for new persistence unit. All the operations to the new domain objects should be accomplished via this new generic DAO.&lt;br /&gt;&lt;br /&gt;If you want to access data source directly, use&lt;br /&gt;&lt;pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;     @Autowired  &lt;br /&gt;     @Qualifier("anotherDataSource")  &lt;br /&gt;     private DataSource dataSource;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Don't forget to getAutoCommit and keep the status of any connection you get from data source if you need to setAutoCommit yourself, and close the connection in finally statement.&lt;br /&gt;&lt;br /&gt;That's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8785206337855437751?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8785206337855437751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/03/how-to-add-another-data-source-in-jpa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8785206337855437751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8785206337855437751'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/03/how-to-add-another-data-source-in-jpa.html' title='How to add another data source in JPA'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1868489777767001067</id><published>2011-02-27T21:55:00.000-08:00</published><updated>2011-02-27T21:55:03.205-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>new firmware for my media streamer</title><content type='html'>I have a Astone &lt;a href="http://www.astone.com.au/index.php?productID=25"&gt;AP-110D&lt;/a&gt; as media streamer in my house. I bought it 1.5 years ago and upgraded the firmware to v1.75. This is still the latest released version. Everything works fine except USB disk with EXT3 file system is mounted read-only by default. I have to login to the player, umount and mount again to make the disk writeable.&lt;br /&gt;&lt;br /&gt;Last weekend, I found that this player can use 3rd party firmwares. Hoping I can get more functions like Youtube or something. I upgraded to firmware v1.9.9 for &lt;a href="http://www.i-bt.com.tw/download_IBT-500A.html"&gt;IBT-500A / ZP-500A&lt;/a&gt; and &lt;a href="http://www.i-bt.com.tw/download_IBT-1073.html"&gt;IBT-1073&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although they are different devices but seem have same firmware. Unfortunately, no new functions found. But the USB disk is now mounted writeable by default.&lt;br /&gt;&lt;br /&gt;I'm happy with this unexpected benefit of openness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1868489777767001067?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1868489777767001067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2011/02/new-firmware-for-my-media-streamer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1868489777767001067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1868489777767001067'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2011/02/new-firmware-for-my-media-streamer.html' title='new firmware for my media streamer'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3556127796001392094</id><published>2010-12-10T05:12:00.000-08:00</published><updated>2012-01-07T03:12:49.936-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Set up a Maven Repository Manager</title><content type='html'>My basic requirements are&lt;br /&gt;&lt;ol&gt;&lt;li&gt;rich and intuitive user interface&lt;/li&gt;&lt;li&gt;ease of setting network proxy&lt;/li&gt;&lt;li&gt;ease of deploying 3rd party and internal artifacts&lt;/li&gt;&lt;/ol&gt;I got a chance to try several different products and finally installed one of them. Here are my impressions and the problems I encountered and luckily fixed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Sonatype Nexus&lt;/span&gt;&lt;br /&gt;No one can ignore it. De facto standard and from the company behind Maven. It's not my first time to use the interface, so no surprise and everything works just as expected.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;JFog Artifactory&lt;/span&gt;&lt;br /&gt;I had to say I love the design, and the auto discovery of ArtifactId, Version and Type during deploying artifacts, although some GroupId are wrongly set to be the same as ArtifactId.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Apache Archiva&lt;/span&gt;&lt;br /&gt;It has quite good UI, but needs work on usabilities. If you have several remote repositories and need to apply the same (is there anyone need to set different proxies?) network proxy, it's a joke. Also it lacks some commonly used artifacts, which the other two players have no such problem.&lt;br /&gt;&lt;br /&gt;I tried each of them for half day or so and decided to go with Artifactory.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Downloading: http://localhost:8081/artifactory/repo/org/apache/maven/plugins/maven-compiler-plugin/2.3.2/maven-compiler-plugin-2.3.2.jar&lt;br /&gt;&lt;br /&gt;[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-compiler-plugin:2.3.2: Plugin org.apache.maven.plugins:maven-compiler-plugin:2.3.2 or one of its dependencies could not be resolved: Could not find artifact org.apache.maven.plugins:maven-compiler-plugin:jar:2.3.2 in artifactory (http://localhost:8081/artifactory/repo)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;Set network proxy.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;[WARNING] While downloading poi:poi:3.1-FINAL&lt;br /&gt;&lt;br /&gt;This artifact has been relocated to org.apache.poi:poi:3.1-FINAL.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;It's not repository manager's problem and it's better to follow the new location defined in pom file.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;HTTP ERROR 409&lt;br /&gt;&lt;br /&gt;Problem accessing /artifactory/repo/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2.pom. Reason:&lt;br /&gt;&lt;br /&gt;Rejected artifact download request: Checksum policy 'GEN_IF_ABSENT' rejected the artifact 'commons-fileupload-1.2.2.pom'. Checksums info: [ChecksumInfo{type=SHA-1, original='ad3fda4adc95eb0d061341228cc94845ddb9a6fe', actual='0ce5d4a03b07c8b00ab60252e5cacdc708a4e6d8'}, ChecksumInfo{type=MD5, original='c938bb047b88d2b85b47da0be9d901ec', actual='b219248b081b6b44abf436f41e16e9e1'}]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;Go to Configure Repositories, in Edit Remote Repository, change Checksum Policy from default "Generate if absent" to "Ignore and generate".&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;HTTP ERROR 409&lt;br /&gt;&lt;br /&gt;Problem accessing /artifactory/repo/velocity/velocity/1.5/velocity-1.5.pom. Reason:&lt;br /&gt;&lt;br /&gt;The target deployment path 'velocity/velocity/1.5/velocity-1.5.pom' does not match the POM's expected path prefix 'org/apache/velocity/velocity/1.5'. Please verify your POM content for correctness and make sure the source path is a valid Maven 2 repository root path.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;This is not repository manager's problem. Change the dependency definition as suggested.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;HTTP ERROR 404&lt;br /&gt;&lt;br /&gt;Problem accessing /artifactory/repo/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.pom. Reason:&lt;br /&gt;&lt;br /&gt;Could not find resource&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;None of the default remote repositories has this artifact. Add a remote repository (in this case, http://repository.jboss.org/maven2/) and assign it to remote-repos.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Problem&lt;/u&gt;&lt;br /&gt;Error messages in Maven Console in Eclipse&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Unable to update index for snapshots|http://localhost:8081/artifactory/plugins-snapshot: Resource nexus-maven-repository-index.properties does not exist&lt;br /&gt;&lt;br /&gt;Updating index central|http://localhost:8081/artifactory/plugins-release&lt;br /&gt;&lt;br /&gt;Unable to update index for central|http://localhost:8081/artifactory/plugins-release: Resource nexus-maven-repository-index.properties does not exist&lt;br /&gt;&lt;br /&gt;Updating index snapshots|http://localhost:8081/artifactory/libs-snapshot&lt;br /&gt;&lt;br /&gt;Unable to update index for snapshots|http://localhost:8081/artifactory/libs-snapshot: Resource nexus-maven-repository-index.properties does not exist&lt;br /&gt;&lt;br /&gt;Updating index central|http://localhost:8081/artifactory/libs-release&lt;br /&gt;&lt;br /&gt;Unable to update index for central|http://localhost:8081/artifactory/libs-release: Resource nexus-maven-repository-index.properties does not exist&lt;br /&gt;&lt;br /&gt;Updating index snapshots|http://localhost:8081/artifactory/plugins-snapshot&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Solution&lt;/u&gt;&lt;br /&gt;Maven Settings Generator generated wrong URLs in settings.xml. Use following URLs instead.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;        &amp;lt;snapshots&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/snapshots&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;central&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;libs-releases&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://localhost:8081/artifactory/libs-release-local&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;        &amp;lt;snapshots /&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;snapshots&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;libs-snapshots&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://localhost:8081/artifactory/libs-snapshot-local&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;    &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;        &amp;lt;snapshots&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/snapshots&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;central&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;plugins-releases&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://localhost:8081/artifactory/plugins-release-local&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;    &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;        &amp;lt;snapshots /&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;snapshots&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;plugins-snapshots&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://localhost:8081/artifactory/plugins-snapshot-local&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3556127796001392094?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3556127796001392094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/12/set-up-maven-repository-manager.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3556127796001392094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3556127796001392094'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/12/set-up-maven-repository-manager.html' title='Set up a Maven Repository Manager'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3405303373529572243</id><published>2010-11-28T16:58:00.000-08:00</published><updated>2012-01-07T03:08:21.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>How to migrate an SVN repository</title><content type='html'>I had a chance to migrate an SVN repository of more than 10,000 revisions to another machine. Here are the process and the problems I solved.&lt;br /&gt;&lt;br /&gt;1. Install a new Subversion server&lt;br /&gt;&lt;a href="http://www.open.collab.net/products/subversion/"&gt;CollabNet Subversion Edge&lt;/a&gt; 1.3 for Windows 64-bit is chosen because it has great web user interface to manage repositories and users.&lt;br /&gt;&lt;br /&gt;2. Dump old repository&lt;br /&gt;This should be very easy by using &lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;svnadmin dump path/to/repository &amp;gt; repository.dump&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;But I got errors like&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;svnadmin: Filesystem path .../trunk/... is neither a file nor a directory&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This is because either the file system or the repository is corrupt. I had to spit the dumping at the failing revision. Any dumpings after the failing point should use --incremental option.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;svnadmin dump -r 0:N-1 path/to/repository &amp;gt; 0_N-1.dump&lt;br /&gt;svnadmin dump --incremental -r N+1:M path/to/repository &amp;gt; N+1_M.dump&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;3. Create new repository&lt;br /&gt;This can be done in 2 ways.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;svnadmin create path/to/repository&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;or&lt;br /&gt;New Repository in Repositories category in Subversion Edge's web UI (http://host:3343/csvn/repo/create).&lt;br /&gt;&lt;br /&gt;Note, however, that you have to uncheck "Create standard trunk/branches/tags structure" in Use template option. Otherwise you will get following error when loading the dumped repository.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;adding path : branches ...svnadmin: File already exists: filesystem '..\data\repositories\repository\db', transaction '123-4l', path 'branches'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4. Load dumped repository (for me, repositories)&lt;br /&gt;Remember to use --force-uuid when you load the repository, or you may suffer either the above error or difficulties in relocate you old repository to new one.&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;svnadmin load --force-uuid path/to/repository &amp;lt; repository.dump&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you have failures in dumping like me. You have to replicate what the failing revision is supposed to be doing, and check in the changes to revision N in my example.&lt;br /&gt;&lt;br /&gt;Hope it's helpful to Subversion users, but maybe migrate to Git is the way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3405303373529572243?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3405303373529572243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/11/how-to-migrate-svn-repository.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3405303373529572243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3405303373529572243'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/11/how-to-migrate-svn-repository.html' title='How to migrate an SVN repository'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3062498735648875081</id><published>2010-11-10T16:41:00.000-08:00</published><updated>2012-01-05T01:13:25.164-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>A bug in GWT Designer</title><content type='html'>Two projects in my team encountered the same problem this week. If you have more than one classes (public A and non-public B) in a Java file (A.java, of course) in GWT client side, there will be compilation errors in GWT problems marker category saying&lt;br /&gt;&lt;blockquote&gt;B can not be found in source packages. Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly.&lt;/blockquote&gt;However these errors affect nothing. You can still run as / debug as web application in development mode, or GWT compile the whole project successfully.&lt;br /&gt;&lt;br /&gt;I'm using Eclipse Helios 3.6.1 (Service Release 1) in Ubuntu with&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google Plugin for Eclipse&lt;/li&gt;&lt;li&gt;GWT Designer&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After investigation, I found it should be a bug of GWT Designer and &lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=5580"&gt;reported&lt;/a&gt; it to GWT team.&lt;br /&gt;&lt;br /&gt;If you really mind the "errors" and need to use GWT Designer, I think you know how to deal with it. In case you want to get rid of GWT Designer, go to Help - About Eclipse - Installation Details - Installed Software, and uninstall all the items with Id starting with com.instantiations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;18/11/2010 Update: It's a bug of Enhanced Compilation and got fixed in &lt;a href="http://code.google.com/webtoolkit/tools/download-gwtdesigner-beta.html"&gt;GWT Designer BETA&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3062498735648875081?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3062498735648875081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/11/bug-in-gwt-designer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3062498735648875081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3062498735648875081'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/11/bug-in-gwt-designer.html' title='A bug in GWT Designer'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-5923337643858131340</id><published>2010-10-22T04:15:00.000-07:00</published><updated>2011-12-01T03:18:27.960-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Change the cache location for Chromium</title><content type='html'>If you have plenty of memory and want to move some temporary files out of your disk, tmpfs is the answer. Especially when you are using an SSD and don't want to wear it out soon.&lt;br /&gt;&lt;br /&gt;I already &lt;a href="http://codingsince1985.blogspot.com/2010/08/tmpfs-and-postgresql.html"&gt;did so for Firefox and PostgreSQL&lt;/a&gt;, and it's time for my Chromium (or Google Chrome) for Ubuntu.&lt;br /&gt;&lt;br /&gt;Create a launcher. In the Launcher Properties, keep the Type to be Application, set the Name to "Chromium Web Brower" and Comment to "Access the Internet". Set Command to be "/usr/bin/chromium-browser --disk-cache-dir=/tmp --disk-cache-size=134217728 %U". That's it.&lt;br /&gt;&lt;br /&gt;Note that&lt;br /&gt;&lt;ul&gt;&lt;li&gt;there are no quotation marks (") for the value of disk-cache-dir&lt;/li&gt;&lt;li&gt;path in disk-cache-dir is relative to your home, if it's not an absolute path&lt;/li&gt;&lt;li&gt;the unit of disk-cache-size is byte&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-5923337643858131340?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/5923337643858131340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/change-cache-location-for-chromium.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5923337643858131340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5923337643858131340'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/change-cache-location-for-chromium.html' title='Change the cache location for Chromium'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-8622996025774981547</id><published>2010-10-17T20:33:00.000-07:00</published><updated>2011-12-01T03:18:49.102-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>When Evolution meets Microsoft Exchange</title><content type='html'>I tried to use Evolution (since it's the default email client in Ubuntu distro) to access Microsoft Exchange Server but failed. In Evolution Account Assistant, after I set Server Type to Microsoft Exchange and provide OWA URL in Receiving Email dialog box, I always got&lt;br /&gt;&lt;blockquote&gt;Could not authenticate to Server.&lt;br /&gt;Make sure the username and password are correct and try again.&lt;/blockquote&gt;Let me know if you have any idea about what's going wrong, but I decided to try something else.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;sudo apt-get install evolution-mapi&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This will also install libexchangemapi-1.0-0, which evolution-mapi depends on. Choose Exchange MAPI as Server Type and provide Server, Username and Domain name.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_iiIF044-p-4/TLvBNiWo5gI/AAAAAAAAAC8/uOm5Y--ioZs/s1600/Evolution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_iiIF044-p-4/TLvBNiWo5gI/AAAAAAAAAC8/uOm5Y--ioZs/s1600/Evolution.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/TLu_U0ilRKI/AAAAAAAAAC4/K3cYmT0n7q0/s1600/Evolution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8622996025774981547?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8622996025774981547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/when-evolution-meets-microsoft-exchange.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8622996025774981547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8622996025774981547'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/when-evolution-meets-microsoft-exchange.html' title='When Evolution meets Microsoft Exchange'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/TLvBNiWo5gI/AAAAAAAAAC8/uOm5Y--ioZs/s72-c/Evolution.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-5953998499042511401</id><published>2010-10-06T03:27:00.000-07:00</published><updated>2010-10-06T03:27:31.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sts'/><title type='text'>Major Bursary in Science Talent Search 2010</title><content type='html'>One more computer program and one more major bursary for my son, just like &lt;a href="http://codingsince1985.blogspot.com/2009/10/major-bursary-in-science-talent-search.html"&gt;a year ago&lt;/a&gt;.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-5953998499042511401?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/5953998499042511401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/major-bursary-in-science-talent-search.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5953998499042511401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5953998499042511401'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/major-bursary-in-science-talent-search.html' title='Major Bursary in Science Talent Search 2010'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-9220737835236837904</id><published>2010-10-04T19:37:00.000-07:00</published><updated>2011-12-01T03:19:05.148-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Upgraded to Ubuntu 10.10 Maverick Meerkat</title><content type='html'>update-manager --devel-release worked beautifully for me. The only issue I found is linux-image-2.6.32-25-generic is not removed by Update Manager, but it's a piece of cake for any Linux users.&lt;br /&gt;&lt;br /&gt;I love the new font and Firefox's theme. Obviously they are designed with wide screen in mind, because I found there is more vertical space remained.&lt;br /&gt;&lt;br /&gt;Well done, Canonical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-9220737835236837904?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/9220737835236837904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/upgraded-to-ubuntu-1010-maverick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9220737835236837904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9220737835236837904'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/10/upgraded-to-ubuntu-1010-maverick.html' title='Upgraded to Ubuntu 10.10 Maverick Meerkat'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1658542132978556259</id><published>2010-09-14T02:02:00.000-07:00</published><updated>2010-11-11T02:27:14.556-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>These user agents have accessed myTunes</title><content type='html'>myTunes is my personal project aggregating popular Chinese podcasts I finished in 2006. Its core functions are generating dynamic RSS feeds, such as all the video contents, all the mp3 contents, etc, and providing OPML, which iTunes supports from several years ago. The UI part, which is just an implmentation of myTunes's API (RSS and OPML), is implemented in JSF.&lt;br /&gt;&lt;br /&gt;I &lt;a href="http://codingsince1985.blogspot.com/2010/01/schema-of-itunes-podcast-feed.html"&gt;promised&lt;/a&gt; to publish all the user agents that have accessed myTunes and I think it's the right time now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_iiIF044-p-4/TI83588tTRI/AAAAAAAAACw/-L5LSO1305M/s1600/mytunes.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_iiIF044-p-4/TI83588tTRI/AAAAAAAAACw/-L5LSO1305M/s320/mytunes.gif" /&gt;&lt;/a&gt;&lt;br /&gt;Thanks Datong for this pretty logo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To the iPod mini 1st generation my sister bought me&lt;br /&gt;To &lt;a href="http://java.sun.com/developer/technicalArticles/WebServices/jscoverview/"&gt;Java Studio Creator&lt;/a&gt; I used to create the web UI&lt;br /&gt;To &lt;a href="http://www.bloglines.com/"&gt;Bloglines&lt;/a&gt; that  will officially shut down on October 1, 2010&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: url(&amp;quot;http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif&amp;quot;) repeat scroll 0% 0% rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;1:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1a2) Gecko/20060512 BonEcho/2.0a2  &lt;br /&gt;2:  msnbot/1.0 (+http://search.msn.com/msnbot.htm)  &lt;br /&gt;3:  iTunes/6.0.5 (Windows; N)  &lt;br /&gt;4:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)  &lt;br /&gt;5:  Opera/9.00 (Windows NT 5.1; U; en)  &lt;br /&gt;6:  INTERNET-DOWNLOAD  &lt;br /&gt;7:  Opera/9.00 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;8:  Maxthon  &lt;br /&gt;9:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  &lt;br /&gt;10:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.3))  &lt;br /&gt;11:  iTunes/6.0.4 (Windows; N)  &lt;br /&gt;12:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; Maxthon; (R1 1.5))  &lt;br /&gt;13:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; (R1 1.5))  &lt;br /&gt;14:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.3); eBook)  &lt;br /&gt;15:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)  &lt;br /&gt;16:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1  &lt;br /&gt;17:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060620 Firefox/1.5.0.4 Flock/0.7.1  &lt;br /&gt;18:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060709 Minefield/3.0a1  &lt;br /&gt;19:  User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.1.4322)  &lt;br /&gt;20:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1)  &lt;br /&gt;21:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)  &lt;br /&gt;22:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4  &lt;br /&gt;23:  MagpieRSS/0.7 (+http://magpierss.sf.net)  &lt;br /&gt;24:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)  &lt;br /&gt;25:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)  &lt;br /&gt;26:  J. River Internet Reader/2.0 (compatible; Windows-Media-Player/10)  &lt;br /&gt;27:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.2)  &lt;br /&gt;28:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.12) Gecko/20050919 Firefox/1.0.7  &lt;br /&gt;29:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler )  &lt;br /&gt;30:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)  &lt;br /&gt;31:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Alexa Toolbar)  &lt;br /&gt;32:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  &lt;br /&gt;33:  iTunes/6.0.2 (Windows; N)  &lt;br /&gt;34:  Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  &lt;br /&gt;35:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; {F5AD05F1-C763-DDDE-CDC9-FBC473231D46}; .NET CLR 1.1.4322)  &lt;br /&gt;36:  Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.7.13) Gecko/20060414 CentOS/1.0.8-1.4.1.centos4 Firefox/1.0.8  &lt;br /&gt;37:  Mozilla/5.0 (compatible) GM RSS Panel  &lt;br /&gt;38:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GOSURF - BETA; GOSURF; .NET CLR 1.1.4322)  &lt;br /&gt;39:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2)  &lt;br /&gt;40:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; POTU(RR:26060619:0); .NET CLR 2.0.50727; InfoPath.2)  &lt;br /&gt;41:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)  &lt;br /&gt;42:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Alexa Toolbar; mxie; SV1; POTU(RR:26060619:0); roguecleaner; .NET CLR 1.1.4322)  &lt;br /&gt;43:  iTunes/6.0.5 (Macintosh; N; PPC)  &lt;br /&gt;44:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; KKman3.0; .NET CLR 1.1.4322)  &lt;br /&gt;45:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705)  &lt;br /&gt;46:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)  &lt;br /&gt;47:  iTunes/6.0.1 (Windows; N)  &lt;br /&gt;48:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FunWebProducts)  &lt;br /&gt;49:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)  &lt;br /&gt;50:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)  &lt;br /&gt;51:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2  &lt;br /&gt;52:  AppleSyndication/51  &lt;br /&gt;53:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)  &lt;br /&gt;54:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; .NET CLR 1.1.4322)  &lt;br /&gt;55:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Alexa Toolbar)  &lt;br /&gt;56:  Zhuaxia.com 1 Subscribers  &lt;br /&gt;57:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; TencentTraveler )  &lt;br /&gt;58:  Zhuaxia.com 2 Subscribers  &lt;br /&gt;59:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2  &lt;br /&gt;60:  FeedValidator/1.3  &lt;br /&gt;61:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;62:  AppleSyndication/54  &lt;br /&gt;63:  foobar2000 v0.9.2  &lt;br /&gt;64:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)  &lt;br /&gt;65:  Feedreader 3.05 (Powered by Newsbrain)  &lt;br /&gt;66:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727)  &lt;br /&gt;67:  Mozilla/4.0 (compatible; Google Desktop)  &lt;br /&gt;68:  Java/1.5.0_07  &lt;br /&gt;69:  myTunes/1.0  &lt;br /&gt;70:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar)  &lt;br /&gt;71:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5  &lt;br /&gt;72:  Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4  &lt;br /&gt;73:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)  &lt;br /&gt;74:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler ; (R1 1.5))  &lt;br /&gt;75:  iPodder/2.2beta1 (Windows) +http://ipodder.sf.net/  &lt;br /&gt;76:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322)  &lt;br /&gt;77:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5  &lt;br /&gt;78:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060727 Ubuntu/dapper-security Firefox/1.5.0.5  &lt;br /&gt;79:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5  &lt;br /&gt;80:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; POTU(1.13); .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;81:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)  &lt;br /&gt;82:  Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0)  &lt;br /&gt;83:  Mozilla/5.0 (compatible;heritrix-1.8.0 +http://www.business.com)  &lt;br /&gt;84:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6  &lt;br /&gt;85:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler )  &lt;br /&gt;86:  Opera/9.00 (X11; Linux i686; U; en)  &lt;br /&gt;87:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; InfoPath.1)  &lt;br /&gt;88:  iTunes/6.0 (Windows; N)  &lt;br /&gt;89:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  &lt;br /&gt;90:  potu 0.7 (+http://www.potu.com/)  &lt;br /&gt;91:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; POTU(1.13); .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;92:  Gigabot/2.0; http://www.gigablast.com/spider.html  &lt;br /&gt;93:  ia_archiver  &lt;br /&gt;94:  Mozilla/5.0 (PC; U; Intel; Windows; en) AppleWebKit/420+ (KHTML, like Gecko)  &lt;br /&gt;95:  Live.Com Feed Manager  &lt;br /&gt;96:  Opera/9.01 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;97:  iTunes/6.0.3 (Windows; N)  &lt;br /&gt;98:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; POTU(RR:26060619:0); TencentTraveler ; InfoPath.1)  &lt;br /&gt;99:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;100:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;101:  Mozilla/5.0 (compatible; Google Desktop)  &lt;br /&gt;102:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5  &lt;br /&gt;103:  Protopage/3.0 (http://www.protopage.com)  &lt;br /&gt;104:  Pageflakes/1.0 (WinNT 5.1.2600.0; http://www.pageflakes.com; 1 subscribers )  &lt;br /&gt;105:  Netvibes (http://www.netvibes.com/; 1 subscriber)  &lt;br /&gt;106:  Netvibes (http://www.netvibes.com/; 1 subscribers)  &lt;br /&gt;107:  Netvibes (http://www.netvibes.com/; 2 subscribers)  &lt;br /&gt;108:  lanshanbot/1.0  &lt;br /&gt;109:  Mozilla/6.0 (MSIE 6.0; Windows NT 5.1;Foxmail/MILOWU)  &lt;br /&gt;110:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3  &lt;br /&gt;111:  AppleSyndication/52  &lt;br /&gt;112:  iTunes/6.0.5 (Macintosh; N; Intel)  &lt;br /&gt;113:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;114:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Avant Browser; Avant Browser)  &lt;br /&gt;115:  Mozilla/4.0 (compatible;)  &lt;br /&gt;116:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;117:  gnome-vfs/2.14.2 neon/0.25.4  &lt;br /&gt;118:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6  &lt;br /&gt;119:  msnbot-media/1.0 (+http://search.msn.com/msnbot.htm)  &lt;br /&gt;120:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; .NET CLR 1.1.4322)  &lt;br /&gt;121:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;122:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;123:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; TencentTraveler ; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  &lt;br /&gt;124:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;125:  Ensemble/1.0 (http://pyxis-project.net/)  &lt;br /&gt;126:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)  &lt;br /&gt;127:  Exabot/3.0  &lt;br /&gt;128:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)  &lt;br /&gt;129:  Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)  &lt;br /&gt;130:  iTunes/7.0 (Macintosh; N; Intel)  &lt;br /&gt;131:  iTunes/7.0 (Macintosh; N; PPC)  &lt;br /&gt;132:  msnbot/0.9 (+http://search.msn.com/msnbot.htm)  &lt;br /&gt;133:  iTunes/7.0 (Windows; N)  &lt;br /&gt;134:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;135:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060802 Firefox/1.5.0.5 Flock/0.7.4.1  &lt;br /&gt;136:  Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)  &lt;br /&gt;137:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)  &lt;br /&gt;138:  MSN Feed Manager  &lt;br /&gt;139:  Live (http://www.live.com/)  &lt;br /&gt;140:  Zhuaxia.com 3 Subscribers  &lt;br /&gt;141:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar)  &lt;br /&gt;142:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2  &lt;br /&gt;143:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  &lt;br /&gt;144:  Grazr/Beta1vX0.2  &lt;br /&gt;145:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; 5460)  &lt;br /&gt;146:  Mozilla/4.0 (compatible; Nokia Podcasting; SymbianOS)  &lt;br /&gt;147:  http://Anonymouse.org/ (Unix)  &lt;br /&gt;148:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2  &lt;br /&gt;149:  Grazr/v1.0  &lt;br /&gt;150:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  &lt;br /&gt;151:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 1.1.4322)  &lt;br /&gt;152:  Mozilla/5.0 (000000000; 0; 00000 000 00 0; 00000) 00000000000000000 0000000 0000 000000 000000000000  &lt;br /&gt;153:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  &lt;br /&gt;154:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7  &lt;br /&gt;155:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;156:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1  &lt;br /&gt;157:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  &lt;br /&gt;158:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Tablet PC 1.7; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  &lt;br /&gt;159:  FeedBurner/1.0 (http://www.FeedBurner.com)  &lt;br /&gt;160:  iTunes/7.0 (000000000; 0; 00000)  &lt;br /&gt;161:  Opera/9.02 (Windows NT 5.0; U; zh-cn)  &lt;br /&gt;162:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; SV1)  &lt;br /&gt;163:  Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)  &lt;br /&gt;164:  Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)  &lt;br /&gt;165:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; TencentTraveler ; .NET CLR 1.1.4322)  &lt;br /&gt;166:  iTunes/7.0.1 (Macintosh; N; Intel)  &lt;br /&gt;167:  Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)  &lt;br /&gt;168:  iTunes/7.0.1 (Windows; N)  &lt;br /&gt;169:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; Maxthon 2.0)  &lt;br /&gt;170:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050920 Firefox/1.0.7  &lt;br /&gt;171:  Opera/9.02 (Macintosh; PPC Mac OS X; U; zh-cn)  &lt;br /&gt;172:  Bloglines/3.1 (http://www.bloglines.com; 1 subscriber)  &lt;br /&gt;173:  iTunes/7.0.1 (Macintosh; N; PPC)  &lt;br /&gt;174:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 1.1.4322)  &lt;br /&gt;175:  iTunes/7.0.1 (000000000; 0; 00000)  &lt;br /&gt;176:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Alexa Toolbar; mxie; .NET CLR 1.1.4322)  &lt;br /&gt;177:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)  &lt;br /&gt;178:  Windows-RSS-Platform/1.0 (MSIE 7.0; Windows NT 5.1)  &lt;br /&gt;179:  NutchCVS/0.7.2 (Nutch; http://lucene.apache.org/nutch/bot.html; nutch-agent@lucene.apache.org)  &lt;br /&gt;180:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;181:  OutfoxBot/0.5 (for internet experiments; http://; outfoxbot@gmail.com)  &lt;br /&gt;182:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-cn) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;183:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)  &lt;br /&gt;184:  FeedValidator/1.21 +http://feeds.archive.org/validator/  &lt;br /&gt;185:  Frontier/9.0.1 (WinNT)  &lt;br /&gt;186:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;187:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;188:  Mozilla/4.76 [en] (PalmOS; U; WebPro/3.0.1a; palm-MT64)  &lt;br /&gt;189:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1) Gecko/20060918 Firefox/2.0  &lt;br /&gt;190:  Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)  &lt;br /&gt;191:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; GOSURF; RogueCleaner; .NET CLR 1.1.4322; Creative ZENcast v1.02.12)  &lt;br /&gt;192:  Creative ZENcast v1.02.12  &lt;br /&gt;193:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; GOSURF; .NET CLR 1.1.4322; InfoPath.1; Creative ZENcast v1.02.12)  &lt;br /&gt;194:  Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7  &lt;br /&gt;195:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; .NET CLR 2.0.50727)  &lt;br /&gt;196:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2  &lt;br /&gt;197:  Zhuaxia.com 0 Subscribers  &lt;br /&gt;198:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; InfoPath.1; .NET CLR 1.1.4322)  &lt;br /&gt;199:  gnome-vfs/2.16.1 neon/0.25.4  &lt;br /&gt;200:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0  &lt;br /&gt;201:  ZTE-Me/Mobile  &lt;br /&gt;202:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0  &lt;br /&gt;203:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)  &lt;br /&gt;204:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; Maxthon)  &lt;br /&gt;205:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; zh-tw) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;206:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 (FoxPlus) Firefox/1.5.0.7  &lt;br /&gt;207:  Mozilla/4.0  &lt;br /&gt;208:  Shim-Crawler(Mozilla-compatible; http://www.logos.ic.i.u-tokyo.ac.jp/crawler/; crawl@logos.ic.i.u-tokyo.ac.jp)  &lt;br /&gt;209:  iTunes/7.0.2 (Macintosh; N; PPC)  &lt;br /&gt;210:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; Alexa Toolbar; .NET CLR 1.0.3705)  &lt;br /&gt;211:  iTunes/7.0.2 (Macintosh; N; Intel)  &lt;br /&gt;212:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; MyIE2; .NET CLR 1.1.4322; .NET CLR 1.0.3705)  &lt;br /&gt;213:  iTunes/7.0.2 (Windows; N)  &lt;br /&gt;214:  Grazr/v1.1  &lt;br /&gt;215:  iTunes/7.0.2 (000000000; 0; 00000)  &lt;br /&gt;216:  XML-FeedPP/0.16 XML-TreePP/0.18 libwww-perl/5.803  &lt;br /&gt;217:  Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://about.ask.com/en/docs/about/webmasters.shtml)  &lt;br /&gt;218:  Juice/2.2 (Windows) +http://juicereceiver.sf.net/  &lt;br /&gt;219:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)  &lt;br /&gt;220:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; zh-CN; rv:1.8.1) Gecko/20061010 Firefox/2.0  &lt;br /&gt;221:  iTunes/6.0.4 (Macintosh; N; Intel)  &lt;br /&gt;222:  Opera/9.02 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;223:  Ziepod+ 0.99.1 (www.ziepod.com;MediaAggregator&amp;amp;Player; Windows NT 5.1)  &lt;br /&gt;224:  Opera/9.01 (Windows NT 5.1; U; en)  &lt;br /&gt;225:  &amp;lt;a href='http://www.netforex.org'&amp;gt; Forex Trading Network Organization &amp;lt;/a&amp;gt; info@netforex.org  &lt;br /&gt;226:  iTunes/5.0.1 (Windows; N)  &lt;br /&gt;227:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; Maxthon)  &lt;br /&gt;228:  Mozilla/4.0 (Mozilla; http://www.mozilla.org/docs/en/bot.html; master@mozilla.com)  &lt;br /&gt;229:  Ziepod 0.99.1 (www.ziepod.com;PodcastReceiver&amp;amp;Player; Windows NT 5.1)  &lt;br /&gt;230:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; (R1 1.5); .NET CLR 1.1.4322)  &lt;br /&gt;231:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060719 (FoxPlus) Firefox/1.5.0.5  &lt;br /&gt;232:  ichiro/2.0 (http://help.goo.ne.jp/door/crawler.html)  &lt;br /&gt;233:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  &lt;br /&gt;234:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.03)  &lt;br /&gt;235:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; MSOffice 12)  &lt;br /&gt;236:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0  &lt;br /&gt;237:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Poco 0.31; .NET CLR 1.1.4322)  &lt;br /&gt;238:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;239:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Creative ZENcast v1.02.12)  &lt;br /&gt;240:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)  &lt;br /&gt;241:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  &lt;br /&gt;242:  Quick News by Stand Alone, Inc.  &lt;br /&gt;243:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)  &lt;br /&gt;244:  iPodder-linux/2.1.9 +http://ipodder.sf.net/  &lt;br /&gt;245:  Python-urllib/1.16  &lt;br /&gt;246:  NokiaE61-1/3.0 (2.0618.06.05) SymbianOS/9.1 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1  &lt;br /&gt;247:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; MSOffice 12)  &lt;br /&gt;248:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)  &lt;br /&gt;249:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  &lt;br /&gt;250:  RSSMicro.com RSS/Atom Feed Robot  &lt;br /&gt;251:  Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1)  &lt;br /&gt;252:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;253:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mister X)  &lt;br /&gt;254:  iTunes/6.0.2 (Macintosh; N; Intel)  &lt;br /&gt;255:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon; .NET CLR 1.1.4322)  &lt;br /&gt;256:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0  &lt;br /&gt;257:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1)  &lt;br /&gt;258:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; InfoPath.1)  &lt;br /&gt;259:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;260:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.1)  &lt;br /&gt;261:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1) Gecko/20061010 Firefox/2.0  &lt;br /&gt;262:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  &lt;br /&gt;263:  sogou spider  &lt;br /&gt;264:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8  &lt;br /&gt;265:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  &lt;br /&gt;266:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20061204 GranParadiso/3.0a1  &lt;br /&gt;267:  iSiloX/4.32 Windows/32  &lt;br /&gt;268:  iTunes/6.0.1 (Macintosh; N; PPC)  &lt;br /&gt;269:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; HbTools 4.7.7)  &lt;br /&gt;270:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9  &lt;br /&gt;271:  Mozilla/4.0 (compatible; MSIE 6.0; ; Linux i686) Opera 7.50 [en]  &lt;br /&gt;272:  Opera/9.10 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;273:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  &lt;br /&gt;274:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  &lt;br /&gt;275:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)  &lt;br /&gt;276:  Mozilla/5.0 (000000000; 0; 00000 000 00 0; 00000; 0000000000) 00000000000000 000000000000000  &lt;br /&gt;277:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en)  &lt;br /&gt;278:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy)  &lt;br /&gt;279:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)  &lt;br /&gt;280:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Hotbar 4.5.1.0; .NET CLR 1.1.4322)  &lt;br /&gt;281:  Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; Nokia E61/0633.09.04; 9730) Opera 8.65 [zh-CN]  &lt;br /&gt;282:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9  &lt;br /&gt;283:  Mozilla/4.0 (PSP (PlayStation Portable); 2.00)  &lt;br /&gt;284:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; InfoPath.1)  &lt;br /&gt;285:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  &lt;br /&gt;286:  Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1  &lt;br /&gt;287:  XML-FeedPP/0.19 XML-TreePP/0.19 libwww-perl/5.76  &lt;br /&gt;288:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; InfoPath.1; .NET CLR 1.1.4322)  &lt;br /&gt;289:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar; .NET CLR 2.0.50727; InfoPath.1)  &lt;br /&gt;290:  Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)  &lt;br /&gt;291:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041215 Firefox/1.0 Red Hat/1.0-12.EL4  &lt;br /&gt;292:  Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)  &lt;br /&gt;293:  Avbrno cuoreyagh tcjrig  &lt;br /&gt;294:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322)  &lt;br /&gt;295:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts)  &lt;br /&gt;296:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  &lt;br /&gt;297:  curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l zlib/1.2.3  &lt;br /&gt;298:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy)  &lt;br /&gt;299:  Grazr/v1.2  &lt;br /&gt;300:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322)  &lt;br /&gt;301:  iTunes/7.1 (Macintosh; N; Intel)  &lt;br /&gt;302:  iTunes/7.1 (000000000; 0; 00000)  &lt;br /&gt;303:  iTunes/7.1 (Macintosh; N; PPC)  &lt;br /&gt;304:  iTunes/7.1 (Windows; N)  &lt;br /&gt;305:  Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  &lt;br /&gt;306:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-cn) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;307:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  &lt;br /&gt;308:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QihooBot 1.0 qihoobot@qihoo.net)  &lt;br /&gt;309:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; TencentTraveler ; .NET CLR 2.0.50727)  &lt;br /&gt;310:  Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2  &lt;br /&gt;311:  Resco News  &lt;br /&gt;312:  Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.3 (like Gecko)  &lt;br /&gt;313:  Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.13) Gecko/20050610 K-Meleon/0.9  &lt;br /&gt;314:  Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)  &lt;br /&gt;315:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler ; .NET CLR 1.1.4322)  &lt;br /&gt;316:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=3254972797126430783)  &lt;br /&gt;317:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=10516567267389403425)  &lt;br /&gt;318:  iTunes/7.1.1 (Macintosh; N; PPC)  &lt;br /&gt;319:  iTunes/7.1.1 (Windows; N)  &lt;br /&gt;320:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; KuGooSoft)  &lt;br /&gt;321:  iTunes/7.1.1 (Macintosh; N; Intel)  &lt;br /&gt;322:  NextGenSearchBot 1 (for information visit http://about.zoominfo.com/About/NextGenSearchBot.aspx)  &lt;br /&gt;323:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  &lt;br /&gt;324:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;325:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322; .NET CLR 2.0.50727)  &lt;br /&gt;326:  Creative ZENcast v1.04.06  &lt;br /&gt;327:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  &lt;br /&gt;328:  iTunes/7.1.1 (000000000; 0; 00000)  &lt;br /&gt;329:  ShopWiki/1.0 ( +http://www.shopwiki.com/wiki/Help:Bot)  &lt;br /&gt;330:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  &lt;br /&gt;331:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)  &lt;br /&gt;332:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  &lt;br /&gt;333:  Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)  &lt;br /&gt;334:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  &lt;br /&gt;335:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; NetCaptor 7.5.4)  &lt;br /&gt;336:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322)  &lt;br /&gt;337:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20060601 Firefox/2.0.0.3 (Ubuntu-edgy)  &lt;br /&gt;338:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavFourF; Embedded Web Browser from: http://bsalsa.com/; .NET CLR 1.1.4322)  &lt;br /&gt;339:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 9.02  &lt;br /&gt;340:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; KuGooSoft)  &lt;br /&gt;341:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1; Maxthon 2.0)  &lt;br /&gt;342:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  &lt;br /&gt;343:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=18276495934853990384)  &lt;br /&gt;344:  Opera/9.20 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;345:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0  &lt;br /&gt;346:  Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0  &lt;br /&gt;347:  Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  &lt;br /&gt;348:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 2.0.50727)  &lt;br /&gt;349:  Grazr/v2.0  &lt;br /&gt;350:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11  &lt;br /&gt;351:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)  &lt;br /&gt;352:  gnome-vfs/2.18.1 neon/0.25.4  &lt;br /&gt;353:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; POTU(RR:27011715:0); Maxthon; .NET CLR 2.0.50727)  &lt;br /&gt;354:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; MSOffice 12)  &lt;br /&gt;355:  Ziepod 0.99.9b2 (www.ziepod.com;PodcastReceiver&amp;amp;Player; Windows NT 5.1)  &lt;br /&gt;356:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; Maxthon 2.0)  &lt;br /&gt;357:  iTunes/4.9 (Windows; N)  &lt;br /&gt;358:  Sogou Push Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)  &lt;br /&gt;359:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=15254394928724077235)  &lt;br /&gt;360:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=8177589595128505927)  &lt;br /&gt;361:  Mozilla/4.0 (compatible; MSIE 6.0)  &lt;br /&gt;362:  Mozilla/5.0 (Windows; U; Win98; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3  &lt;br /&gt;363:  iTunes/7.3.1 (Macintosh; N; PPC)  &lt;br /&gt;364:  iTunes/7.3 (Windows; N)  &lt;br /&gt;365:  iTunes/7.3.1 (Windows; N)  &lt;br /&gt;366:  iTunes/7.3.1 (Macintosh; N; Intel)  &lt;br /&gt;367:  iTunes/7.2 (Windows; N)  &lt;br /&gt;368:  iTunes/7.3 (Macintosh; N; Intel)  &lt;br /&gt;369:  iTunes/7.3.1 (000000000; 0; 00000)  &lt;br /&gt;370:  Creative ZENcast v2.00.07  &lt;br /&gt;371:  Opera/9.22 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;372:  Mozilla/4.0 (compatible; NaverBot/1.0; http://help.naver.com/delete_main.asp)  &lt;br /&gt;373:  Gigabot/3.0 (http://www.gigablast.com/spider.html)  &lt;br /&gt;374:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5  &lt;br /&gt;375:  Opera/9.22 (Macintosh; Intel Mac OS X; U; en)  &lt;br /&gt;376:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419.2.1 (KHTML, like Gecko) Safari/419.3  &lt;br /&gt;377:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  &lt;br /&gt;378:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty)  &lt;br /&gt;379:  Liferea/1.0.52-2 (Linux; en_US; http://liferea.sf.net/)  &lt;br /&gt;380:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Embedded Web Browser from: http://bsalsa.com/; TheWorld)  &lt;br /&gt;381:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  &lt;br /&gt;382:  iTunes/7.3.2 (Macintosh; N; Intel)  &lt;br /&gt;383:  iTunes/7.3.2 (Macintosh; N; PPC)  &lt;br /&gt;384:  iTunes/7.3.2 (Windows; N)  &lt;br /&gt;385:  iTunes/7.3.2 (000000000; 0; 00000)  &lt;br /&gt;386:  iTunes/7.2 (Macintosh; N; Intel)  &lt;br /&gt;387:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)  &lt;br /&gt;388:  Mozilla/4.0 (compatible; MSIE 6.0; ; Linux armv5tejl; U) Opera 8.02 [en_US] Maemo browser 0.4.34 N770/SU-18  &lt;br /&gt;389:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; MAXTHON 2.0)  &lt;br /&gt;390:  Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)  &lt;br /&gt;391:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MSN 6.1; MSNbMSFT; MSNmsc-cn; MSNc0z; v5m)  &lt;br /&gt;392:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; (R1 1.5))  &lt;br /&gt;393:  Opera/9.23 (Windows NT 5.1; U; zh-cn)  &lt;br /&gt;394:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TheWorld)  &lt;br /&gt;395:  Egress  &lt;br /&gt;396:  Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 2 subscribers; feed-id=15254394928724077235)  &lt;br /&gt;397:  iTunes/7.4 (Windows; N)  &lt;br /&gt;398:  iTunes/7.4 (Macintosh; N; Intel)  &lt;br /&gt;399:  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1  &lt;br /&gt;400:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)  &lt;br /&gt;401:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Mozilla/4.0(Compatible Mozilla/4.0(Compatible-EmbeddedWB 14.59 http://bsalsa.com/ EmbeddedWB- 14.59 from: http://bsalsa.com/ ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)  &lt;br /&gt;402:  iTunes/7.4 (Macintosh; N; PPC)  &lt;br /&gt;403:  Sogou web spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)  &lt;br /&gt;404:  iTunes/7.4.1 (Macintosh; N; PPC)  &lt;br /&gt;405:  iTunes/7.4.1 (Macintosh; N; Intel)  &lt;br /&gt;406:  iTunes/7.4.1 (Windows; N)  &lt;br /&gt;407:  iTunes/7.4 (000000000; 0; 00000)  &lt;br /&gt;408:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)  &lt;br /&gt;409:  Mozilla/5.0 (compatible; Exabot Test/3.0; +http://www.exabot.com/go/robot)  &lt;br /&gt;410:  MagpieRSS/0.72 (+http://magpierss.sf.net)  &lt;br /&gt;411:  iTunes/7.4.2 (Windows; N)  &lt;br /&gt;412:  iTunes/7.4.2 (Macintosh; N; Intel)  &lt;br /&gt;413:  Opera/9.23 (Macintosh; Intel Mac OS X; U; zh-cn)  &lt;br /&gt;414:  iTunes/7.4.1 (000000000; 0; 00000)  &lt;br /&gt;415:  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7  &lt;br /&gt;416:  iTunes/7.4.2 (Macintosh; N; PPC)  &lt;br /&gt;417:  iTunes/7.4.2 (000000000; 0; 00000)  &lt;br /&gt;418:  Zhuaxia.com 4 Subscribers  &lt;br /&gt;419:  Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20070531 Firefox/1.5.0.12 Flock/0.7.14  &lt;br /&gt;420:  iTunes/7.3.1 (Windows; N), DynaWeb http://www.dit-inc.us/disclaimer.php  &lt;br /&gt;421:  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MAXTHON 2.0)  &lt;br /&gt;422:  iTunes/7.4.3 (Windows; N)  &lt;br /&gt;423:  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.7.12) Gecko/20050921 Red Hat/1.0.7-1.4.1 Firefox/1.0.7  &lt;br /&gt;424:  Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-CN; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6  &lt;br /&gt;425:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.6 Flock/0.9.1.0  &lt;br /&gt;426:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; InfoPath.2)  &lt;br /&gt;427:  Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8  &lt;br /&gt;428:  Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322)  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1658542132978556259?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1658542132978556259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/09/these-user-agents-have-accessed-mytunes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1658542132978556259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1658542132978556259'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/09/these-user-agents-have-accessed-mytunes.html' title='These user agents have accessed myTunes'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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://2.bp.blogspot.com/_iiIF044-p-4/TI83588tTRI/AAAAAAAAACw/-L5LSO1305M/s72-c/mytunes.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-1647332378128887386</id><published>2010-09-01T02:55:00.000-07:00</published><updated>2010-09-01T02:55:27.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>MyEclipse 8.x</title><content type='html'>It's so painful to install plug-ins in MyEclipse 8.x. It tries to block you from directly access update URLs with a so-called Software Centre. Things become even worse if you're behind a proxy. What's funnier are&amp;nbsp;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=281472"&gt;You can't update Eclipse 3.5 behind the proxy&lt;/a&gt;&amp;nbsp;and MyEclipse still refuses to base itself on Eclipse 3.6.&lt;br /&gt;&lt;br /&gt;Anyway, I just want to share a tip in plug-in installing in MyEclipse 8.5. See the screenshot. Note the "Connect directly to host" option.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_iiIF044-p-4/TH4igdfXvMI/AAAAAAAAACo/Sxm-i8eSqBg/s1600/plug-in.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_iiIF044-p-4/TH4igdfXvMI/AAAAAAAAACo/Sxm-i8eSqBg/s400/plug-in.png" width="286" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1647332378128887386?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1647332378128887386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/09/myeclipse-8x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1647332378128887386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1647332378128887386'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/09/myeclipse-8x.html' title='MyEclipse 8.x'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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://1.bp.blogspot.com/_iiIF044-p-4/TH4igdfXvMI/AAAAAAAAACo/Sxm-i8eSqBg/s72-c/plug-in.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-9059709739975569343</id><published>2010-08-25T06:00:00.000-07:00</published><updated>2011-12-01T03:19:20.771-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>tmpfs and PostgreSQL</title><content type='html'>I've been dreaming to have an SSD for quite a long time. In order to reduce disk operations when I actually have an SSD, I&amp;nbsp;practiced&amp;nbsp;to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;point browser.cache.disk.parent_directory of Firefox to /dev/shm&lt;/li&gt;&lt;li&gt;remove swap partition&lt;/li&gt;&lt;li&gt;move several temporary folders to tmpfs.&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;tmpfs /var/log/apt tmpfs noatime,defaults 0 0&lt;br /&gt;tmpfs /var/log tmpfs noatime,defaults 0 0&lt;br /&gt;tmpfs /tmp tmpfs noatime,defaults 0 0&lt;br /&gt;tmpfs /var/tmp tmpfs noatime,defaults 0 0&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;It works beautifully until I installed PostgreSQL for a project on my laptop, because it needs one more folder for logs. Here is the workaround.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;sudo mkdir /var/log/postgresql&lt;br /&gt;sudo service postgresql-8.4 start&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enjoy taking the advantage of my 4GB memory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-9059709739975569343?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/9059709739975569343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/08/tmpfs-and-postgresql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9059709739975569343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9059709739975569343'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/08/tmpfs-and-postgresql.html' title='tmpfs and PostgreSQL'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-2374492811051853017</id><published>2010-08-11T02:58:00.000-07:00</published><updated>2012-01-07T03:08:56.044-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Good practice in using java.util.concurrent</title><content type='html'>Concurrent package was introduced from Java 5 and still doesn't get reasonable acceptance. Traditional thread programming is just too strong for us to unlearn it. Several years ago, I created a task framework to solve commonly used scenario, a modified version (most changes are generic related) is used in a product I participated in 2008.&lt;br /&gt;&lt;br /&gt;In my current project, I have a requirement of setting timeout for serials of web service operations, which is very suitable for concurrent package. I learned a good lesson from this simple task. I reckon I need to revise my framework one day.&lt;br /&gt;&lt;br /&gt;The 1st lesson I learned is it's harder and not safe to set thread name to a Callable thread. One workaround is calling Thread.currentThread().setName() at the beginning of call(). But thread is owned by Callable but by ExecutorService, so this might have some side-effects. Use it at your own risk.&lt;br /&gt;&lt;br /&gt;The 2nd one is the overhead of creating and removing threads is much heavier than I imaged before. In debug mode you can see the process of creation and removal of threads, especially when you submit the thread in loops. Try your best to minimize the operations in call() and call call() only in really necessary cases.&lt;br /&gt;&lt;br /&gt;Third tip is by using Future.get(1L, TimeUnit.MILLISECONDS) and ignoring TimeoutException you can get an asynchronized thread.&lt;br /&gt;&lt;br /&gt;Last but not least is cancel future and shutdown service. If you fail to do this, the callable will be in running status forever and eventually you'll have no memory to create any new thread. Although I don't see any difference between Future.cancel(true) and Future.cancel(false), ExecutorService.shutdown() and ExecutorService.shutdownNow() in my case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-2374492811051853017?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/2374492811051853017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/08/good-practice-in-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2374492811051853017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2374492811051853017'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/08/good-practice-in-using.html' title='Good practice in using java.util.concurrent'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-3262246441801497216</id><published>2010-07-31T04:32:00.000-07:00</published><updated>2010-07-31T04:33:20.672-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>One more bug submitted</title><content type='html'>&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=321429" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="https://bugs.eclipse.org/bugs/attachment.cgi?id=175645" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3262246441801497216?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3262246441801497216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/07/one-more-bug-submitted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3262246441801497216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3262246441801497216'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/07/one-more-bug-submitted.html' title='One more bug submitted'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-2724289715147485645</id><published>2010-07-29T23:01:00.000-07:00</published><updated>2012-01-07T03:09:09.697-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>createRecordComponent is not called for the first record created</title><content type='html'>I'm using Smart GWT 2.2 and facing a strange bug. The com.smartgwt.client.widgets.grid.ListGrid#createRecordComponent(ListGridRecord record, Integer colNum) is not called for the very first record. Thanks to smartgwt's popularity, I found some complaints and workarounds.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://code.google.com/p/smartgwt/issues/detail?id=450"&gt;Issue 450 - smartgwt - createRecordComponent(final ListGridRecord record, Integer colNum) {} never executed&lt;/a&gt;, someone suggested create a function that does all the job createRecordComponent is supposed to do and call this function explicitly. If this works, the event model needs also to be hacked, because nothing wrong in createRecordComponent. Hope he/she will contribute the solution to the product.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://forums.smartclient.com/showthread.php?t=11700"&gt;createRecordComponent not called for changed record when refreshing ListGrid&lt;/a&gt;, another one suggested showRecordComponent must be implemented as well, if not all the columns' component are created in  create/updateRecordComponent. Sounds simple but no matter showRecordComponent returns true or false, createRecordComponent still fails to be called.&lt;br /&gt;&lt;br /&gt;What helped me is &lt;a href="http://forums.smartclient.com/showthread.php?t=11399"&gt;ListGrid.createRecordComponent not called unless a column is sorted&lt;/a&gt;. I don't call setSortField because I have no field to sort. I call ListGrid#sort after a new record is added and problem solved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-2724289715147485645?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/2724289715147485645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/07/createrecordcomponent-is-not-called-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2724289715147485645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2724289715147485645'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/07/createrecordcomponent-is-not-called-for.html' title='createRecordComponent is not called for the first record created'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-801879363202296356</id><published>2010-06-21T22:47:00.000-07:00</published><updated>2011-12-01T03:19:37.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>soapUI 3.5.1 on Ubuntu 10.04</title><content type='html'>Update: soapUI 3.6.1 on Ubuntu 10.10 doesn't have the following problem.&lt;br /&gt;&lt;br /&gt;I got following error in my console when I tried to run soapUI on Ubuntu. It was started, after a blank splash screen, but cannot create a project.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Exception in thread "XpcMessageLoop" java.lang.NoSuchMethodError: com.jniwrapper.gtk.GTK.initialize([Ljava/lang/String;)V&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.teamdev.xpcom.impl.awt.linux.AwtLinuxPlatform.a(SourceFile:166)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.teamdev.xpcom.impl.E.initialize(SourceFile:69)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.teamdev.xpcom.c.run(SourceFile:150)&lt;/blockquote&gt;&lt;br /&gt;The solution is to uncomment the following line in soapui.sh&lt;br /&gt;&lt;blockquote&gt;# JAVA_OPTS="$JAVA_OPTS -Dsoapui.jxbrowser.disable=true"&lt;/blockquote&gt;&lt;br /&gt;To set authentication information for a web service, use this dialog box.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/TCBODe87trI/AAAAAAAAACY/jKOk9ApDU7s/s1600/soapUI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/_iiIF044-p-4/TCBODe87trI/AAAAAAAAACY/jKOk9ApDU7s/s400/soapUI.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-801879363202296356?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/801879363202296356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/06/soapui-351-on-ubuntu-1004.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/801879363202296356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/801879363202296356'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/06/soapui-351-on-ubuntu-1004.html' title='soapUI 3.5.1 on Ubuntu 10.04'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/TCBODe87trI/AAAAAAAAACY/jKOk9ApDU7s/s72-c/soapUI.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-5256932726000200181</id><published>2010-05-22T02:16:00.000-07:00</published><updated>2010-05-22T02:16:52.034-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>How to connect an InputStream to an OutputStream</title><content type='html'>In the &lt;a href="http://codingsince1985.blogspot.com/2010/04/ftp-dialects.html"&gt;FTP Proxy&lt;/a&gt; product, one basic requirement is to intercept upstream authentication commands (USER and PASS commands sent from FTP client to FTP server), finish customized authentication and then let FTP client and FTP server work together with following tasks.&lt;br /&gt;&lt;br /&gt;For upstream commands, the proxy has an inputstream from client and an output stream to server; for downstream commands, it has an inputstream from server and an inputstream to client. An easy way to deal with it is &lt;a href="http://commons.apache.org/launcher/apidocs/org/apache/commons/launcher/StreamConnector.html"&gt;StreamConnector&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Don't mix up with similar solutions like &lt;a href="http://ostermiller.org/convert_java_outputstream_inputstream.html"&gt;Convert a Java OutputStream to an InputStream&lt;/a&gt; and &lt;a href="http://code.google.com/p/io-tools/"&gt;Java utilities for stream wiring and file format detection&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-5256932726000200181?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/5256932726000200181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/how-to-connect-inputstream-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5256932726000200181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5256932726000200181'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/how-to-connect-inputstream-to.html' title='How to connect an InputStream to an OutputStream'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1111493666396055392</id><published>2010-05-16T00:59:00.000-07:00</published><updated>2011-12-01T03:20:03.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Totem Media Player error in Lucid Lynx 32-bit</title><content type='html'>Upgraded to Ubuntu 10.04 for a while and everything is fine. But I encountered an error when I tried to play a video today.&lt;br /&gt;&lt;blockquote&gt;An error occurred&lt;br /&gt;pa_stream_writable_size() failed: Connection terminated&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/S--k4Bedp6I/AAAAAAAAACQ/3bhzdD8qRkQ/s1600/totem_error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://3.bp.blogspot.com/_iiIF044-p-4/S--k4Bedp6I/AAAAAAAAACQ/3bhzdD8qRkQ/s400/totem_error.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I played the same video on Ubuntu 10.04 64-bit without any problem. Time to switch to 64, eh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1111493666396055392?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1111493666396055392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/totem-media-player-error-in-lucid-lynx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1111493666396055392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1111493666396055392'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/totem-media-player-error-in-lucid-lynx.html' title='Totem Media Player error in Lucid Lynx 32-bit'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/S--k4Bedp6I/AAAAAAAAACQ/3bhzdD8qRkQ/s72-c/totem_error.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-4648722351898131385</id><published>2010-05-07T13:49:00.000-07:00</published><updated>2011-12-01T03:20:20.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Where is Sun Java?</title><content type='html'>Trust yourself should be 1st law in open source world.&lt;br /&gt;&lt;br /&gt;I installed Ubuntu 10.04 and noticed Sun Java in not in default repository any more. I checked &lt;a href="http://www.ubuntu.com/getubuntu/releasenotes/1004"&gt;Ubuntu 10.04 LTS Release Notes&lt;/a&gt; and found&lt;br /&gt;&lt;blockquote&gt;&lt;h2 id="Sun Java moved to the Partner repository"&gt;Sun Java moved to  the Partner repository&lt;/h2&gt;&lt;span class="anchor"&gt;&lt;/span&gt;&lt;span class="anchor"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="line862"&gt;For Ubuntu 10.04 LTS, the &lt;tt&gt;sun-java6&lt;/tt&gt;  packages have been dropped from the Multiverse section of the Ubuntu  archive. It is recommended that you use &lt;tt&gt;openjdk-6&lt;/tt&gt; instead. &lt;span class="anchor"&gt;&lt;/span&gt;&lt;span class="anchor"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line862"&gt;If you can not switch from the proprietary Sun  JDK/JRE  to OpenJDK, you can install &lt;tt&gt;sun-java6&lt;/tt&gt; packages from the  Canonical Partner Repository. You can configure your system to use this  repository via command-line: &lt;span class="anchor"&gt;&lt;/span&gt;&lt;span class="anchor"&gt;&lt;/span&gt;&lt;span class="anchor"&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;add-apt-repository "deb http://archive.canonical.com/ lucid partner"&lt;/pre&gt;&lt;/blockquote&gt;Easy, but it's wrong. Here is how to enable partner's repository.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_iiIF044-p-4/S-R74zR6bWI/AAAAAAAAACI/0jC7PeCFIak/s1600/partner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="365" src="http://4.bp.blogspot.com/_iiIF044-p-4/S-R74zR6bWI/AAAAAAAAACI/0jC7PeCFIak/s400/partner.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;You can see the leftover of the wrong command. What a(nother) shame.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-4648722351898131385?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/4648722351898131385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/where-is-sun-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4648722351898131385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4648722351898131385'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/05/where-is-sun-java.html' title='Where is Sun Java?'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/S-R74zR6bWI/AAAAAAAAACI/0jC7PeCFIak/s72-c/partner.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-6229102212499667438</id><published>2010-04-24T18:07:00.000-07:00</published><updated>2011-12-01T03:20:38.016-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Lucid Lynx installed</title><content type='html'>6 months ago, I installed Ubuntu 9.10 side by side with Windows XP on a laptop. I let Ubuntu livecd to do all the task, resize XP partition, create Linux root and swap partiton. It worked flawlessly. Each time I start this laptop, I have a chance to choose between Ubuntu and XP, by default Ubuntu.&lt;br /&gt;&lt;br /&gt;Last week, Ubuntu 10.04 RC released. It's time to upgrade but the problems are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ubuntu 9.10 automatically assigned 6ish GB to Linux partitions (/ and swap). It's not big enough to upgrade directly.&lt;/li&gt;&lt;li&gt;if I remove these 2 partitions, I cannot get my Windows XP started because GRUB will be damaged.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It seems the only way is to accept previous partitions and install new version on them.&lt;br /&gt;&lt;br /&gt;When I was just about to start, I got another idea, better and risky. I removed Linux partitions using GParted, resize XP partition to use this newly freed space. Note that I unchecked Round to cylinder, otherwise error occurred. At this time, I could not boot this laptop to Windows XP, grub rescue prompt is shown and I don't know what to do in it.&lt;br /&gt;&lt;br /&gt;Then I booted the laptop with livecd and did just the same as I did 6 months ago. I worked and Linux partitions now occupied 12ish GB. I'm happy to work this out and happier to see a more confident Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6229102212499667438?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6229102212499667438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/04/lucid-lynx-installed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6229102212499667438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6229102212499667438'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/04/lucid-lynx-installed.html' title='Lucid Lynx installed'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-5267565059046119253</id><published>2010-04-12T17:24:00.000-07:00</published><updated>2010-04-18T22:59:23.940-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><title type='text'>FTP Dialects</title><content type='html'>I'm researching the possibilities of an FTP Proxy that can act as an authentication plugin of an FTP server. As a side product, I experienced totally different FTP dialects from popular FTP clients.&lt;br /&gt;&lt;br /&gt;FileZilla 3.3.2.1 &lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; Connected, sending welcome message...&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; 220-FileZilla Server version 0.9.34 beta&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; 220-written by Tim Kosse (Tim.Kosse@gmx.de)&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; 220 Please visit http://sourceforge.net/projects/filezilla/&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; USER zhao&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; 331 Password required for zhao&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - (not logged in) (127.0.0.1)&amp;gt; PASS ********&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 230 Logged on&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; SYST&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 215 UNIX emulated by FileZilla&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; FEAT&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 211-Features:&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; MDTM&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; REST STREAM&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; SIZE&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; MLST type*;size*;modify*;&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; MLSD&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; UTF8&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; CLNT&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; MFMT&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 211 End&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; PWD&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 257 "/" is current directory.&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; TYPE I&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 200 Type set to I&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; PASV&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 227 Entering Passive Mode (127,0,0,1,4,27)&lt;br /&gt;&lt;span style="background-color: lime;"&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; MLSD&lt;/span&gt;&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 150 Connection accepted&lt;br /&gt;(000001) 13/04/2010 9:54:18 AM - zhao (127.0.0.1)&amp;gt; 226 Transfer OK&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Firefox 3.6.3&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; Connected, sending welcome message...&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; 220-FileZilla Server version 0.9.34 beta&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; 220-written by Tim Kosse (Tim.Kosse@gmx.de)&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; 220 Please visit http://sourceforge.net/projects/filezilla/&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; USER zhao&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; 331 Password required for zhao&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - (not logged in) (127.0.0.1)&amp;gt; PASS ********&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 230 Logged on&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; SYST&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 215 UNIX emulated by FileZilla&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; PWD&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 257 "/" is current directory.&lt;/span&gt;&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; TYPE I&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 200 Type set to I&lt;br /&gt;&lt;span style="background-color: cyan; color: black;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; PASV&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: cyan; color: black;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 227 Entering Passive Mode (127,0,0,1,4,218)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; SIZE /&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 550 File not found&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; MDTM /&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 550 File not found&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; RETR /&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 550 File not found&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: cyan; color: black;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; PASV&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: cyan; color: black;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 227 Entering Passive Mode (127,0,0,1,4,220)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; CWD /&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow;"&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 250 CWD successful. "/" is current directory.&lt;/span&gt;&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; LIST&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 150 Connection accepted&lt;br /&gt;(000002) 13/04/2010 9:59:59 AM - zhao (127.0.0.1)&amp;gt; 226 Transfer OK&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;IE 8&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; Connected, sending welcome message...&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; 220-FileZilla Server version 0.9.34 beta&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; 220-written by Tim Kosse (Tim.Kosse@gmx.de)&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; 220 Please visit http://sourceforge.net/projects/filezilla/&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; USER zhao&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; 331 Password required for zhao&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - (not logged in) (127.0.0.1)&amp;gt; PASS ********&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 230 Logged on&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; CWD /&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 250 CWD successful. "/" is current directory.&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; TYPE A&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 200 Type set to A&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; PASV&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 227 Entering Passive Mode (127,0,0,1,4,226)&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; LIST&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 150 Connection accepted&lt;br /&gt;(000003) 13/04/2010 10:01:42 AM - zhao (127.0.0.1)&amp;gt; 226 Transfer OK&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;It looks that Firefox has the ugliest commands, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-5267565059046119253?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/5267565059046119253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/04/ftp-dialects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5267565059046119253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/5267565059046119253'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/04/ftp-dialects.html' title='FTP Dialects'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-977069358438112118</id><published>2010-02-10T17:02:00.000-08:00</published><updated>2011-12-01T03:20:54.276-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><title type='text'>OpenOffice 3.2.0 released</title><content type='html'>If you want to download it via traditional http protocol, please wait for few days more because OpenOffice prefers P2P this time. Go to &lt;a href="http://distribution.openoffice.org/p2p/"&gt;http://distribution.openoffice.org/p2p/&lt;/a&gt; and you'll find version 3.2.0 for all platforms are already there.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;sudo apt-get remove openoffice*.*&lt;br /&gt;sudo dpkg -i OOO320_m12_native_packed-1_en-US.9483/DEBS/*.deb&lt;br /&gt;sudo dpkg -i OOO320_m12_native_packed-1_en-US.9483/DEBS/desktop-integration/openoffice.org3.2-debian-menus_3.2-9472_all.deb&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/S3NUjIldFCI/AAAAAAAAAB4/4C3TuwyeYi4/s1600-h/openoffice3.2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://3.bp.blogspot.com/_iiIF044-p-4/S3NUjIldFCI/AAAAAAAAAB4/4C3TuwyeYi4/s400/openoffice3.2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I still remember when Ubuntu released Karmic Koala, I can hardly download torrent file from official website. Hope Canonical will follow this way and give P2P downloader a higher priority.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-977069358438112118?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/977069358438112118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/02/openoffice-320-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/977069358438112118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/977069358438112118'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/02/openoffice-320-released.html' title='OpenOffice 3.2.0 released'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/S3NUjIldFCI/AAAAAAAAAB4/4C3TuwyeYi4/s72-c/openoffice3.2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-1242432770104868871</id><published>2010-02-05T22:41:00.000-08:00</published><updated>2010-02-05T22:45:44.327-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>My digital home</title><content type='html'>&lt;ul&gt;&lt;li&gt;Connecting people&lt;/li&gt;&lt;li&gt;Sharing information&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="376" width="500" src="http://static.zooomr.com/images/8883507_563ce545ea_o.gif" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1242432770104868871?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1242432770104868871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/02/my-digital-home.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1242432770104868871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1242432770104868871'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/02/my-digital-home.html' title='My digital home'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-6268103834590796986</id><published>2010-01-28T17:40:00.000-08:00</published><updated>2010-01-29T02:47:14.266-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Submitted another bug to Eclipse</title><content type='html'>It's unavoidable to have ambiguous types in single Java file. The way to solve the problem is very easy, using fully qualified class name. Unfortunately, the Content Assist of Eclipse 3.6M4 is not that smart to generate correct code.&lt;br /&gt;&lt;br /&gt;I submitted this bug to Eclipse today and let's see what will happen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=301197" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://2.bp.blogspot.com/_iiIF044-p-4/S2I78NiJGCI/AAAAAAAAABw/0g3mOq5TtbM/s640/Bug+301197.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6268103834590796986?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6268103834590796986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/submitted-another-bug-to-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6268103834590796986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6268103834590796986'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/submitted-another-bug-to-eclipse.html' title='Submitted another bug to Eclipse'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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://2.bp.blogspot.com/_iiIF044-p-4/S2I78NiJGCI/AAAAAAAAABw/0g3mOq5TtbM/s72-c/Bug+301197.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-2320962791559551271</id><published>2010-01-15T23:05:00.000-08:00</published><updated>2010-01-15T23:34:59.512-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Floating point arithmetic in Python 3 is much more accurate</title><content type='html'>There is always limited precision in floating point arithmetic due to conversion between decimal and binary. But I found Python 3 becomes much more accurate.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; zhao@nettop:~$ python  &lt;br /&gt; Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)   &lt;br /&gt; [GCC 4.4.1] on linux2  &lt;br /&gt; Type "help", "copyright", "credits" or "license" for more information.  &lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; 12.6 / 2  &lt;br /&gt; 6.2999999999999998  &lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; 12.6 + 0.01&lt;br /&gt; 12.609999999999999&lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; float('3.2')&lt;br /&gt; 3.2000000000000002  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; zhao@nettop:~$ python3  &lt;br /&gt; Python 3.1.1+ (r311:74480, Nov 2 2009, 14:49:22)   &lt;br /&gt; [GCC 4.4.1] on linux2  &lt;br /&gt; Type "help", "copyright", "credits" or "license" for more information.  &lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; 12.6 / 2  &lt;br /&gt; 6.3  &lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; 12.6 + 0.01  &lt;br /&gt; 12.61  &lt;br /&gt; &amp;gt;&amp;gt;&amp;gt; float('3.2')  &lt;br /&gt; 3.2  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Who has any idea about this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-2320962791559551271?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/2320962791559551271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/floating-point-arithmetic-in-python-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2320962791559551271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/2320962791559551271'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/floating-point-arithmetic-in-python-3.html' title='Floating point arithmetic in Python 3 is much more accurate'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-8064232099095027890</id><published>2010-01-09T02:46:00.000-08:00</published><updated>2011-12-01T03:21:14.972-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Let scim and ibus support Skype</title><content type='html'>By default, I cannot input Chinese in Linux version of Skype. This issue doesn't get solved when Karmic Koala decided to introduce a new input framework, ibus, to replace scim.&lt;br /&gt;&lt;br /&gt;To solve this problem, add these 3 lines into your .bashrc file and reboot:&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; export GTK_IM_MODULE=ibus  &lt;br /&gt; export XMODIFIERS=@im=ibus  &lt;br /&gt; export QT_IM_MODULE=ibus  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you prefer scim, maybe these lines will help (not tested):&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; export XMODIFIERS=@im=SCIM  &lt;br /&gt; export GTK_IM_MODULE=scim  &lt;br /&gt; export QT_IM_MODULE=scim  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Skype is better now under Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8064232099095027890?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8064232099095027890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/let-scim-and-ibus-support-skype.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8064232099095027890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8064232099095027890'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/let-scim-and-ibus-support-skype.html' title='Let scim and ibus support Skype'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-8294290717987392825</id><published>2010-01-03T17:14:00.000-08:00</published><updated>2012-01-07T03:12:49.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Schema of iTunes podcast feed</title><content type='html'>In 2006, in order to aggregate my favourite podcasts and share them with other iPod owners, I did a podcast aggregation service named myTunes.&lt;br /&gt;&lt;br /&gt;I chose JAXB to map XML documents to Java objects and vice versa, so I need a schema or DTD file of iTunes podcast feed. Unfortunately I couldn't find one. I had to generate one myself.&lt;br /&gt;&lt;br /&gt;I got &lt;a href="http://www.apple.com/itunes/podcasts/specs.html#example"&gt;an example feed&lt;/a&gt; from Apple. I removed a few elements that I think of no use at the moment and generated its schema.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" elementFormDefault="qualified"&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType name="channelType"&amp;gt;&lt;br /&gt;        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="title"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="link"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="language"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="description"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="pubDate"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name="image" type="imageType"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="copyright"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="subtitle"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="summary"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name="item" type="itemType" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="copyright"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;        &amp;lt;xs:element name="subtitle"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;        &amp;lt;xs:element name="summary"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="description"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType name="enclosureType"&amp;gt;&lt;br /&gt;        &amp;lt;xs:attribute name="url" use="required"&amp;gt;&lt;br /&gt;            &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;                &amp;lt;xs:restriction base="xs:anyURI"&amp;gt;&lt;br /&gt;                &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;            &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;        &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;        &amp;lt;xs:attribute name="length" use="required"&amp;gt;&lt;br /&gt;            &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;                &amp;lt;xs:restriction base="xs:int"&amp;gt;&lt;br /&gt;                &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;            &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;        &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;        &amp;lt;xs:attribute name="type" use="required"&amp;gt;&lt;br /&gt;            &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;                &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;                &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;            &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;        &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="guid"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:anyURI"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType name="imageType"&amp;gt;&lt;br /&gt;        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="url"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="title"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="link"/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;xs:complexType name="itemType"&amp;gt;&lt;br /&gt;        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="title"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="link"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="description"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="subtitle"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="summary"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name="enclosure" type="enclosureType"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="guid"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="pubDate"/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element ref="duration"/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="language"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="link"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:anyURI"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="pubDate"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="duration"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="rss"&amp;gt;&lt;br /&gt;        &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;            &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name="channel" type="channelType"/&amp;gt;&lt;br /&gt;            &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:attribute name="version" use="required"&amp;gt;&lt;br /&gt;                &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;                    &amp;lt;xs:restriction base="xs:decimal"&amp;gt;&lt;br /&gt;                        &amp;lt;xs:enumeration value="2.0"/&amp;gt;&lt;br /&gt;                    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;                &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;/xs:attribute&amp;gt;&lt;br /&gt;        &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="title"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="url"&amp;gt;&lt;br /&gt;        &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;            &amp;lt;xs:restriction base="xs:anyURI"&amp;gt;&lt;br /&gt;            &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;        &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Then I created Java classes (ObjectFactory.java, Rss.java, ChannelType.java, ImageType.java, ItemType.java and EnclosureType.java) using xjc. Now we're ready to output iTunes compatible podcast feed.&lt;br /&gt;&lt;br /&gt;I had closed myTunes before I moved to Melbourne in 2008. In less than 2 years, myTunes collected several hundreds of user agent (it only collects user agent, nothing else). I think it'll be a good idea to publish them one day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-8294290717987392825?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/8294290717987392825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/schema-of-itunes-podcast-feed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8294290717987392825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/8294290717987392825'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2010/01/schema-of-itunes-podcast-feed.html' title='Schema of iTunes podcast feed'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-6495012886852236647</id><published>2009-11-16T01:00:00.000-08:00</published><updated>2010-12-14T14:18:48.290-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Message Digest algorithms in Java Cryptography Architecture</title><content type='html'>This is the 2nd part of Message Digest algorithms test. I did performance tests on MD5, SHA-1, SHA-256, SHA-384 and SHA-512 in &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html#MessageDigest"&gt;Java Cryptography Architecture (JCA)&lt;/a&gt; of Java SE6 against the same file as in 1st part.&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.nobrtable br { display: none }&lt;/style&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;table border="1"&gt;&lt;thead&gt;&lt;tr&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;Alg. Name &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;Real Time &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;User Time &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;System Time &lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;MD5&lt;/td&gt; &lt;td&gt;0m15.004s&lt;/td&gt; &lt;td&gt;0m9.109s&lt;/td&gt; &lt;td&gt;0m1.344s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;SHA-1&lt;/td&gt; &lt;td&gt;0m38.654s&lt;/td&gt; &lt;td&gt;0m35.318s&lt;/td&gt; &lt;td&gt;0m2.036s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;SHA-256&lt;/td&gt; &lt;td&gt;0m59.053s&lt;/td&gt; &lt;td&gt;0m56.032s&lt;/td&gt; &lt;td&gt;0m1.784s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;SHA-384&lt;/td&gt; &lt;td&gt;1m56.362s&lt;/td&gt; &lt;td&gt;1m53.663s&lt;/td&gt; &lt;td&gt;0m1.364s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;SHA-512&lt;/td&gt; &lt;td&gt;1m58.385s&lt;/td&gt; &lt;td&gt;1m53.727s&lt;/td&gt; &lt;td&gt;0m1.484s&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;br /&gt;The results are quite interesting if compared with the results of md5sum, sha1sum, sha224sum, sha256sum, sha384sum and sha512sum in Ubuntu in &lt;a href="http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms.html"&gt;1st part&lt;/a&gt;. Basically&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MD5 is comparable in terms of time but with a higher percentage of CPU usage (2X);&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SHA-1 and SHA-256 are much slower (2X);&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SHA-384 and SHA-512 are a bit faster than native implementations.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6495012886852236647?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6495012886852236647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms-in-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6495012886852236647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6495012886852236647'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms-in-java.html' title='Message Digest algorithms in Java Cryptography Architecture'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-9062507057179101066</id><published>2009-11-09T20:08:00.000-08:00</published><updated>2012-01-07T03:13:33.623-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><title type='text'>VoIP bandwidth usage</title><content type='html'>I think in most countries, it's not a problem to worry about the bandwidth usage of VoIP. But it's obviously not the case here in Australia, most Internet users have download limit or even upload limit. That's why "how much bandwidth is used" becomes an FAQ. There are many bandwidth calculators out there, but here is the statistics from my ATA.&lt;br /&gt;&lt;br /&gt;Using G729a codec, the throughput is about 3.6MB/hr in one direction.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/SvjlDtJ6MhI/AAAAAAAAAAs/2lYynE0qkMI/s1600-h/g729.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_iiIF044-p-4/SvjlDtJ6MhI/AAAAAAAAAAs/2lYynE0qkMI/s640/g729.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Using G711u codec, the throughput is about 28.8MB/hr in one direction.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_iiIF044-p-4/Svjl0GttxHI/AAAAAAAAAA0/OVjzTc3Mfio/s1600-h/g711.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_iiIF044-p-4/Svjl0GttxHI/AAAAAAAAAA0/OVjzTc3Mfio/s640/g711.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In my calculation, 1MB = 1,000,000Bytes, which is correct to hard disk manufacturers, Snow Leopard and my ISP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-9062507057179101066?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/9062507057179101066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/voip-bandwidth-usage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9062507057179101066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9062507057179101066'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/voip-bandwidth-usage.html' title='VoIP bandwidth usage'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/SvjlDtJ6MhI/AAAAAAAAAAs/2lYynE0qkMI/s72-c/g729.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-6815829003266693243</id><published>2009-11-03T04:06:00.000-08:00</published><updated>2011-12-01T03:21:33.469-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Message Digest algorithms</title><content type='html'>I'm doing a home-made backup product that needs to compute checksum of tens of thousands of file. According to Wikipedia, there are quite a number of &lt;a href="http://en.wikipedia.org/wiki/Category:Checksum_algorithms"&gt;checksum algorithms&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This product will first base on Linux and some of the checksum utilities are already provided by Ubuntu 9.10. They are md5sum, sha1sum, sha224sum, sha256sum, sha384sum and sha512sum.&lt;br /&gt;&lt;br /&gt;In case one day I will port this product to Windows, I also checked &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html#MessageDigest"&gt;MessageDigest&lt;/a&gt; of Java Cryptography Architecture (JCA) in Java SE6. It supports MD2, MD5, SHA-1, SHA-256, SHA-384 and SHA-512.&lt;br /&gt;&lt;br /&gt;Doing checksum is both CPU and IO intensive. I did a simple performance test today on how much CPU time is needed to compute different checksums (commonly supported by Linux and MessageDigest) of a 723,488,768-byte file.&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.nobrtable br { display: none }&lt;/style&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;table border="1"&gt;&lt;thead&gt;&lt;tr&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;Alg. Name &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;Real Time &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;User Time &lt;/th&gt; &lt;th bgcolor="#dedeef" width="25%"&gt;System Time &lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;md5sum&lt;/td&gt; &lt;td&gt;0m14.655s&lt;/td&gt; &lt;td&gt;0m4.380s&lt;/td&gt; &lt;td&gt;0m1.300s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;sha1sum&lt;/td&gt; &lt;td&gt;0m15.187s&lt;/td&gt; &lt;td&gt;0m12.641s&lt;/td&gt; &lt;td&gt;0m1.764s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;sha256sum&lt;/td&gt; &lt;td&gt;0m25.859s&lt;/td&gt; &lt;td&gt;0m23.341s&lt;/td&gt; &lt;td&gt;0m1.656s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;sha384sum&lt;/td&gt; &lt;td&gt;2m25.417s&lt;/td&gt; &lt;td&gt;2m23.841s&lt;/td&gt; &lt;td&gt;0m1.432s&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;sha512sum&lt;/td&gt; &lt;td&gt;2m25.733s&lt;/td&gt; &lt;td&gt;2m23.373s&lt;/td&gt; &lt;td&gt;0m2.116s&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Now I have a clear idea of work load of these algorithms. I will do a &lt;a href="http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms-in-java.html"&gt;Java implementation test&lt;/a&gt; later to see if I can get similar results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6815829003266693243?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6815829003266693243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6815829003266693243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6815829003266693243'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/11/message-digest-algorithms.html' title='Message Digest algorithms'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-4404699950543739595</id><published>2009-10-30T17:44:00.000-07:00</published><updated>2011-12-01T03:21:50.937-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Empathy and Samba</title><content type='html'>I installed Ubuntu 9.10, Karmic Koala, on 2 boxes yesterday. One is on my wife's ThinkPad as dual boot. It occupies 6GB of disk and works as a charm. Another one on my existing Ubuntu 9.04's partition and reuse my /home file system. I had at least two problem when I began to use my new Ubuntu.&lt;br /&gt;&lt;br /&gt;The first problem is from Empathy, the substitution Pidgin as an IM client. I got "Network error" when I tried to login my MSN account. I solved this issue by&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(240, 240, 240) url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; killall telepathy-butterfly  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;but still feel uncomfortable with its user interface. Maybe I should give Emesene a go or stick with Pidgin.&lt;br /&gt;&lt;br /&gt;Another problem is I could not mount my NAS using SMB/CIFS. I got a message box says&lt;br /&gt;&lt;blockquote&gt;Unable to mount location&lt;br /&gt;DBus error org.freedesktop.DBus.Error.NoReply: Message did not receive a reply (timeout by message bus)&lt;br /&gt;&lt;/blockquote&gt;It turned to be a keyring related defect. My workaround is deleting all the smb entries in Password: default group in Passwords and Encryption Keys.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/SuuGIu6357I/AAAAAAAAAAk/wSxeEBtlZkE/s1600-h/passwords+and+encryption+keys.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_iiIF044-p-4/SuuGIu6357I/AAAAAAAAAAk/wSxeEBtlZkE/s400/passwords+and+encryption+keys.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In my case, it's not a fresh install or an upgrade. Maybe that's the root of the 2 problems I encountered. To be a good trouble shooter, you have to be a good trouble maker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-4404699950543739595?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/4404699950543739595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/empathy-and-samba.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4404699950543739595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/4404699950543739595'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/empathy-and-samba.html' title='Empathy and Samba'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/SuuGIu6357I/AAAAAAAAAAk/wSxeEBtlZkE/s72-c/passwords+and+encryption+keys.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-7113488572274202871</id><published>2009-10-29T15:58:00.000-07:00</published><updated>2009-11-04T03:15:55.662-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>HTTP Monitor in NetBeans</title><content type='html'>By default, the HTTP Monitor function in NetBeans 6.7.1 is disabled. To enable it, go to Properties of GlassFish v2.1.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_iiIF044-p-4/SuodBBGLA4I/AAAAAAAAAAc/1Xlemo3T344/s1600-h/http_monitor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_iiIF044-p-4/SuodBBGLA4I/AAAAAAAAAAc/1Xlemo3T344/s640/http_monitor.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PS Ubuntu 9.10 is out today. It's so hot that I cannot download its torrent file, don't even think about the iso file. Thanks to zsync, I have ubuntu-9.10-desktop-i386.iso on my disk now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-7113488572274202871?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/7113488572274202871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/http-monitor-in-netbeans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7113488572274202871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7113488572274202871'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/http-monitor-in-netbeans.html' title='HTTP Monitor in NetBeans'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/SuodBBGLA4I/AAAAAAAAAAc/1Xlemo3T344/s72-c/http_monitor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-7998683729914247959</id><published>2009-10-28T20:42:00.000-07:00</published><updated>2009-10-29T16:03:24.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='applet'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Invoking JavaFX function from JavaScript</title><content type='html'>As we all know, JavaFX script is very friendly to Java. It's also quite friendly to JavaScript because JavaFX can be run as an applet. Here are the steps to call a JavaFX function from JavaScript side. I use NetBeans 6.7.1, JavaFX 1.2, Ubuntu and Firefox as my development environment.&lt;br /&gt;&lt;br /&gt;First, create a JavaFX project (Foo) and set the Application Execution Model to Run in Browser. After it can run correctly, copy Foo.jar and Foo_browser.jnlp in dist/ folder. Usually there are four files in the folder, but we only need three. The other one is needed in step 3.&lt;br /&gt;&lt;br /&gt;Second, create a web application and put the two files copied in previous step into the root of the web application.&lt;br /&gt;&lt;br /&gt;Third, add an id attribute to the following snippet of Foo.html in dist/ folder of previous project. Copy this piece of code and paste it to the web page that uses the JavaFX applet.&lt;br /&gt;&lt;pre style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: rgb(240, 240, 240) url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black;"&gt; &amp;lt;script src=""http://dl.javafx.com/1.2/dtfx.js""&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt; &amp;lt;script&amp;gt;  &lt;br /&gt;       javafx(  &lt;br /&gt;       {  &lt;br /&gt;         archive: "Foo.jar",  &lt;br /&gt;         draggable: true,  &lt;br /&gt;         width: 250,  &lt;br /&gt;         height: 250,  &lt;br /&gt;         code: "foo.Foo",  &lt;br /&gt;         name: "Foo",  &lt;br /&gt;         id: "Applet"  &lt;br /&gt;       }  &lt;br /&gt;     );  &lt;br /&gt; &amp;lt;/script&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Finally, use following code to invoke a JavaFX function&lt;br /&gt;&lt;pre style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: rgb(240, 240, 240) url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black;"&gt;  var app = document.getElementById("Applet");  &lt;br /&gt;  app.script.foo(...);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you get exception like&lt;br /&gt;&lt;blockquote&gt;message = app.script is undefined&lt;br /&gt;&lt;/blockquote&gt;remove the codebase attribute of jnlp element in Foo_browser.jnlp and try again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-7998683729914247959?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/7998683729914247959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/invoking-javafx-function-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7998683729914247959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/7998683729914247959'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/invoking-javafx-function-from.html' title='Invoking JavaFX function from JavaScript'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1578291896204400744</id><published>2009-10-27T17:07:00.000-07:00</published><updated>2012-01-07T03:13:33.615-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><title type='text'>Mapped SIP Port &amp; Interdigit Short Timer</title><content type='html'>I've had a problem with my VoIP for several days. I could not hear any voice from my DID number from last Friday. I opened a ticket to my service provider and they suggested me to try softphone.&lt;br /&gt;&lt;br /&gt;I think that's just a useless step because there is no problem with my sipbroker call. Guess what, after I set Ekiga with my SIP details, I can make correct phone calls with my DID number. So there must be something wrong with my ATA.&lt;br /&gt;&lt;br /&gt;I performed a user factory reset (877778) for my SPA-1001 and the problem is gone. I checked the settings and found the Mapped SIP Port of both lines are set to 1024, not 5060. Funny.&lt;br /&gt;&lt;br /&gt;Another annoying problem is I usually get a timeout when I dial a number from phone book. I think it should be Interdigit Long Timer, which is set to 10 seconds long but I'm wrong. I changed Interdigit Short Timer from 3 to 5 seconds as I have such a slow handset.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_iiIF044-p-4/SueIfL4lrZI/AAAAAAAAAAU/zwJQp2VW6Dk/s1600-h/Interdigit+Short+Timer.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_iiIF044-p-4/SueIfL4lrZI/AAAAAAAAAAU/zwJQp2VW6Dk/s640/Interdigit+Short+Timer.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The only shortcoming is waiting for 5 seconds after dialling the last digit. No big deal and this can be avoided by appending a # to every number in my phone book.&lt;br /&gt;&lt;br /&gt;Making VoIP work for you is so amazing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1578291896204400744?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1578291896204400744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/mapped-sip-port-interdigit-short-timer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1578291896204400744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1578291896204400744'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/mapped-sip-port-interdigit-short-timer.html' title='Mapped SIP Port &amp; Interdigit Short Timer'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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/_iiIF044-p-4/SueIfL4lrZI/AAAAAAAAAAU/zwJQp2VW6Dk/s72-c/Interdigit+Short+Timer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8390553214395009892.post-3062903423844639325</id><published>2009-10-26T16:42:00.000-07:00</published><updated>2011-12-01T03:22:10.548-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Introduce an old scanner to Ubuntu 9.04</title><content type='html'>I bought my scanner several years ago from Zhongguancun. It's an acer s2w 3300u. I love the idea of s2w, scan to web. It's what &lt;a href="http://books.google.com/"&gt;Google Books&lt;/a&gt; is doing. I've been using it to digitalise photos and documents these year, only on Windows.&lt;br /&gt;&lt;br /&gt;Since I have a almost Windows-free home now, I planned to try it on Ubuntu. I started Xsane last night, an error occurred&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Failed to open device 'snapscan:libusb:003:002': Invalid argument.&lt;/blockquote&gt;&lt;br /&gt;This is because the backend of the scanning program, snapscan, doesn't know what kind of scanner it is and which driver to use. Let's try sane-find-scanner and lsusb to figure it out.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; zhao@nettop:~$ sane-find-scanner   &lt;br /&gt;   &lt;br /&gt;  # sane-find-scanner will now attempt to detect your scanner. If the  &lt;br /&gt;  # result is different from what you expected, first make sure your  &lt;br /&gt;  # scanner is powered up and properly connected to your computer.  &lt;br /&gt;   &lt;br /&gt;  # No SCSI scanners found. If you expected something different, make sure that  &lt;br /&gt;  # you have loaded a kernel SCSI driver for your SCSI adapter.  &lt;br /&gt;   &lt;br /&gt; found USB scanner (vendor=0x04a5 [Color], product=0x20b0 [ FlatbedScanner 22]) at libusb:003:002  &lt;br /&gt;  # Your USB scanner was (probably) detected. It may or may not be supported by  &lt;br /&gt;  # SANE. Try scanimage -L and read the backend's manpage.  &lt;br /&gt;   &lt;br /&gt;  # Not checking for parallel port scanners.  &lt;br /&gt;   &lt;br /&gt;  # Most Scanners connected to the parallel port or other proprietary ports  &lt;br /&gt;  # can't be detected by this program.  &lt;br /&gt;   &lt;br /&gt;  # You may want to run this program as root to find all devices. Once you  &lt;br /&gt;  # found the scanner devices, be sure to adjust access permissions as  &lt;br /&gt;  # necessary.  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; zhao@nettop:~$ lsusb   &lt;br /&gt; Bus 001 Device 004: ID 0bda:0158 Realtek Semiconductor Corp. Mass Stroage Device  &lt;br /&gt; Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub  &lt;br /&gt; Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub  &lt;br /&gt; Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub  &lt;br /&gt; Bus 003 Device 002: ID 04a5:20b0 Acer Peripherals Inc. (now BenQ Corp.) S2W 3300U/4300U  &lt;br /&gt; Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub  &lt;br /&gt; Bus 002 Device 003: ID 0603:00f2 Novatek Microelectronics Corp.   &lt;br /&gt; Bus 002 Device 002: ID 0d62:a100 Darfon Electronics Corp. Benq Mouse  &lt;br /&gt; Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;As you can see the system has this model in its database, what I need to do is to find the driver for it. I cannot find its original CD since I can use it without any special driver or application on Windows. But this is not a big problem for this popular scanner. After a quick search, I got u176v040.bin from a zip file. I copied it to /usr/share/sane/snapscan/ and modified /etc/sane.d/snapscan.conf as follows&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; # Change to the fully qualified filename of your firmware file, if  &lt;br /&gt; # firmware upload is needed by the scanner  &lt;br /&gt; firmware /usr/share/sane/snapscan/u176v040.bin  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;All done. Xsane is sort of like GIMP, powerful yet not so friendly. I have to get used to it or find other alternatives, but that's way more simple than driving the scanner up and running.&lt;br /&gt;&lt;br /&gt;PS connect the USB cable before power on the scanner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-3062903423844639325?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/3062903423844639325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/introduce-old-scanner-to-ubuntu-904.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3062903423844639325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/3062903423844639325'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/introduce-old-scanner-to-ubuntu-904.html' title='Introduce an old scanner to Ubuntu 9.04'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-9168191873047148057</id><published>2009-10-18T02:29:00.000-07:00</published><updated>2011-12-01T03:22:29.045-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>No more free Ubuntu CD for me</title><content type='html'>As a long term Ubuntu user (since 5.04), I know I can request a free Ubuntu CD from Canonical via &lt;a href="https://shipit.ubuntu.com/"&gt;https://shipit.ubuntu.com/&lt;/a&gt;. I got the news yesterday that shipit is open for Karmic Koala. I login and got a disappointing message.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You have already received our maximum number of allowed shipments. Please download the CD image and record it yourself.&lt;/blockquote&gt;&lt;br /&gt;I don't know there is a limitation. As a overused Ubuntu user, I was banned to view my request history so I don't know what the limitation is. I requested only ONE CD at a time, but not every release, and I hit the limitation after I've been using Ubuntu for 5 years.&lt;br /&gt;&lt;br /&gt;From Koala, I won't be a burden of Canonical. I will download image file and burn CD of every new release of Ubuntu. I will continue to tell every possible Ubuntu user the free request service, because I know, before they hit the limitation, they are very likely already a Ubuntu lover.&lt;br /&gt;&lt;br /&gt;Enterprise users are new target of Canonical, personal users shouldn't expect too much from it anymore.&lt;br /&gt;&lt;br /&gt;UPDATE: Better late than never, here is the official explanation from Canonical, &lt;a href="http://blog.canonical.com/?p=264"&gt;Keeping Ubuntu CDs available&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-9168191873047148057?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/9168191873047148057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/no-more-free-ubuntu-cd-for-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9168191873047148057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/9168191873047148057'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/no-more-free-ubuntu-cd-for-me.html' title='No more free Ubuntu CD for me'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-6597849626287986172</id><published>2009-10-15T03:11:00.000-07:00</published><updated>2010-11-11T02:53:31.354-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sts'/><title type='text'>Major Bursary in Science Talent Search 2009</title><content type='html'>Well, not me, it's my son.&lt;br /&gt;&lt;br /&gt;Yesterday, he got a mail from Science Victoria, saying he has been awarded a Major Bursary for his entry of a computer program.&lt;br /&gt;&lt;br /&gt;My son began "programming" when he was 6.5 years old while I did the same when I was 13. Does this mean that he is twice as smart as me? I think so. Anyway, hope he enjoys it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-6597849626287986172?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/6597849626287986172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/major-bursary-in-science-talent-search.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6597849626287986172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/6597849626287986172'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/major-bursary-in-science-talent-search.html' title='Major Bursary in Science Talent Search 2009'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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-8390553214395009892.post-1946178140889863743</id><published>2009-10-04T20:45:00.000-07:00</published><updated>2012-01-07T03:10:47.846-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>My 1st post</title><content type='html'>This is my very 1st post here.&lt;br /&gt;&lt;br /&gt;I've been a programmer for quite a long time and just realised that I need a place to record what I'm doing right now, basically anything regarding software and programming.&lt;br /&gt;&lt;br /&gt;Thanks for watching and hope someone will find this blog useful, and hopefully, interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8390553214395009892-1946178140889863743?l=codingsince1985.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingsince1985.blogspot.com/feeds/1946178140889863743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/my-1st-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1946178140889863743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8390553214395009892/posts/default/1946178140889863743'/><link rel='alternate' type='text/html' href='http://codingsince1985.blogspot.com/2009/10/my-1st-post.html' title='My 1st post'/><author><name>Jerry Zhao</name><uri>http://www.blogger.com/profile/16406994949716405009</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></feed>
