<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DUQHSHcyfSp7ImA9WhRVGEo.&quot;"><id>tag:blogger.com,1999:blog-28274498</id><updated>2012-01-18T20:02:19.995+11:00</updated><category term="business" /><category term="computer networking" /><category term="finance" /><category term="software engineering" /><category term="programming" /><category term="IT" /><category term="Photography" /><category term="Miscellaneous" /><category term="game" /><category term="Car" /><category term="Health" /><category term="hardware" /><category term="web design" /><category term="database" /><category term="operating system" /><title>Terry Su</title><subtitle type="html">非淡泊无以明志，非宁静无以致远</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://suange.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>208</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/suange" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="suange" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEMCSHk4eip7ImA9WhRXFEs.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-6470100399781532361</id><published>2011-12-21T22:21:00.000+11:00</published><updated>2011-12-21T22:21:09.732+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-21T22:21:09.732+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="operating system" /><title>CitrixICAClientHowTo</title><content type="html">https://help.ubuntu.com/community/CitrixICAClientHowTo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-6470100399781532361?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/6470100399781532361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/12/citrixicaclienthowto.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/6470100399781532361?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/6470100399781532361?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/12/citrixicaclienthowto.html" title="CitrixICAClientHowTo" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUcARHw-eip7ImA9WhRXEE4.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4695257116903778133</id><published>2011-12-16T23:04:00.000+11:00</published><updated>2011-12-16T23:04:05.252+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-16T23:04:05.252+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="operating system" /><title>Create Desktop Shortcuts in Ubuntu 11.10</title><content type="html">In previous versions of Ubuntu with Gnome Desktop as the default 
session, one could quickly create desktop shortcuts by right-clicking on
 a blank area of the desktop and choosing to create launchers. Not 
anymore in Ubuntu 11.04/11.10 with Unity. Before you can create 
shortcuts in 11.04/ 11.10, you must first install some packages.&lt;br /&gt;
This brief tutorial will show you how to quickly create desktop shortcuts in Ubuntu 11.10 with Unity as your desktop session.&lt;br /&gt;
&lt;br /&gt;
To get started, press &lt;strong&gt;&lt;span style="font-size: small;"&gt;Ctrl – Alt – T&lt;/span&gt;&lt;/strong&gt; to open Terminal. When it opens, run the commands below to install necessary packages.&lt;br /&gt;
&lt;pre style="background-color: #f3f3f3; border-bottom: #0000ff 1px solid; border-left: #0000ff 1px solid; border-right: #0000ff 1px solid; border-top: #0000ff 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 498px;"&gt;&lt;pre style="background-color: #f3f3f3; font-family: consolas,'Courier New',courier,monospace; font-size: 14px; margin: 0em; width: 100%;"&gt;sudo apt-get install --no-install-recommends gnome-panel&lt;/pre&gt;
&lt;/pre&gt;
&lt;a href="http://www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/oneiric_desktop_shortcuts_1.png"&gt;&lt;img alt="oneiric_desktop_shortcuts_1" border="0" height="79" src="http://3-ps.googleusercontent.com/h/www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/504x79xoneiric_desktop_shortcuts_1_thumb.png.pagespeed.ic.uZOQuSF58Z.png" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="oneiric_desktop_shortcuts_1" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
After installing the above packages, begin creating desktop launchers by running the commands below:&lt;br /&gt;
&lt;pre style="background-color: #f3f3f3; border-bottom: #0000ff 1px solid; border-left: #0000ff 1px solid; border-right: #0000ff 1px solid; border-top: #0000ff 1px solid; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 498px;"&gt;&lt;pre style="background-color: #f3f3f3; font-family: consolas,'Courier New',courier,monospace; font-size: 14px; margin: 0em; width: 100%;"&gt;gnome-desktop-item-edit --create-new ~/Desktop&lt;/pre&gt;
&lt;/pre&gt;
&lt;a href="http://www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/oneiric_desktop_shortcuts.png"&gt;&lt;img alt="oneiric_desktop_shortcuts" border="0" height="77" src="http://1-ps.googleusercontent.com/h/www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/504x77xoneiric_desktop_shortcuts_thumb.png.pagespeed.ic.7BC_gF6baS.png" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="oneiric_desktop_shortcuts" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Run the above commands for each new launcher you wish to create.&lt;br /&gt;
&lt;br /&gt;
Fill in the application details on the screen shown below:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/oneiric_desktop_shortcuts_2.png"&gt;&lt;img alt="oneiric_desktop_shortcuts_2" border="0" height="268" src="http://4-ps.googleusercontent.com/h/www.liberiangeek.net/wp-content/uploads/2011/06/Create-Desktop-Shortcu.10-Oneiric-Ocelot_DA7C/504x268xoneiric_desktop_shortcuts_2_thumb.png.pagespeed.ic.CozjIiGsgZ.png" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="oneiric_desktop_shortcuts_2" width="504" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4695257116903778133?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4695257116903778133/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/12/create-desktop-shortcuts-in-ubuntu-1110.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4695257116903778133?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4695257116903778133?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/12/create-desktop-shortcuts-in-ubuntu-1110.html" title="Create Desktop Shortcuts in Ubuntu 11.10" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0YNRXo7cSp7ImA9WhRQF0s.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-2402918659189375777</id><published>2011-12-13T19:33:00.002+11:00</published><updated>2011-12-13T19:33:14.409+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T19:33:14.409+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="operating system" /><title>15 Things I Did After Installing New Ubuntu 11.10 Oneiric Ocelot</title><content type="html">&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div style="text-align: justify;"&gt;

Ubuntu 11.10 Oneiric Ocelot is scheduled to arrive on Oct 13, 2011. A 
lot of things have changed with Ubuntu in the mean time. This &lt;a href="http://www.techdrivein.com/2011/08/12-things-new-in-ubuntu-1110.html"&gt;Ubuntu 11.10 screenshot tour&lt;/a&gt;
 will give you a quick preview of important changes in the upcoming 
Ubuntu Oneiric release. I have been using Ubuntu 11.10 as my netbook's 
primary OS ever since the second alpha release of Ubuntu 11.10 happened.
 Here is a quick list of things to do after installing Ubuntu 11.10.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;

&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://2.bp.blogspot.com/-jIqPHWB3zTU/TpSCFt7RxgI/AAAAAAAACjc/qfzDwhLuqFM/s1600/thingstodo_after_installing_ubuntu_oneric.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="things to do after installing Ubuntu 11.10" border="0" height="233" src="http://2.bp.blogspot.com/-jIqPHWB3zTU/TpSCFt7RxgI/AAAAAAAACjc/qfzDwhLuqFM/s400/thingstodo_after_installing_ubuntu_oneric.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href="" name="more"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Top Things To Do After Installing Ubuntu 11.10 Oneiric Ocelot&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;

This has become kind of a customary post with every new Ubuntu release. 
Especially since the arrival of Unity, many new and old Ubuntu users are
 looking for ways to improve the functionality aspect of Ubuntu and 
customize the Unity environment to their respective needs.&lt;br /&gt;
&lt;br /&gt;
I have been a big time Ubuntu Unity user ever since it was released and 
here are the things I did to improve Ubuntu 11.10 Oneiric Ocelot after 
installing it. Note that, many parts of it will inevitably be similar to
 our previous article on &lt;a href="http://www.techdrivein.com/2011/04/12-things-i-did-after-installing-new.html"&gt;things to do after installing Ubuntu 11.04 Natty Narwhal&lt;/a&gt;. There will be many new additional tips and tricks as well. Read on.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;

&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;b&gt;First Things First - Installing Restricted Extras During Installation&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;Starting from Ubuntu 11.04 release, you
 can install restricted codecs package(which include Adobe Flash, MP3 
codecs and such) during installation of Ubuntu OS itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://1.bp.blogspot.com/-LUKTeHu-QX8/Tbe5Tsgz9dI/AAAAAAAAB-M/gZEjtNjhMxI/s1600/Screenshot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Things to do After Installing Ubuntu 11.10" border="0" height="300" src="http://1.bp.blogspot.com/-LUKTeHu-QX8/Tbe5Tsgz9dI/AAAAAAAAB-M/gZEjtNjhMxI/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;

&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;Notice the arrows pointing to the boxes
 in the screenshot above. If you tick both of them during the Ubuntu 
installation process(make sure you are connected to the internet before 
doing so), restricted extras package will be installed automatically and
 you will be able to play mp3's and watch flash videos(YouTube videos 
for example) right after Ubuntu installation is complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;But there is a catch. If you have a 
slow internet connection(which is very rare these days), ticking the 
boxes shown in the screenshot above will unnecessarily lengthen the 
installation process. I for one prefer to do all that after installing 
Ubuntu. If you are like me, the &lt;b&gt;next&lt;/b&gt; &lt;b&gt;two steps&lt;/b&gt; are for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;b&gt;Update Repositories&lt;/b&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;After you install brand new Ubuntu 
11.10, the first thing you need to do is to update repositories and make
 sure you have the latest updates installed(Like I said before, you need
 to do this only if you haven't ticked the boxes shown in the above 
screenshot).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Open Terminal(&lt;i&gt;Ubuntu 11.10 Keyboard Shortcut: &lt;b&gt;Ctrl + Alt + T&lt;/b&gt;&lt;/i&gt;) and copy-paste the following command into Terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade&lt;/pre&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Done. Ubuntu repositories have been successfully updated.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Install Ubuntu Restricted Extras&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Install the "ubuntu-restricted-extras" 
package. This will enable your Ubuntu to play popular file formats like 
mp3, avi, Flash videos etc. &lt;a href="apt:ubuntu-restricted-extras"&gt;&lt;b&gt;Click Here&lt;/b&gt;&lt;/a&gt; OR simply copy-paste the command below into Terminal to install the package(You &lt;b&gt;need not&lt;/b&gt; &lt;b&gt;do this&lt;/b&gt; also if you have ticked the 'right' boxes).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo apt-get install ubuntu-restricted-extras&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Done.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Enable Full DVD Playback(Dual Layer DVD Support)&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Though installing the restricted extras
 package will solve most of your problems, you may not be able to play 
dual layer dvds yet in your Ubuntu.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;For that, you need to install libdvdcss2 package from medibuntu repositories. Simply do the following in Terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 50px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list &amp;amp;&amp;amp; sudo apt-get --quiet update &amp;amp;&amp;amp; sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring &amp;amp;&amp;amp; sudo apt-get --quiet update
sudo apt-get install libdvdcss2&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Done.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Check for Availability of Proprietary Hardware Drivers&lt;/b&gt;&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/-ojIqqZyLolc/TpUR_i2Xc-I/AAAAAAAACjs/KOPb7UdUXHY/s1600/drivers_ubuntu1110.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="drivers for ubuntu" border="0" height="373" src="http://4.bp.blogspot.com/-ojIqqZyLolc/TpUR_i2Xc-I/AAAAAAAACjs/KOPb7UdUXHY/s400/drivers_ubuntu1110.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;In my case, all the hardware drivers including graphics, sound and 
wireless drivers were enabled automatically(though, as you can see, I 
still have a proprietary wireless driver on offer, which I have not 
activated). But this may not be the case with everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://4.bp.blogspot.com/-ITuZ3M2aS-w/TpUTWncKK-I/AAAAAAAACj0/4V95XHDb3Ew/s1600/ubuntu1110_screenshot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="additional drivers for ubuntu 11.10" border="0" height="233" src="http://4.bp.blogspot.com/-ITuZ3M2aS-w/TpUTWncKK-I/AAAAAAAACj0/4V95XHDb3Ew/s400/ubuntu1110_screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;If you are among the not-so-lucky, open Unity dash (&lt;i&gt;Ubuntu 11.10 Keyboard Shortcut: &lt;b&gt;Super key&lt;/b&gt;)&lt;/i&gt;&amp;nbsp;and search for 'Additional Drivers' application. &lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Check for additional drivers available 
and activate the ones you want. In 90% of the cases, this will do the 
trick. Those who were not able to get their hardware drivers enabled yet
 will have to do fair amount of digging through &lt;a href="http://ubuntuforums.org/"&gt;ubuntuforums&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;

&lt;b&gt;Install Compiz Config Settings Manager&lt;/b&gt;&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/-sqH1Bsct1IE/TbfH5yXCKqI/AAAAAAAAB-c/PHYxTkThPAo/s1600/Screenshot-1.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Things to do After Installing Ubuntu 11.10" border="0" height="253" src="http://3.bp.blogspot.com/-sqH1Bsct1IE/TbfH5yXCKqI/AAAAAAAAB-c/PHYxTkThPAo/s400/Screenshot-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Compiz desktop effects are available in
 your Ubuntu by default and if you have any kind of 3D acceleration 
available(graphics driver ie), you are good to go with Compiz.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Now to tweak Compiz desktop effects in Ubuntu, you need to install "compizconfig-settings-manager" package. &lt;a href="apt:compizconfig-settings-manager"&gt;&lt;b&gt;Click Here&lt;/b&gt;&lt;/a&gt; OR simply copy paste the following command into Terminal to install "compizconfig-settings-manager".&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo apt-get install compizconfig-settings-manager&lt;/pre&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li style="text-align: justify;"&gt;Done. Compiz Config Settings 
Manager(CCSM) is significant as far as Ubuntu 11.10 Oneiric Ocelot is 
concerned. We will get to that later on.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;

&lt;b&gt;Essential Ubuntu Unity Keyboard Shortcuts&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;Productivity can be increased significantly in new Ubuntu Unity 
desktop if you know the essential Unity keyboard and mouse shortcuts. 
Here are some of the most important among them.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;Super Key(Windows Key)&lt;/b&gt; - Opens dash.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Hold &lt;b&gt;Super Key&lt;/b&gt; - Invokes Launcher.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;Hold &lt;b&gt;Super Key&lt;/b&gt; and hit &lt;b&gt;1, 2, 3&lt;/b&gt; etc - Open an 
Application from Launcher. When you hold the Super Key, specific numbers
 will be displayed in order above each application.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt; &lt;b&gt;Alt + F1&lt;/b&gt; - Put keyboard focus on the Launcher, use arrow 
keys to navigate, Enter key launches the application, Right arrow 
exposes the quicklists if an application has them.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;&lt;b&gt;Alt + F2&lt;/b&gt; - Opens dash in special mode to run any commands.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;&lt;b&gt;Super + A&lt;/b&gt; - Opens up applications dash.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;&lt;b&gt;Super + F&lt;/b&gt; - Opens up files and folders dash.&lt;br /&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="http://www.techdrivein.com/2011/04/31-useful-ubuntu-1104-unity.html"&gt;Learn the essential Ubuntu Unity keyboard and mouse shortcuts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Enable Transparency of Unity Top Panel&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Launch CCSM. Hit &lt;i&gt;&lt;b&gt;Super + a&lt;/b&gt;&lt;/i&gt; and search for CCSM.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://2.bp.blogspot.com/-FFnzCdoiPvU/TbfHOmgEtSI/AAAAAAAAB-Y/sdNHVyyb7-g/s1600/Screenshot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Enable Transparency of Unity Top Panel" border="0" height="226" src="http://2.bp.blogspot.com/-FFnzCdoiPvU/TbfHOmgEtSI/AAAAAAAAB-Y/sdNHVyyb7-g/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;After launching CCSM, select Ubuntu Unity Plugin from 'Desktop' category. Now choose the Experimental tab from above.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://1.bp.blogspot.com/-nQitN-oKe10/TbfJ6pKet2I/AAAAAAAAB-g/j391p1C6VdI/s1600/Screenshot-2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="254" src="http://1.bp.blogspot.com/-nQitN-oKe10/TbfJ6pKet2I/AAAAAAAAB-g/j391p1C6VdI/s400/Screenshot-2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;

&lt;ul style="text-align: left;"&gt;
&lt;li&gt;There you will see the 'Panel Opacity' option. Change it to the value you like.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;b&gt;Increase/Decrease the Launcher Icon Size&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Just as before, Launch CCSM(&lt;i&gt;&lt;b&gt;Super + a&lt;/b&gt;&lt;/i&gt; and search for CCSM) and then browse to Ubuntu Unity Plugin. Choose 'Experimental' tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://3.bp.blogspot.com/--gLzhEyYj3Y/TbfLlr6IRqI/AAAAAAAAB-k/qcFKcVJcua8/s1600/Screenshot.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Increase/Decrease the Launcher Icon Size" border="0" height="255" src="http://3.bp.blogspot.com/--gLzhEyYj3Y/TbfLlr6IRqI/AAAAAAAAB-k/qcFKcVJcua8/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;

&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;Adjust the value of 'Launcher Icon 
Size' by simple scrolling. The default value of 'Launcher Icon Size' is 
48, but I like it around 40 for my laptop.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: justify;"&gt;

&lt;b&gt;Change Desktop Size&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://3.bp.blogspot.com/-q7IOCf42zIM/TpUb3CkC9tI/AAAAAAAACj8/MazgQVX23pk/s1600/unity_workspaces.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="ubuntu oneiric desktop" border="0" height="233" src="http://3.bp.blogspot.com/-q7IOCf42zIM/TpUb3CkC9tI/AAAAAAAACj8/MazgQVX23pk/s400/unity_workspaces.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;By default, Ubuntu 11.10 Oneiric Ocelot
 gives you four workspaces to play around.&amp;nbsp;Keyboard shortcut for 
activating the four workspaces is&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;b style="font-style: italic;"&gt;Super + s&lt;/b&gt;&lt;i&gt;.&lt;/i&gt;&lt;b style="font-style: italic;"&gt;&amp;nbsp;&lt;/b&gt;Now, if you want to increase/decrease that number do the following.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li style="text-align: justify;"&gt;Launch CCSM yet again, and select 
General Options from the category 'General'. Select the tab 'Desktop 
Size' and choose the values you want. Simple as that.&lt;/li&gt;
&lt;/ul&gt;
&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;b&gt;Add Your Favorite Places as Quicklists for Home Icon in Unity&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div dir="ltr" style="text-align: left;"&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://2.bp.blogspot.com/-SvxLFiyIoJc/TpSJuCkcroI/AAAAAAAACjk/p2kmOCfrj3Q/s1600/Unity_quicklists.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="quicklists ubuntu 11.10" border="0" src="http://2.bp.blogspot.com/-SvxLFiyIoJc/TpSJuCkcroI/AAAAAAAACjk/p2kmOCfrj3Q/s1600/Unity_quicklists.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;

Quicklists are something that I thought would be included as a default 
feature in Ubuntu 11.10 Oneiric Ocelot(at least some of them). But that 
didn't happen. Home Menu quicklist in my opinion, is a must have 
feature(see screenshot to know how it will look like). Follow the steps 
to add your favorite places as quicklists.&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Copy 'Home Folder' launcher file to your home directory. For that, 
you need to open Terminal(Unity Shortcut: Ctrl + Alt + T) and copy-paste
 the following commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 40px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;cp /usr/share/applications/nautilus-home.desktop ~/.local/share/applications&lt;/pre&gt;
&lt;div&gt;

&lt;ul&gt;
&lt;li&gt;Open the file in your favorite text editor. I am using Gedit here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;gedit ~/.local/share/applications/nautilus-home.desktop&lt;/pre&gt;
&lt;div&gt;

&lt;ul&gt;
&lt;li&gt;Now replace the content of the file with the following text.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 300px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;[Desktop Entry]

Name=Home Folder
Comment=Open your personal folder
TryExec=nautilus
Exec=nautilus --no-desktop
Icon=user-home
Terminal=false
StartupNotify=true
Type=Application
Categories=GNOME;GTK;Core;
OnlyShowIn=GNOME;Unity;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=nautilus
X-GNOME-Bugzilla-Component=general
X-Ubuntu-Gettext-Domain=nautilus

X-Ayatana-Desktop-Shortcuts=Videos;Documents;Music;Pictures;Downloads
[Videos Shortcut Group]
Name=Videos
Exec=nautilus Videos
TargetEnvironment=Unity


[Documents Shortcut Group]
Name=Documents
Exec=nautilus Documents
TargetEnvironment=Unity

[Music Shortcut Group]
Name=Music
Exec=nautilus Music
TargetEnvironment=Unity

[Pictures Shortcut Group]
Name=Pictures
Exec=nautilus Pictures
TargetEnvironment=Unity

[Downloads Shortcut Group]
Name=Downloads
Exec=nautilus Downloads
TargetEnvironment=Unity&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;

&lt;ul&gt;
&lt;li&gt;And restart Unity. Hit Alt + F2 and run the following command to restart Unity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;unity --replace&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Done. If that doesn't work, you might need to log out and log back in to restart Unity.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;You might want to try other &lt;a href="http://www.techdrivein.com/2011/05/top-6-quicklists-for-ubuntu-1104-natty.html"&gt;popular quicklists for Ubuntu 11.10 Unity&lt;/a&gt; as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;b&gt;Enable Unity Grab Handles&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;

This is another feature that I thought would be included as a default. 
Unity grab handles are a easy and eyecandy way of resizing windows, 
better suited for touch screen devices though.&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Launch CCSM(just search for CCSM in Unity Dash).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://1.bp.blogspot.com/-pwLGinrmetE/TgCN_fPPM_I/AAAAAAAACPA/3q3d-EiI08s/s1600/unity_grab_handles_ubuntu1104.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Howto Enable Unity Grab Handles" border="0" height="254" src="http://1.bp.blogspot.com/-pwLGinrmetE/TgCN_fPPM_I/AAAAAAAACPA/3q3d-EiI08s/s400/unity_grab_handles_ubuntu1104.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;

&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Make sure that the category &lt;i&gt;Png&lt;/i&gt;(highlighted above) is ticked.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://2.bp.blogspot.com/-Nw-T-5-or5k/TgCPKvGCByI/AAAAAAAACPE/SUHP0juBQwE/s1600/unity_grab_handles_ubuntu1104.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Howto Enable Unity Grab Handles" border="0" height="253" src="http://2.bp.blogspot.com/-Nw-T-5-or5k/TgCPKvGCByI/AAAAAAAACPE/SUHP0juBQwE/s400/unity_grab_handles_ubuntu1104.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;

&lt;ul style="text-align: left;"&gt;
&lt;li&gt;In the Uncategorized section at the bottom of CCSM, make sure that &lt;i&gt;Unity MT Grab Handles&lt;/i&gt; is ticked as well. Click on &lt;i&gt;Unity MT Grab Handles&lt;/i&gt; option now.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://2.bp.blogspot.com/-3WnhVVVUKIE/TgCU-1PjKLI/AAAAAAAACPI/yoWBa9poniE/s1600/unity_grab_handles_ubuntu1104.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Howto turn on Unity Grab Handles" border="0" height="276" src="http://2.bp.blogspot.com/-3WnhVVVUKIE/TgCU-1PjKLI/AAAAAAAACPI/yoWBa9poniE/s400/unity_grab_handles_ubuntu1104.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;You will see that the &lt;i&gt;Toggle Handles&lt;/i&gt; option is Disabled by default. Click on the &lt;i&gt;Disabled&lt;/i&gt; button and tick the resulting &lt;i&gt;Enabled&lt;/i&gt; box.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://4.bp.blogspot.com/-YaHb1xQp1cA/TgCWahD0S4I/AAAAAAAACPM/YKsigh2HAIs/s1600/unity_grab_handles.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Howto Enable Unity Grab Handles" border="0" height="276" src="http://4.bp.blogspot.com/-YaHb1xQp1cA/TgCWahD0S4I/AAAAAAAACPM/YKsigh2HAIs/s400/unity_grab_handles.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Hit Grab key combination button and select the shortcut you want. As
 you can see in the screenshot above, Control + Alt + g was my choice. 
Its up to you.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://4.bp.blogspot.com/-l5WHJSdx578/TpVZTZ7dpEI/AAAAAAAACkE/AGZnHm5Jo_Y/s1600/unity_grab_handles.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Unity Grab Handles Ubuntu" border="0" height="282" src="http://4.bp.blogspot.com/-l5WHJSdx578/TpVZTZ7dpEI/AAAAAAAACkE/AGZnHm5Jo_Y/s400/unity_grab_handles.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Done. Unity Grab Handles are enabled in Ubuntu 11.10 successfully.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Install Sysmonitor App Indicator&lt;/b&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;

Unity's top panel is locked down and it is not easy to add apps to it 
anymore. App Indicators are an excellent way to extend the functionality
 of Unity top panel in Ubuntu Oneiric. And Sysmonitor application 
indicator is one of my favorite.&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;

&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://1.bp.blogspot.com/-nRXuZDxOV84/TpVdiuNeTFI/AAAAAAAACkM/yxAO5dySGl0/s1600/sysmonitor_app_indicator_ubuntu.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="sysmonitor" border="0" src="http://1.bp.blogspot.com/-nRXuZDxOV84/TpVdiuNeTFI/AAAAAAAACkM/yxAO5dySGl0/s1600/sysmonitor_app_indicator_ubuntu.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;To install Sysmonitor Indicator in Ubuntu 11.10, you need to copy paste the following commands into Terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 60px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo add-apt-repository ppa:alexeftimie/ppa
sudo apt-get update
sudo apt-get install indicator-sysmonitor&lt;/pre&gt;
&lt;div&gt;

&lt;ul&gt;
&lt;li&gt;Done. Now, simply launch Sysmonitor Indicator from Unity dash.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.techdrivein.com/2011/05/10-useful-application-indicators-for.html"&gt;Top 10 Application Indicators for Ubuntu Unity&lt;/a&gt; if you need more.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Install GNOME Shell in Ubuntu&lt;/b&gt;&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/-mpBBt1flYrY/TpVjAo2VsCI/AAAAAAAACkU/zMBnaSmvsLk/s1600/gnome_shell_ubuntu1110.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="gnome shell in ubuntu 11.10" border="0" height="233" src="http://3.bp.blogspot.com/-mpBBt1flYrY/TpVjAo2VsCI/AAAAAAAACkU/zMBnaSmvsLk/s400/gnome_shell_ubuntu1110.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;

Installing GNOME Shell in Ubuntu is not "mission impossible" anymore. 
Ubuntu 11.10 Oneiric Ocelot is GNOME 3.0 based and installing GNOME 
Shell in Oneiric is just a click away.&lt;b&gt; &lt;/b&gt;As we noted in our earlier &lt;a href="http://www.techdrivein.com/2011/09/gnome-shell-in-ubuntu-1110-first.html"&gt;GNOME Shell in Ubuntu 11.10 review&lt;/a&gt;,
 instead of one simple GNOME interface, now you have two, each one 
unique and special in its own way. Here is how you install it. Just 
search for 'GNOME Shell' in Software Center OR do the following in 
Terminal.&lt;/div&gt;
&lt;br /&gt;
&lt;pre class="alt2" dir="ltr" style="border: 1px inset; height: 20px; margin: 0px; overflow: auto; padding: 6px; text-align: left; width: 560px;"&gt;sudo apt-get install gnome-shell&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;b&gt;Receommended read:&lt;/b&gt; &lt;a href="http://www.techdrivein.com/2011/11/8-things-i-did-after-installing-gnome.html"&gt;8 Things I did After Installing GNOME Shell in Ubuntu 11.10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;That's it for now, more Ubuntu 11.10 Unity tips and tricks and full fledged reviews are on its way. Thanks for reading.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-2402918659189375777?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/2402918659189375777/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/12/15-things-i-did-after-installing-new.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2402918659189375777?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2402918659189375777?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/12/15-things-i-did-after-installing-new.html" title="15 Things I Did After Installing New Ubuntu 11.10 Oneiric Ocelot" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-jIqPHWB3zTU/TpSCFt7RxgI/AAAAAAAACjc/qfzDwhLuqFM/s72-c/thingstodo_after_installing_ubuntu_oneric.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YASHk6fyp7ImA9WhRTEk4.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4051905476243639040</id><published>2011-11-03T00:05:00.002+11:00</published><updated>2011-11-03T00:05:49.717+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-03T00:05:49.717+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="operating system" /><title>How to update your HTC Desire to Android 2.3</title><content type="html">HTC &lt;a href="http://www.techradar.com/news/phone-and-communications/mobile-phones/htc-desire-android-2-3-update-released-for-expert-users--985999"&gt;has finally launched&lt;/a&gt; an official Desire Gingerbread update, which will update the HTC Desire to Android 2.3.3. &lt;br /&gt;
There's
 a pretty big catch, though. This is not your traditional "over the air"
 update that's all nice and easy. Instead, users have to download and 
install Android 2.3 on the HTC Desire manually. &lt;br /&gt;
Also, HTC has 
issued a lengthy disclaimer alongside the Desire 2.3.3 update, in which 
it claims this is a slightly hard thing to do and that it is "not for 
general public use" and that the company "disclaims liability" should 
anything go wrong. &lt;br /&gt;
However, don't be put off by the corporate 
speak. It's as simple as downloading everything you need, connecting 
your HTC Desire to a &lt;a class="itxtrst itxtrsta itxthook" href="http://www.techradar.com/news/phone-and-communications/mobile-phones/how-to-update-your-htc-desire-to-android-2-3-986502#" id="itxthook0" rel="nofollow" style="background-color: transparent; border-bottom: 0.075em solid darkgreen; color: darkgreen; font-size: 100%; font-weight: normal; padding-bottom: 1px; text-decoration: underline;"&gt;&lt;span class="itxtrst itxtrstspan itxthookspan" id="itxthook0w0" style="background: none repeat scroll 0% 0% transparent; color: darkgreen; font-size: inherit; font-weight: inherit;"&gt;PC&lt;/span&gt;&lt;/a&gt;
 and installing the Android update over a USB connection, with the end 
result of a completely fresh and unbranded HTC Desire running Android 
2.3.&lt;br /&gt;
But be warned - this is a phone-wiping update that will 
completely restore your HTC Desire to original factory settings and 
remove any files, message and apps on it, so if you're attached to your 
current set-up you may want to think twice about nuking it. &lt;br /&gt;
Also,
 this will effectively "debrand" your HTC Desire, so if you're a keen 
user of any network supplied apps like, ahem, Orange Maps or Vodafone's 
collection of bookmarks, you might again want to think twice about 
installing the update. &lt;br /&gt;
But if you're happy to wipe your phone in return for getting Android 2.3 on your Desire, here's how to do it.&lt;br /&gt;
&lt;strong&gt;Disclaimer:
 Future Publishing Limited provides the   information for this  project 
in good faith and makes no representations   as to its  completeness or 
accuracy. Individuals carrying out the   instructions in  this project 
do so at their own risk.&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1. Download HTC Sync&lt;/strong&gt;&lt;br /&gt;
HTC's
 updating tool requires its own HTC Sync software to be on your PC in 
order to work, so your first step should be to head off to HTC's support
 site to download and install Android 2.3 on your HTC Desire. It's free 
and will also ensure you have the required drives to enable the updater 
to connect to your phone.&lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_2-420-90.jpg" width="420" /&gt;&lt;br /&gt;
&lt;strong&gt;2. Download HTC's Gingerbread update file &lt;/strong&gt;&lt;br /&gt;
The official Android 2.3.3 file for the HTC Desire can be found on &lt;a href="http://developer.htc.com/"&gt;HTC's developer site&lt;/a&gt;.
 It's a whopping great 161MB zip file, which contains the Android update
 itself, plus copies of the two HTC Sense applications HTC has removed 
to help the new &lt;a class="itxtrst itxtrsta itxthook" href="http://www.techradar.com/news/phone-and-communications/mobile-phones/how-to-update-your-htc-desire-to-android-2-3-986502#" id="itxthook1" rel="nofollow" style="background-color: transparent; border-bottom: 0.075em solid darkgreen; color: darkgreen; font-size: 100%; font-weight: normal; padding-bottom: 1px; text-decoration: underline;"&gt;&lt;span class="itxtrst itxtrstspan itxthookspan" id="itxthook1w0" style="background: none repeat scroll 0% 0% transparent; color: darkgreen; font-size: inherit; font-weight: inherit;"&gt;OS&lt;/span&gt;&lt;/a&gt; fit on the phone, should you want to manually install them yourself after updating. &lt;br /&gt;
&lt;strong&gt;3. Connect phone to PC&lt;/strong&gt;&lt;br /&gt;
Charge
 up your Desire, as the updating tool will check you have at least 30% 
of battery life left to make sure there's no disastrous battery failure 
during the process. The SD card won't be wiped, but your SMS messages 
will be erased, so keep any you need. There are many apps on the Android
 Market to help you do this, such as the clearly named &lt;a href="https://market.android.com/details?id=com.zegoggles.smssync"&gt;SMS Backup+&lt;/a&gt;. Then connect your Desire to PC via USB. &lt;br /&gt;
And you do have all your contacts backed up via a Gmail account, yes?&lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_3-420-90.jpg" width="420" /&gt;&lt;br /&gt;
&lt;strong&gt;4. Unzip and run the updater &lt;/strong&gt;&lt;br /&gt;
HTC's
 mammoth update file contains another zip called "HTC Desire Android 2.3
 Upgrade.zip" - inside here is a file named "RUU_HTC Desire Android 2.3 
Upgrade (Gingerbread).exe" and that's the actual updater containing all 
the files it needs. &lt;br /&gt;
Unzip this file on your PC and run it. 
Providing you're all connected properly via USB, it should carry out a 
few checks, tell you to click some warnings so that if anything goes 
wrong it's all your fault, then begin the upgrade process. It takes a 
few minutes. Just be very careful not to interrupt it. &lt;br /&gt;
That's it! You've now installed Android 2.3 on your HTC Desire.&lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_4-420-90.jpg" width="420" /&gt;&lt;br /&gt;
&lt;strong&gt;5. Re-install any missing apps&lt;/strong&gt;&lt;br /&gt;
HTC
 has taken the decision to delete the Facebook app to free up initial 
space, so you need to install that via the Android Market after updating
 if your life revolves around poking people from school you hardly 
remember. &lt;br /&gt;
Also inside HTC's zip are APK files for Flashlight and 
Teeter, two HTC apps it also removed from the Desire Android 2.3 update.
 If you want these back on your phone, pull down the Notifications menu 
and connect your Desire in "Disk Drive" mode and copy the APK files onto
 the device. &lt;br /&gt;
You'll need a file manager to actually open them, so download something like &lt;a href="https://market.android.com/details?id=com.estrongs.android.pop"&gt;ES File Explorer&lt;/a&gt; from the Android Market, open it on your phone, then open the APK files to install the missing apps. &lt;br /&gt;
Or
 you can use HTC Sync on your PC, clicking the Application Installer 
option from the main screen and selecting the APKs that way. But it's 
not as much fun. &lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_1-250-100.jpg" width="250" /&gt;&lt;br /&gt;
Then
 sit back and enjoy having a marginally better telephone than before, 
even though it actually looks and feels pretty much the same as it did 
with Android 2.2 onboard. &lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_5-250-100.jpg" width="250" /&gt;&lt;br /&gt;
The
 changes are pretty much unnoticeable to the average user. There's a new
 "Fast boot" mode for quicker booting, plus the ability to turn it off 
if things break. You also have less memory available for installing 
apps, with around 120MB free after the larger OS install - a good 20MB 
less than under Android 2.2. &lt;br /&gt;
&lt;img alt="HTC desire gingerbread 2.3 update" src="http://mos.futurenet.com/techradar/classifications/Mobile%20Phones/HTC/desire2pointthree/htc_desire_23_update_6-250-100.jpg" width="250" /&gt;&lt;br /&gt;
The
 app management screen now gives you a little more detail about used and
 available memory, too. There are none of the more recent HTC Sense 
innovations here, sadly. It'll be a disappointing update for those 
expecting a completely refreshed experience, but it's still great news 
for the proper Android nerds. &lt;br /&gt;
If you've updated your Desire to Android 2.3 let us know how you got on in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4051905476243639040?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4051905476243639040/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/11/how-to-update-your-htc-desire-to.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4051905476243639040?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4051905476243639040?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/11/how-to-update-your-htc-desire-to.html" title="How to update your HTC Desire to Android 2.3" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUMGR3w7eSp7ImA9WhRTEk0.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-717654939083253496</id><published>2011-11-02T14:10:00.000+11:00</published><updated>2011-11-02T14:10:26.201+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-02T14:10:26.201+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Health" /><title>如何保持身体健康</title><content type="html">&lt;div align="left" style="background: none repeat scroll 0% 0% white; line-height: 30pt;"&gt;
&lt;span style="font-size: 14pt;"&gt;1.&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 14pt;"&gt;常吃宵夜.会得胃癌.因为胃得不到休息&lt;br /&gt;2.&amp;nbsp;一个星期只能吃四颗蛋.吃太多.对身体不好&lt;br /&gt;3.&amp;nbsp;鸡屁股含有致癌物,不要吃较好&lt;br /&gt;4.&amp;nbsp;饭后吃水果是错误的观念.应是饭前吃水果&lt;br /&gt;5.&amp;nbsp;女生月经来时.不要喝绿茶.反正茶类不要喝就对了.多吃可以补血的东西&lt;br /&gt;6.&amp;nbsp;喝豆浆时不要加鸡蛋及糖.也不要喝太多&lt;br /&gt;7.&amp;nbsp;空腹时不要吃蕃茄,最好饭后吃&lt;br /&gt;8.&amp;nbsp;早上醒来.先喝一杯水.预防结石&lt;br /&gt;9.&amp;nbsp;睡前三小时不要吃东西.会胖&lt;br /&gt;10.&amp;nbsp;少喝奶茶.因为高热量.高油.没有营养价值可言.长期饮用.易罹患高血压.糖尿病.等疾病&lt;br /&gt;11.&amp;nbsp;刚出炉的面包不宜马上食用&lt;br /&gt;12.&amp;nbsp;远离充电座.人体应远离30公分以上.切忌放在床边&lt;br /&gt;13.&amp;nbsp;天天喝水八大杯&lt;br /&gt;14.&amp;nbsp;每天十杯水.膀胱癌不会来&lt;br /&gt;15.&amp;nbsp;白天多喝水.晚上少喝水&lt;br /&gt;16.&amp;nbsp;一天不要喝两杯以上的咖啡.喝太多易导致失眠,胃痛&lt;br /&gt;17.&amp;nbsp;多油脂的食物少吃.因为得花5~7小时去消化,并使脑中血液集中到肠胃.易昏昏欲睡&lt;br /&gt;18.&amp;nbsp;下午五点后.大餐少少吃,因为五点后身体不需那么多能量&lt;br /&gt;19.&amp;nbsp;10种吃了会快乐的食物:深海鱼,香蕉,葡萄柚,全麦面包,菠菜,大蒜,南瓜,低脂牛奶,鸡肉,樱桃&lt;br /&gt;20.&amp;nbsp;睡眠不足会变笨,一天须八小时睡眠,有午睡习惯较不会老&lt;br /&gt;21.&amp;nbsp;最佳睡眠时间是在晚上10点~清晨6点&lt;br /&gt;22.&amp;nbsp;每天喝酒不要超过一杯,因为酒精会抑制制造抗体的B细胞,增加细菌感染的机会&lt;br /&gt;23.&amp;nbsp;服用胶囊应以冷水吞服(可以第一个吃),睡前30分先服药.忌立即躺下&lt;br /&gt;24.&amp;nbsp;酸梅具防止老化作用,青春永驻;肝火有毛病者宜多食用&lt;br /&gt;25.&amp;nbsp;掉发因素:熬夜,压力,烟酒,香鸡排.麻辣锅.油腻食物.味过重的料理&lt;br /&gt;26.&amp;nbsp;帮助头发生长:多食用包心菜,蛋.豆类;少吃甜食(尤其是果糖)&lt;br /&gt;27.&amp;nbsp;每天一杯柠檬汁,柳橙汁.不但可以美白还可以淡化黑斑&lt;br /&gt;28.&amp;nbsp;苹果是机车族、瘾君子、家庭主妇的常备良药，一天一颗，才能让自己有个干干净净的肺&lt;br /&gt;29.&amp;nbsp;抽烟又吃维他命(B胡萝卜素-A维他命的一种),会致癌.&lt;br /&gt;30.&amp;nbsp;女性不宜喝茶的五个时期:月经来时,孕妇,临产前.生产完后,更年期&lt;br /&gt;31.&amp;nbsp;抽烟,关系最大的是肺癌,唇癌,舌癌,喉癌,食道癌,也与膀胱癌有关&lt;br /&gt;32.&amp;nbsp;饮酒导致肝硬化.引发肝癌&lt;br /&gt;33.&amp;nbsp;吃槟榔会导致口腔纤维化,口腔癌&lt;br /&gt;34.&amp;nbsp;食物过于精细,缺乏纤维;含大量脂肪,尤其是胆固醇会引发胃癌&lt;br /&gt;35.&amp;nbsp;食物过于粗糙,营养不足时导致食道癌,胃癌&lt;br /&gt;36.&amp;nbsp;食品中的黄曲毒素.亚硝酸类物皆具有致癌性&lt;br /&gt;37.&amp;nbsp;不抽烟.拒吸二手烟&lt;br /&gt;38.&amp;nbsp;适量饮酒,不拚久.不醉酒&lt;br /&gt;39.&amp;nbsp;减少食用盐腌.烟熏,烧烤的食物&lt;br /&gt;40.&amp;nbsp;每天摄取新鲜的蔬菜与水果&lt;br /&gt;41.&amp;nbsp;每天摄取富含高纤维的五谷类及豆类&lt;br /&gt;42.&amp;nbsp;每天摄取均衡的饮食,不过量&lt;br /&gt;43.&amp;nbsp;维持理想体重.不过胖&lt;br /&gt;44.&amp;nbsp;保持规律的生活与运动&lt;br /&gt;45.&amp;nbsp;保持轻松愉快的心情&lt;br /&gt;46.&amp;nbsp;正确饮食习惯:早上吃的像皇帝,中午吃的像平民,晚上吃的像乞丐&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-717654939083253496?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/717654939083253496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/11/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/717654939083253496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/717654939083253496?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/11/blog-post.html" title="如何保持身体健康" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUMNQXc_fip7ImA9WhdaFUU.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-8100738711103110756</id><published>2011-10-26T11:04:00.002+11:00</published><updated>2011-10-26T11:04:50.946+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T11:04:50.946+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>Hibernate之事务、隔离级别、悲观锁、乐观锁</title><content type="html">&lt;div id="cnblogs_post_body"&gt;

事务需要保证原子性(Atomicity)、一致性(Consistence)、隔离性(Isolation behavior)、持续性(Durability),简称ACID。&lt;br /&gt;

原子性：一个事务内的操作要么全部成功，要么全部失败回滚。&lt;br /&gt;

一致性：事务内的数据，如果事务成功，则必须都是成功后的状态，如果失败，则必须都是最开始的状态，不能有的是成功后的状态，有的是开始的状态。&lt;br /&gt;

隔离性：在多个事务同时进行的情况下，互相不能干扰。&lt;br /&gt;

持续性：事务一旦成功，则事务成功的结果必须保存下来。&lt;br /&gt;

事务可以由声明式事务和编程式事务，声明式的事务由容器所提供的服务，可以在配置文件中定义事务边界、隔离级别等。&lt;br /&gt;

编程式事务是直接使用JDBC或者相关框架的API，以编写代码的方式，可以更细致的定义事务边界、隔离级别等。&lt;br /&gt;

&lt;br /&gt;

下面重点介绍下事务的隔离性怎么保证。&lt;br /&gt;

在数据库中保证隔离性最基本的方式就是锁定数据库，或者被更新、读取的表、列，如果数据库不锁定数据会发生的事：&lt;br /&gt;

&lt;strong&gt;1.lost update&lt;/strong&gt;&lt;br /&gt;

事务A更新某条数据&lt;br /&gt;

事务B更新某条数据&lt;br /&gt;

事务B commit&lt;br /&gt;

事务A commit&lt;br /&gt;

事务A的更新就丢失了。&lt;br /&gt;

&lt;br /&gt;

&lt;strong&gt;2.dirty read&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;

事务A更新某条数据&lt;br /&gt;

事务B读取该条数据&lt;br /&gt;

事务A commit&lt;br /&gt;

事务B commit&lt;br /&gt;

这种情况下事务B读的就是脏数据。&lt;br /&gt;

&lt;br /&gt;

&lt;strong&gt;3.unrepeatable read&lt;/strong&gt;&lt;br /&gt;

事务A读取某条数据&lt;br /&gt;

事务B更新了数据&lt;br /&gt;

事务B commit&lt;br /&gt;

事务A再次读取数据&lt;br /&gt;

这时A两次读取的结果就不一样&lt;br /&gt;

&lt;br /&gt;

&lt;strong&gt;4.phantom read&lt;/strong&gt;&lt;br /&gt;

事务A查询到了5条数据&lt;br /&gt;

事务B更新了相关联的表&lt;br /&gt;

事务B commit&lt;br /&gt;

事务A再次查询只得到了4条数据&lt;br /&gt;

这次事务A就是幻读了&lt;br /&gt;

&lt;br /&gt;

为了解决上面的4种问题，就出现了4种隔离级别，不同的数据库默认使用不同的隔离级别&lt;br /&gt;

1.read uncommit&lt;br /&gt;

当事务A更新某条数据时，不容许其他事务来更新该数据，但可以读取。&lt;br /&gt;

&lt;br /&gt;

2.read commit&lt;br /&gt;

当事务A更新某条数据时，不容许其他事务进行任何操作包括读取，但事务A读取时，其他事务可以进行读取、更新&lt;br /&gt;

&lt;br /&gt;

3.read repeatable&lt;br /&gt;

当事务A更新数据时，不容许其他事务进行任何操作，但当事务A进行读取时，其他事务只能读取，不能更新。&lt;br /&gt;

&lt;br /&gt;

4.serializable&lt;br /&gt;

最严格的隔离级别，事务必须依次进行。&lt;br /&gt;

&lt;br /&gt;

Hibernate乐观锁策略，认为很少出现同时读取、更新的情况，在数据库隔离级别一般设为read commit，会导致出现lost update的问题&lt;br /&gt;

对于lost update问题，有3种解决策略：&lt;br /&gt;

先更新为主：两个事务同时更新，但后提交的事务将抛出exception，后面的事务必须重新获取数据&lt;br /&gt;

后更新为主：后提交的事务直接覆盖先提交的。&lt;br /&gt;

合并冲突：后提交的数据会得到提示，只更新没有冲突的列&lt;br /&gt;

Hibernate推荐我们使用先更新为主，是通过version来实现的，即读取数据的时候会得到一个version值，提交时会将这个version值和数据库中的相比，如果一样则证明可以成功提交，并同时将version+1。&lt;br /&gt;

实现version可以在对象模型中加一个version属性，并在关系模型加一个version列，也可以配置让hibernate通过比较对象所有的属性来确实是否是可以更新。&lt;br /&gt;

Hibernate悲观锁策略，认为会经常出现同时读取、更新的情况；&lt;br /&gt;

&lt;small&gt;&lt;span&gt;List users1 = query.list();&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span&gt;query.setLockMode("user", LockMode.UPGRADE);&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;

hibernate通过锁定数据来避免lost update的问题。&lt;br /&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-8100738711103110756?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/8100738711103110756/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/hibernate.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8100738711103110756?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8100738711103110756?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/hibernate.html" title="Hibernate之事务、隔离级别、悲观锁、乐观锁" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ck4FQnk5fCp7ImA9WhdaEkQ.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4573483500717536674</id><published>2011-10-23T00:41:00.000+11:00</published><updated>2011-10-23T00:41:53.724+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-23T00:41:53.724+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software engineering" /><title>MyEclipse 9.1 在windows ,Linux ,MacOSX的破解,并解决myeclipse 9.1 在Linux自动退出问题</title><content type="html">myeclipse 9.x系列破解比较麻烦，但还是得感谢祖国的牛人开发出简单易用的破解工具&lt;br /&gt;
到以下地址下载jar包，如果电脑装了jdk，双击就可以运行了&lt;br /&gt;
&lt;a href="http://download.csdn.net/source/3540180"&gt;http://download.csdn.net/source/3540180&lt;/a&gt;&lt;br /&gt;
运行的显示的界面里有步骤说明&lt;br /&gt;
运行该软件请确保电脑中没有任意版本的myeclipse开启&lt;br /&gt;
安装完后，不需要启动，直接运行该jar即可。&lt;br /&gt;
原作者的方法可能不太成功，因为原作者没有打包jar，而是在myeclipse中运行，这样也许会失败。请安我的步骤:.&lt;br /&gt;
第一步：Usrcode中输入任意用户名&lt;br /&gt;
第二步：点击systemid一次，这时候会出现一行错误&lt;br /&gt;
Cannot find JNIWrapper native library (libjniwrap.so) in java.library.path:~~&lt;br /&gt;
不需要理会，再点击一次即可出现systemid。&lt;br /&gt;
第三步： 点菜单Tools-&amp;gt;RebuildKey&lt;br /&gt;
第四步：点击active按钮.会在显示区域生成&lt;br /&gt;
LICENSE_KEY&lt;br /&gt;
ACTIVATION_CODE&lt;br /&gt;
ACTIVATION_KEY&lt;br /&gt;
这时候你并不需要打开myeclipse到激活页面输入。切记。next&lt;br /&gt;
第五步：打开菜单Tools-&amp;gt;ReplaceJarFile，弹出文件选择对话框，到myeclipse的安装目录common文件夹下选择plugins文件夹&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 点击打开，程序会卡住，不要担心，正在替换文件呢！&lt;br /&gt;
一会之后，会输出信息，文件已被替换&lt;br /&gt;
第六步：点菜单Tools-&amp;gt;SaveProperites&lt;br /&gt;
OK 。打开你的myeclipse已经不需要再输入激活码什么的了。&lt;br /&gt;
以上破解工具感谢原作者&lt;a href="http://zhengyutao.iteye.com/blog/1142018"&gt;http://zhengyutao.iteye.com/blog/1142018&lt;/a&gt;提供的源码。&lt;br /&gt;
本人使用Fedora 15 系统，破解完后在输入源码的时候，打了一个“.”，然后本来是代码提示，结果myeclipse莫名的卡住&lt;br /&gt;
(myeclipse 9.0 myeclipse 9.1都有这个情况）&lt;br /&gt;
硬盘狂转一阵后，myeclipse自动退出，并且JVM在住文件夹下生成错误日志文件！&lt;br /&gt;
一开始我以为是破解问题，触发了myeclipse的完整性验证。然后装了一个虚拟机，里面跑Fedora 15，没有破解直接运行还是这样！&lt;br /&gt;
翻#墙到官网提交了bug，两天后收到回复。&lt;br /&gt;
This is a problem with eclipse on some systems. I was able to reproduce your error and managed to work around it in this way:&lt;br /&gt;
&lt;br /&gt;
Download xulrunner 1.9.1 from&amp;nbsp;&lt;a href="https://developer.mozilla.org/en/XULRunner_1.9.1_Release_Notes" style="color: #114170;" target="_blank"&gt;https://developer.mozilla.org/&lt;wbr&gt;&lt;/wbr&gt;en/XULRunner_1.9.1_Release_&lt;wbr&gt;&lt;/wbr&gt;Notes&lt;/a&gt;&amp;nbsp;and follow the instructions for installation.&lt;br /&gt;
&lt;br /&gt;
In myeclipse.ini, add this line after the -vmargs line:&lt;br /&gt;
&lt;br /&gt;
-Dorg.eclipse.swt.browser.&lt;wbr&gt;&lt;/wbr&gt;XULRunnerPath=/opt/xulrunner/&lt;wbr&gt;&lt;/wbr&gt;1.9.1&lt;br /&gt;
&lt;br /&gt;
If you installed xulrunner to a different location, change "/opt/xulrunner/1.9.1" to that location.&lt;br /&gt;
&lt;br /&gt;
Run MyEclipse.&lt;br /&gt;
安照以上方法解决，美滋滋的运行！&lt;br /&gt;
该破解文件我已在Fedora15 ,windows xp,win7中测试有效。不保证其他系统&lt;br /&gt;
有网友反应运行时找不到mainclass，症状应该是点了没反应，在命令行下运行出现错误&lt;br /&gt;
这个是因为你的jdk没有装好，建议安装较新的版本，新版本里面环境变量和类路径其实都可以不用设置&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4573483500717536674?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4573483500717536674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/myeclipse-91-windows-linux.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4573483500717536674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4573483500717536674?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/myeclipse-91-windows-linux.html" title="MyEclipse 9.1 在windows ,Linux ,MacOSX的破解,并解决myeclipse 9.1 在Linux自动退出问题" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4CQ348eip7ImA9WhdbEUk.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-705148701692500072</id><published>2011-10-09T18:05:00.002+11:00</published><updated>2011-10-09T18:06:02.072+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-09T18:06:02.072+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Miscellaneous" /><title>乔布斯留给我们的12条宝贵经验</title><content type="html">　　10月9日国际报道，许多人都表示史蒂夫·乔布斯（Steve Jobs）留下许多宝贵经验。但只有少数人亲耳聆听乔布斯的教诲，从他那里学习到第一手经验。下面就是苹果前传道士Guy Kawasaki列出的从乔布斯那里学到的12条教诲：&lt;br /&gt;

　&lt;strong&gt;　1、专家不靠谱&lt;/strong&gt;&lt;br /&gt;

　　记者、分析师、顾问、银行家和领袖等专家都无法“做好”，于是就只有“建议”了。他们能够告诉你产品出什么问题了，但却无法生产出一款伟大的产
品；他们能够告诉你如何销售，自己却不会销售；他们能够告诉你如何创建伟大的团队，自己手下却只有一名秘书。例如，上世纪80年代中期，专家告诉我们
Macintosh存在两大缺憾，不支持菊瓣字轮式打印机和Lotus 
1-2-3。专家给我们的建议是收购康柏。听听专家的建议可以，但不要总是听信他们。&lt;br /&gt;

&lt;strong&gt;　　2、客户不会告诉你他们需要什么&lt;/strong&gt;&lt;br /&gt;

　　“苹果市场研究”是一个矛盾体。苹果关注小组就是乔布斯右半脑与左半脑的对话。如果你问客户需要什么，他们会告诉你“更好、更快、更廉价”。也
就是说，客户需要的更好没有实质性变化，不是革命性的改变。他们只会根据已经使用的东西描述自己的心愿，在我们推出Macintosh之前，所有人都表示
他们希望获得一台更好、更快、更廉价的MS-DOS计算机。科技创业公司的使命就是创建你自己心仪的产品，乔布斯和沃茨就是该信条的践行者。&lt;br /&gt;

　　&lt;strong&gt;3、站得更高 看得更远&lt;/strong&gt;&lt;br /&gt;

　　超越现在就会获得更大成功。就在最好的菊瓣字轮式打印机厂商推出不同尺寸的新字体时，苹果却推出新产品：激光打印机。想想冰矿采集器、冰工厂和冷冻机公司，你还会在冬季从冰冻的池塘内采集冰块吗？&lt;br /&gt;

　&lt;strong&gt;　4、最大的挑战孕育着最好的工作&lt;/strong&gt;&lt;br /&gt;

　　我一直担忧乔布斯批评我或者我的工作一塌糊涂，这种担忧是一个巨大挑战。同IBM竞争以及后来同微软竞争都是一个巨大挑战；改变世界更是一个巨大挑战。我和我之前及之后的苹果员工都尽我们最大的努力去工作，因为我们只有尽最大努力工作才能够迎接巨大挑战。&lt;br /&gt;

　　&lt;strong&gt;5、注重设计的每一个细节&lt;/strong&gt;&lt;br /&gt;

　　乔布斯对设计细节的关注令人们为之疯狂。例如，一般人会认为黑色设计只要是黑色即可，垃圾桶只要设计成垃圾桶就行，但乔布斯是一位完美主义者，
对黑色的要求也很高，而且他总是正确的：有些人关注设计，大多数人至少在意设计。或许并非所有人都要求至善至美，但伟人却一定要至善至美。&lt;br /&gt;

　　看看乔布斯出场时的幻灯片，字体是60点，通常配有一幅巨大图片；再看看其他演讲者的幻灯片，字体为8点，也没有配图。因此，许多人表示乔布斯是世界上最伟大的产品发布人。&lt;br /&gt;

&lt;strong&gt;　　7、改变思维是你的智力标志&lt;/strong&gt;&lt;br /&gt;

　　苹果第一次推出iPhone时，应用还没有诞生。由于人们从不知道应用会为手机带来什么，乔布斯也不看好应用。直到6个月后，乔布斯才决定在手机上推出Safari Web应用。短期内，苹果Safari Web应用就取得重大进展。&lt;br /&gt;

　　&lt;strong&gt;8、“价值”不能与“价格”划等号&lt;/strong&gt;&lt;br /&gt;

　　如果你根据价格做决定，这是个悲哀；如果你完全依靠价格做决策，那将是莫大的悲哀。价格并不代表全部，至少对部分人而言，价值才是最重要的，是人们利用最佳工具愉悦身心的根本。可以说，购买苹果产品的人没有一个是冲低价来的。&lt;br /&gt;

&lt;strong&gt;　　9、棋逢对手将遇良材&lt;/strong&gt;&lt;br /&gt;

　　实际上，乔布斯笃信棋逢对手将遇良材。我对这句话的理解是，优秀的老板应该招聘更优秀的员工。一般情况下，普通老板希望招聘不如自己的员工，显示自己的优越感。如果招聘能力一般的员工，你的组织内部就会出现乔布斯所说的“笨蛋爆发”效应。&lt;br /&gt;

　　&lt;strong&gt;10、真正的CEO演示&lt;/strong&gt;&lt;br /&gt;

　　史蒂夫·乔布斯每年能够在数百万人面前演示两、三次Pod、Pad、Phone和Mac，但大多数CEO却委托其工程部副总裁演示产品。或许这
些CEO是希望展示新产品是团队的努力，更大的可能是这些CEO并不了解公司生产的产品，无法对产品作出更好的解释，真是莫大的悲哀。&lt;br /&gt;

　　&lt;strong&gt;11、真正的CEO出货&lt;/strong&gt;&lt;br /&gt;

　　乔布斯的完美主义还体现在发货上。或许苹果发布的产品并非每次都至善至美，但其产品足以出货。乔布斯不会为修补而修补，他有一个目标：产品出货，在全球现有市场上占主导地位，并开辟新市场。苹果是一家关注工程的公司，而非一家关注研究的公司。&lt;br /&gt;

&lt;strong&gt;　　12、营销的真谛是提供独特的价值&lt;/strong&gt;&lt;br /&gt;

　　我们可以用一个2x2矩阵来说明：纵轴表示产品与竞争对手的不同程度，横轴表示产品价值；右下角表示产品有价值但没有独特性——意味着你需要进
行价格竞争；左上角表示产品有独特性但没有价值——意味着你将拥有一个并不存在的市场；左下角表示产品既无独特性又无价值——意味着你是个笨蛋一无所有；
右上角表示产品既有独特性又有价值——意味着你可以盈利、获得资金和历史。例如，iPod集独特性和价值于一身，因为iPod是唯一能够从6大唱片公司轻
松下载廉价应用的合法途径。&lt;br /&gt;

　　总结：眼见为实。如果你希望站得高看得远，就不要听信专家，应该直面巨大挑战，为设计疯狂，关注独特的价值。你需要说服别人相信你的努力会有成果。并非所有人都会相信你，但这也没关系。改变世界往往是从改变少数人的思维开始，这就是乔布斯给我的教诲。 &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-705148701692500072?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/705148701692500072/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/12.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/705148701692500072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/705148701692500072?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/12.html" title="乔布斯留给我们的12条宝贵经验" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEIBRnc_cSp7ImA9WhdUGEQ.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-1966532408701322062</id><published>2011-10-06T21:14:00.000+11:00</published><updated>2011-10-06T21:22:37.949+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-06T21:22:37.949+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>遍历json获得数据的几种方法</title><content type="html">&lt;div class="gen3"&gt;
Json在Web开发的用处非常广泛，作为数据传递的载体，如何解析Json返回的数据是非常常用的。下面介绍下四种解析Json的方式：&lt;br /&gt;
Part 1&lt;br /&gt;
&lt;div class="syntaxhighlighter  jscript" id="highlighter_697477"&gt;
&lt;div class="bar                                                                                                                                        "&gt;
&lt;div class="toolbar"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;list1 = [1,3,4];&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;alert(list1[1]);&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;list2 = [{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"leamiko"&lt;/code&gt;&lt;code class="jscript plain"&gt;,&lt;/code&gt;&lt;code class="jscript string"&gt;"xing"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"lin"&lt;/code&gt;&lt;code class="jscript plain"&gt;}];&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;alert(list2[0][&lt;/code&gt;&lt;code class="jscript string"&gt;"xing"&lt;/code&gt;&lt;code class="jscript plain"&gt;])&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;alert(list2[0].xing)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
Part 2&lt;br /&gt;
&lt;div class="syntaxhighlighter  jscript" id="highlighter_30590"&gt;
&lt;div class="bar                                                                                                                                                                                                                     "&gt;
&lt;div class="toolbar"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;value = {&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"china"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"hangzhou"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"shanghai"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"chengdu"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"America"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"aa"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"bb"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"Spain"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"dd"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"ee"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"ff"&lt;/code&gt;&lt;code class="jscript plain"&gt;:{&lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;};&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt;&lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;countryObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(countryObj + &lt;/code&gt;&lt;code class="jscript string"&gt;":&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript comments"&gt;//没用的for(var cityObj in value.countryObj)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt;&lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;cityObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value[countryObj])&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(&lt;/code&gt;&lt;code class="jscript string"&gt;'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;/code&gt; &lt;code class="jscript plain"&gt;+ cityObj + &lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;);&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt;&lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;itemObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value[countryObj][cityObj])&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;27&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(&lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&lt;/code&gt;&lt;code class="jscript plain"&gt;+ itemObj + value[countryObj][cityObj][itemObj] +&lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;28&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;29&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
解释：&lt;br /&gt;
countryObj 为value对象的一个属性明，value[countryObj] 为value对象的属性值 这里为一个json对象比如b，value[countryObj][cityObj]为josn对象b的属性值 它也是一个json对象，于是 value[countryObj][cityObj]["item"]便可以取到json对象暂时成为c的值，或者 value[countryObj][cityObj].item。&lt;br /&gt;
总之分清是json还是array这是很关键的。&lt;br /&gt;
Part 3&lt;br /&gt;
&lt;div class="syntaxhighlighter  jscript" id="highlighter_367283"&gt;
&lt;div class="bar                                                                            "&gt;
&lt;div class="toolbar"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;value2 = {&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"china"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"hangzhou"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"shanghai"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"sichuan"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;],&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"America"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"aa"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"12"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"bb"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;],&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"Spain"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"cc"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"dd"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"23"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"ee"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;]&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;};&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt; &lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;countryObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value2)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(countryObj + &lt;/code&gt;&lt;code class="jscript string"&gt;":&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt; &lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;cityObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value2[countryObj])&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript comments"&gt;//可以用document.write("&amp;nbsp;&amp;nbsp;" + value2[countryObj][cityObj].item + "&amp;lt;br /&amp;gt;");&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(cityObj + &lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;nbsp;&amp;nbsp;"&lt;/code&gt; &lt;code class="jscript plain"&gt;+ value2[countryObj][cityObj][&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;] + &lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;lt;br /&amp;gt;"&lt;/code&gt; &lt;code class="jscript plain"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
解释:&lt;br /&gt;
countryObj 为value2对象的属性名，value2[countryObj] 为value2对象属性值 在本例中它是一个数组，cityObj 是数组的一个元素,它又是另外一个json对象，于是,value2[countryObj][cityObj]["name"]就访问到该对象的 name的属性值，也可以通过 value2[countryObj][cityObj].name 来访问该属性值。&lt;br /&gt;
Part 4&lt;br /&gt;
&lt;div class="syntaxhighlighter  jscript" id="highlighter_430153"&gt;
&lt;div class="lines"&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;value2 = {&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"china"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"hangzhou"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"shanghai"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"sichuan"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;],&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"America"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"aa"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"12"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"bb"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"2"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;],&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript string"&gt;"Spain"&lt;/code&gt;&lt;code class="jscript plain"&gt;:[&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"cc"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"1"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"dd"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"23"&lt;/code&gt;&lt;code class="jscript plain"&gt;},&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"ee"&lt;/code&gt;&lt;code class="jscript plain"&gt;, &lt;/code&gt;&lt;code class="jscript string"&gt;"item"&lt;/code&gt;&lt;code class="jscript plain"&gt;:&lt;/code&gt;&lt;code class="jscript string"&gt;"3"&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;]&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="jscript plain"&gt;};&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt; &lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;countryObj &lt;/code&gt;&lt;code class="jscript keyword"&gt;in&lt;/code&gt; &lt;code class="jscript plain"&gt;value2)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(countryObj + &lt;/code&gt;&lt;code class="jscript string"&gt;":&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript comments"&gt;//document.write("&amp;nbsp;&amp;nbsp;" + value2[countryObj].length);&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript keyword"&gt;for&lt;/code&gt; &lt;code class="jscript plain"&gt;(&lt;/code&gt;&lt;code class="jscript keyword"&gt;var&lt;/code&gt; &lt;code class="jscript plain"&gt;i = 0;i &amp;lt; value2[countryObj].length; i++)&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;{&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;document.write(&lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;nbsp;&amp;nbsp;"&lt;/code&gt; &lt;code class="jscript plain"&gt;+ value2[countryObj][i][&lt;/code&gt;&lt;code class="jscript string"&gt;"name"&lt;/code&gt;&lt;code class="jscript plain"&gt;] + &lt;/code&gt;&lt;code class="jscript string"&gt;"&amp;lt;br /&amp;gt;"&lt;/code&gt;&lt;code class="jscript plain"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt1"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;div class="line alt2"&gt;
&lt;table&gt;
					&lt;tbody&gt;
&lt;tr&gt;
							&lt;td class="number"&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;
							&lt;td class="content"&gt;&lt;code class="spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="jscript plain"&gt;}&lt;/code&gt;&lt;/td&gt;
						&lt;/tr&gt;
&lt;/tbody&gt;
				&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
解释：&lt;br /&gt;
countryObj value2对象的属性名，value2[countryObj] 属性值 本例中是一个数组，value2[countryObj].length 数组的长度，value2[countryObj][i]数组的项 == json对象。&lt;br /&gt;
value2[countryObj][i]["name"] 取得name的值，也可以用value2[countryObj][i].name 来取得name的值。&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-1966532408701322062?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/1966532408701322062/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/json.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/1966532408701322062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/1966532408701322062?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/json.html" title="遍历json获得数据的几种方法" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQNRnY7cSp7ImA9WhdUFkQ.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-146589356194508254</id><published>2011-10-04T14:03:00.000+11:00</published><updated>2011-10-04T14:03:17.809+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-04T14:03:17.809+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Creating a javascript object with dynamic property name</title><content type="html">&lt;span style="font-family: Verdana,Arial,Helvetica; font-size: x-small;"&gt;x=new Object();&lt;br /&gt;
propertyName="nameProperty";&lt;br /&gt;
propertyValue="John";&lt;br /&gt;
eval("x."+propertyName+"='"+propertyValue+"'");&lt;br /&gt;
alert(x.nameProperty);&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-146589356194508254?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/146589356194508254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/creating-javascript-object-with-dynamic.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/146589356194508254?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/146589356194508254?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/creating-javascript-object-with-dynamic.html" title="Creating a javascript object with dynamic property name" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYDR3k-fip7ImA9WhdUFUg.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4153795138672198384</id><published>2011-10-02T22:49:00.001+11:00</published><updated>2011-10-02T22:49:36.756+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T22:49:36.756+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>李善友：创业需要智商+情商+胆商</title><content type="html">　　9月26日，“新新创业达人”在复旦大学、北京邮电大学获得圆满成功，接下来将陆续走进上海交通大学站（27日）、华东理工大学站（28日）、
北京航空航天大学站（28日）、华中科技大学站（28日）、同济大学站（29日）、武汉大学（29日）等20所高校，来自商界的优秀企业家、投资人将随我
们一同走进高校，向有志于创业的青年传播创业理念、分享创业经历和感悟。&lt;br /&gt;

　　在本场复旦大学站，中欧创业投资中心主任、酷6网创始人&lt;a class="link_black" href="http://people.iresearch.cn/0410/6480.shtml" target="_blank"&gt;李善友&lt;/a&gt;为
广大怀揣创业梦想的莘莘学子带来了精彩演讲。他表示：创业不是一个人的事情，要用你的智商去选择一个合适的项目，要用情商去建立一个核实的团队，用胆商去
体味一个叫做创业家的精神。创业的成功是偶然的，创业的失败是必然的，无论你做了多少的准备，一个微小的事情就能够毁掉你的一切努力。&lt;br /&gt;

&lt;strong&gt;　　以下为李善友现场发言：&lt;/strong&gt;&lt;br /&gt;

　　大家好，我是李善友，善友好朋友在这给大家有礼了。&lt;br /&gt;

　　我跟接下来另外三位演讲嘉宾不太一样，他们现在还正战斗在创业的第一战线上，老李已经退出一百八十多天了，我现在已经不是创业的人士了，现在在做创业企业研究中心的兼职教授和中欧创业投资中心的主任。&lt;br /&gt;

　　今天我以一个过去创业者和现在的创业教育者的身份来和大家讲话，这也是我第一次来到复旦大学给大家做报告，感到特别荣幸，心中还是蛮起伏的。&lt;br /&gt;

&lt;strong&gt;　　失败了，什么都是狗屁；成功了，狗屁也是战略&lt;/strong&gt;&lt;br /&gt;

　　当我们讲东西的时候，我们讲出来要么是经验要么是教训。现在情况是让你讲经验和教训，并不拘泥于讲什么内容，而在于谁来讲。&lt;br /&gt;

　　我们现在这样的时代，经常会用结果来判断你错误与否，因为我经常讲这样的话，如果你创业失败了，你多么辉煌多么伟大的战略都是狗屁，如果你创业
成功了，狗屁也是战略，就是这样一个事情，所以我今天在这并不想跟大家分享我有什么样好的经验，有多大的成绩，我想跟大家分享一下，我有一些什么教训给大
家分享。&lt;br /&gt;

　　在接下来三位伟大的创业家在分享他们成功的经验之前，讲一些特别激动人心的故事之前，我在这里先说一点点苦水，讲一讲教育，我相信这对大家心态的成长也是一件好的事情。&lt;br /&gt;

&lt;strong&gt;　　在北京郊区一个农民的房子里开始创业&lt;/strong&gt;&lt;br /&gt;

　　在我演讲之前，稍微简单把我的背景学历给大家汇报一下。&lt;br /&gt;

　　我是南开毕业的，我在南开大学学的是数学，我的经历比较奇怪，做了很多比较奇怪的事，我学数学，第一份工作做的HR，我从摩托罗拉的小岗位开始做起，后来一直在搜狐做人力资源总监，当时我跟&lt;a class="link_black" href="http://people.iresearch.cn/0410/5232.shtml" target="_blank"&gt;杨宁&lt;/a&gt;也是同事，同在搜狐工作。&lt;br /&gt;

　　2001年我从搜狐人力总监转行做了搜狐的总编辑，在那之间我不懂新闻，我也不懂电脑，根本不懂&lt;a class="link_black" href="http://s.iresearch.cn/search.aspx?k=%E4%BA%92%E8%81%94%E7%BD%91" target="_blank"&gt;互联网&lt;/a&gt;，我做搜狐总编辑，我连网络&lt;a class="link_black" href="http://s.iresearch.cn/search.aspx?k=%E5%9F%9F%E5%90%8D" target="_blank"&gt;域名&lt;/a&gt;是什么都不知道，那是从一个白痴到专业人士的阶段，在搜狐做了五年的总编辑之后，第六年我从搜狐离开，开始创办自己的公司酷六网，当时在北京郊区一个农民的房子里面，开始我的创业之旅，在去年的时候我们也跟盛大旗下的公司合并上市。成为中国第一个上市的&lt;a class="link_black" href="http://s.iresearch.cn/search.aspx?k=%E8%A7%86%E9%A2%91%E7%BD%91%E7%AB%99" target="_blank"&gt;视频网站&lt;/a&gt;，今年上半年我也把自己的公司卖掉了，合并上市。&lt;br /&gt;

&lt;strong&gt;　　主动创业与被动创业，你是哪一种？&lt;/strong&gt;&lt;br /&gt;

　　最近其实创业是一个非常火爆的话题，南总刚才的演讲也可以听的到，在全国八十几所学校里边来宣讲关于创业这个话题，我想之前会有这样的情况，为
什么今年或者去年正在发生这样的情况，因为创业的的确确成为现在一个比较热闹的东西，要么你主动去创业，要么你被动去创业，大家都会走到这条路上。&lt;br /&gt;

　　什么叫主动去创业，现在创业的机会太多，过去两三年前的时候，我们说任何一家企业，什么企业你都可以做房地产，因为房地产最挣钱，现在你知道
吗，几乎每一家房地产公司都在赔钱，资金总是流向回报最大的地方，你们知道吗，现在在你头顶上有数以百亿计的美元和人民币，就在你的头上，就准备往下砸，
就看砸在谁身上了，如果说五年前的时候，人民苦于找钱，说我有好项目，苦于找不到钱，今天的形式已经发生很大的变化了，投资家在发愁这个钱怎么花出去，在
现在这个时刻，的的确确是创业的好时光。&lt;br /&gt;

　　我在PPT留的第二个理由是，我说被动地来创业，叫跑赢CPI，我们现在什么东西都很贵，鸡蛋、菜乱七八糟都很贵，当然鸡蛋贵一点，菜贵一点还
能活，最难的是房子太贵，毕业之后你总得买一个房子吧，买不了房子怎么结婚，你怎么来养活你老爹和老娘，可现在买一套房是一件多么难的事情，之前我发现了
以色列当地人们游行，游行什么呢，他们发现他们需要十年的工资才能买一套房，我在&lt;a class="link_black" href="http://s.iresearch.cn/search.aspx?k=%E5%BE%AE%E5%8D%9A" target="_blank"&gt;微博&lt;/a&gt;里讲，以色列人民心理承受能力太差了，我国人民120年赚的钱才能买一套房，我们也没有游行。可的的确确如果靠我们的工资这样来计算的话，大概真的是很难从现在改变你的生活状态，人们都想过幸福的生活，人人都想让自己的父母，自己的妻儿过上幸福的生活。&lt;br /&gt;
&lt;strong&gt;　　创业三部曲与创业家精神&lt;/strong&gt;&lt;br /&gt;

　　的的确确创业是一个很好的实现财富的事情，这都是好的方面，我们看一些成功的人，比如看杨宁好有钱，创业板上暴涨，很有钱。做创业这事之前，我们大概有三件事情要做：&lt;br /&gt;

　　第一有一个合适的项目，这是非常重要的，选择一个蓝海的项目或者在一个红海的项目里面，怎么样用一个新的方法来做这样的事。在这里面我并不是一个很好的实践者，我想一会其他几位嘉宾应该给大家讲更多一点。&lt;br /&gt;

　　我觉得第二件事情，创业其实不是一个人做的事情，你必须跟一些志同道合的人一起去做这些事，所以第二个事是选择跟你合适的创业合作伙伴一起来做这个事，这是我讲的第二。&lt;br /&gt;

　　可是这两步都准备完了之后，绝对不是创业的全部准备的过程，甚至我认为连一半都没有到，第三点更重要你一定要问自己，你有没有做好创业的心理准
备，创业这件事情，我们可以看到未来美好金钱在那等待你，但是创业这个事，我实打实跟你讲这条路不是每个人都能走的路，这里面的苦不是每个人都能吃的，所
以想问自己有没有做创业家的心理准备，就要问自己有没有创业家的这样的精神。&lt;br /&gt;

　　所以其实我跟你讲这个话题是，什么叫创业家精神，换一句话说，我们也可以自己来想一想我有没有创业家精神，我是否具备创业家精神。&lt;br /&gt;

　　今天我觉得我眼中看到复旦的同学们在这里，每一个都青春活泼的，一个个很鲜活的生命，眼睛很明亮，非常睿智，散发光芒来把很多事情来燃烧掉，这
样的气氛很好，我们大家走到今天这个课堂里面来，怀着很好的梦想，要自己创业或者加入到创业，但是以往每当有人来到我跟前说善友我想创业，你能给我一些建
议吗？&lt;br /&gt;

　　我往往跟他第一个建议是，有病吗，你为什么要创业，有病的人才会创业，创业不只是好玩，有人跟我讲，我创业之前做好充分的思想准备，以后砸锅卖
铁我都能够坚持下来，我跟你讲无论你做了多大的准备，当你真的走到那一步的时候，你会发现你真实遇到的困难会比你当时预想到的最大的困难还要高上十倍以
上，并不仅仅是钱的问题，更是一种心灵的折磨，这种感觉不是谁都能承受下来，有没有做好这样的准备。&lt;br /&gt;

　　而且我实实在在讲，我也做过统计，创业的失败是必然的，创业成功是极其偶然的。创业有一百步要走，你九十九步都走很好很好，最后一步没有走好，
你一样会失败。创业的失败是一定一定的，我们在这里看到很多成功的，很辉煌，很有名，很光鲜。但是我们没有看到他背后所承受的压力，我们更没有看到在他站
起来的同时有多少人已经趴下，我听过很多这样的事。&lt;br /&gt;

&lt;strong&gt;　　创业经历四个字：死里逃生&lt;/strong&gt;&lt;br /&gt;

　　我是2002年的时候，到这个行业里面来创业，当时号称两三百家的视频网站在这个行业里面，我是最后一个走到这个行业里面，我是用自己腰包的钱，来走向视频网站的创业，我描述我过去创业的经历，我只能跟各位讲四个字，死里逃生。&lt;br /&gt;

　　各位看到今天走过来很好的视频网站，优酷网、土豆网等等，各位有没有问到，那两三百家视频网站，他们今天在哪里，如果创业之前，只想着创业能带
来很大的财富，只想着创业能给你带来的很好很体面的生活，想着创业带来的美女、金钱等等，你没有做好艰苦的思想准备的话，告诉你不要轻易走向创业。&lt;br /&gt;

&lt;strong&gt;　　成功=努力+机遇 谁能控制你的运气？&lt;/strong&gt;&lt;br /&gt;

　　当然我讲这个话，你可能觉得老李你只不过是在抒发一些情绪而已，因为你自己做的不好，所以你在讲情绪而已，既然我现在做教授了，讲这样一些情绪
的话，的确没有意思，我是学数学的，我用数学来证明一下，创业应该具备什么样的因素，我想我们在讲话题的时候，总会来形容一些题目，比如说我们讲创业成
功，成功有很多很多的因素，他们之间非常复杂，但至少有两个因数各位应该是同意，一个是你自己的努力，第二个你所在环境的机遇，可能有很多别的方面，所以
我把成功做一个简单的数学公式，成功=努力+机遇，在这我想问各位一个问题，我想做一个调查，我请问各位，在一定的程度当中你认为你的机遇更重要，还是你
的努力更重要。认为机遇更重要的同学请举手，认为努力更重要的举手。认为努力更重要的同学寥寥无几，大多数同学认为机遇很重要，复旦大学投机分子很多
（笑）。不过，老李我也认为成功更重要的是机遇。&lt;br /&gt;

　　我们看下一张图，举个例子，我用这张图来讲，我们纵坐标图代表成功，横坐标代表时间，努力是不是也可以控制的，你说我每天工作十个小时，这是你可以做到的，所以随着时间的变化，你的努力并不会发生很大的变化，唯有把努力这条线画成一条直线，这是你基本的因素。&lt;br /&gt;

　　第二个问题，在座哪一位老师，哪一位同学，你能够控制你的机遇，谁能决定你的运气，你说我今天要一个好运气，就会有用吗。我不想要坏运气，坏运
气就走了吗，运气是你能控制的吗，我想不是的，所以我想如果我把运气这个东西花一个乱七八糟这样一条线，它并不跟随你的主观意愿一致，我这样比喻没错吧。&lt;br /&gt;

　　我说人生某一时点的成功，成功i等于这个时点的努力i，压着这个试点上机遇i，在这个时点上恰恰证明了，这句话是对的，因为在人生某一个时点，
你的努力是不变的，它对你自己完全不变化的。但是你在某一个时期的机遇是变化的，人有的时候在一个合适的场景出现在一个合适的地方，做了一件很平常的是
事，但结果你就制造了很好的机会，而有的时候就不是这样。很难解释清楚。&lt;br /&gt;

　　如果你毕业的时候正赶上经济危机，如果你2008年毕业，我觉得那一年很糟糕。为什么那年经济危机，大家被开除了找不到工作了，如果那一年你毕
业了你怎么样，你倒霉孩子。如果你活在今天，你觉得真的很幸运，你看那么多傻乎乎的钱在空中就要砸下来，不知道砸给谁，你就是幸运的，人有的时候大势对你
是很重要很重要，很难讲你的世界会怎么样。&lt;br /&gt;

　　我很欣赏&lt;a class="link_black" href="http://people.iresearch.cn/0410/5187.shtml" target="_blank"&gt;丁磊&lt;/a&gt;，
因为我是大学毕业的时候他失败，然后又重新创业，经历过失败的成功者令人尊敬，我记得他最艰难的时候，当年他在北京聘用了一个CEO，一个台湾人，CEO
跟他真的打架，打的很惨，丁磊要把自己公司卖掉，丁磊那个时候公司的现金是13亿美金，他想六千万美金把自己公司卖掉，换句话说你给我六千万美金，我给你
一亿美金还加上这个公司。好生意吧，他卖给一个香港人，第二天offer的时候，他的CEO到那边去，跟那个人说，你傻啊，你怎么能买丁磊的公司，我告诉
你他藏的好多雷，官司、乱账，最后你一个亿美金还不够你赔的，坏菜了，不能买，丁磊一怒之下，不在北京混了，人家回广州了，人家去做游戏了，结果2002
年的时候，丁磊的公司在纳斯达克一路攀升，我想如果我是丁磊的话，我会拿着很多美金到CEO面前说，兄弟谢谢你，当年没有让你们买我的公司，你说在那个时
刻如果他卖掉了，结果又是怎么样？&lt;br /&gt;
&lt;strong&gt;　　很多人一辈子没有喝到美酒，是因为他永远不肯喝苦酒&lt;/strong&gt;&lt;br /&gt;

　　人生某一时点是难讲，有的时候说人不要跟命斗，在某一个时点遇到好运气坏运气，当然好运气并不能保证你永远会有好的结果，有一个调查，说英国所
有拿彩票中奖的人，所有所有几乎最后的生活没有幸福的，机遇并不等于你有很好的生活，所以我们再看下一个话题，刚才说人生某一个时点的成功等于这个时点的
机遇，人生一辈子的成功等于什么，换句话说大家在这个公式里，前面加一个∑，∑成功=∑努力+∑机遇。&lt;br /&gt;

　　这里面有一个有趣的问题，我再问各位个问题，∑机遇等于什么，等于零。那就是命运所在，这个世界说一般来讲，没有谁一辈子永远顺风顺水，也没有
谁一辈子永远倒霉，邓小平还三上三下，没有谁永远顺风顺水，没有谁永远都那么倒霉，就你一生而言，你的好运气和你的坏运气一样的，如果好运气和坏运气一样
的，那∑机遇=0之后，人一生的成功等于什么呢？∑成功=∑努力。这是用数学来证明，我想如果这个管理项上如果设一个数学诺贝尔奖的话，那我们就有机会得
到这个奖了，这是非常有趣的，就一生而言人的成功等于你的努力。&lt;br /&gt;

　　这里面有比较重要的点，有两个点，其中有一个大家看到，那个A点代表人生最低潮的时候，B点代表人生最高潮的时候，这两个点是人生非常非常重要
的点，你是否具有创业家精神就在于你能不能从A点这个低潮走向B点，绝大多数的人是从A点这个低潮走到另外一个更低的低潮去了，只有很少的人会从这个A点
走到这个高点上去，我们来看三个数学公式，来看三种情况。&lt;br /&gt;

　　一般而言，理论∑机遇=0，这是理论上的结果，可是事实上我们生活当中，经常会发现有些人做什么，什么都不顺，有些人做什么都很好，如果做什么
都不顺，其实我们用另外一张数学公式叫∑机遇&amp;lt;；0，有没有这样的？我可以告诉各位，这种人就是当你放弃人生最低点A点的时候，你放弃那一点的坏运
气，你也随之放弃了随之而来的好运气，所以∑机遇加起来变的小于0，人生有的时候，上帝是公平的，他想让你喝他一杯美酒之前，他一定会给你一杯苦酒，你能
不能喝到美酒，取决于用什么样的心态来喝这杯苦酒，很多人一辈子没有喝到美酒，是因为他永远不肯喝苦酒，这就是∑机遇&amp;lt;；0。&lt;br /&gt;

　　我们经常听到一句话“祸不单行”讲的就是这个道理，当你遭到困难的时候，你会过不去，你会有另外一种想法出来，如果你是这样的人，你就不是创业
者。你就没有创业家的精神，如果你是第三种人，你才有可能去适合创业，什么样的人，当你遇到困难的时候，你坚持你不抛弃你战胜它。最后你等到了好运气来
到，这个时候你的∑机遇&amp;gt;；0，如果一个人无论什么时候遇到挫折，都能够持续的努力，这好运气出现的机会比别人多，有的时候我们说运气，今天跟在座
各位讲一句话，其实好运气不是运气，是能力。运气是能力，好运气是你后天的能力所在，遇到坏运气的时候，你能够挺住住，熬住，熬到运气来的时候，这就是企
业家的精神，有一句话经典的话叫“自助者天助之”，就是讲的这个数据公式。&lt;br /&gt;

&lt;strong&gt;　　面对失败：学习许三多 不抛弃不放弃&lt;/strong&gt;&lt;br /&gt;

　　我们再看下一张图，下一张图我把它定义到创业家竞争气质，就是说你能够把A带到B，如果你有能力，在你遇到低潮的时候，你团队散了，你资金没
了，别人讽刺你打击你，一个又一个打击过来，你能不能挺住，带你走到B点去，这就叫创业家气质你能不能做的到。我大概创业到一年半的时候，我数了一下，遇
到过八次生死坎，什么叫生死坎，就是你过不去就死的坎叫生死坎，不是说我遇到一个困难，我就不解决了，你不解决就是死了。资金的问题，技术的问题，团队分
裂的问题等等等等。&lt;br /&gt;

　　我举一个例子来讲，2008年我要第二轮融资，本来应该很快就能融到那个钱，突然2008年初，政府下了一个命令说只有国营企业才能做视频网
站，在那之前我已经拿到了offer，准备要给我投资了，突然出现这么一个事情，我去跟投资人解释说，没问题，在中国做事，你放心好了，我一定能想出办法
来的，我就解释给他听，然后投资人跟我说，你去让政府写一个黑纸白字说你没问题，我就投资给你。我们不可以做这样的事，所以我就拼命地去谈，好容易谈到的
时候，最后一刻没有了，这个感觉就像你拿一个筷子去夹一个红烧肉，好大一个红烧肉，拿嘴边，你想吃，最后吧嗒掉了，然后你又夹另外一个红烧肉，我这次夹的
紧一点，起来起来，又掉了。&lt;br /&gt;

　　一次两次你可以承受，三次四次呢，五次六次呢，我到了一年半以后，我再也不数我有多少生死坎了，我知道我每天都是生死坎，在我最难的时候，我恨
不得别人给我一枪说，你死了就完了，无数次半夜的时候，清醒地醒过来那是及其清醒，到客厅里面去看看书，一晚上的觉要分三次，可是你到了公司以后，你还要
精神抖擞，明明你的钱快没有了，你还开特别大的会来宣传你的实力。&lt;br /&gt;

　　所以我比较喜欢我的偶像，可能你们都不太喜欢，许三多，我特别喜欢许三多说的一句话，不抛弃，不放弃那样一种感觉。&lt;br /&gt;

　　我记得有一次他们连队比赛，不知道你们有没有看那个电视，他们连长就跟团长说，这个世界有一种人，他也没有任何的机会，他父亲也不是官，他妈妈
也不是老板，他没有任何的背景，但是他把他的救命稻草牢牢抓住，牢牢抓住，永远不放弃，永远不放弃。没有人注意他，几年后你回头看他，他已经把稻草变成参
天大树，这就是创业家的精神，从最艰苦起步，把你带到另外一点的精神。&lt;br /&gt;

&lt;strong&gt;　　坚持是人最重要的能力&lt;/strong&gt;&lt;br /&gt;

　　我以前当过人力资源总监，我们经常会写一个叫核心能力模式，我们说这个职位需要什么能力，招聘的时候按照这个能力招聘，我们备选了很多能力词
汇，我发现有一个词永远都都在，那个词叫做坚持，那个时候从来没有人会坚持自己的核心能力，今天我发现，坚持是人最重要的能力。坚持代表一种心态，坚持更
代表一种时间的挪移，很多问题今天是问题，但时间过了之后，它就不是问题。我们习惯于在今天来看那个空间，时空，但是经过挪移之后，也不一定是这样。所以
各位一定要问问自己，你有没有在以前遇到过这么大的压力，在这个压力之下，你有没有活过来的机遇，如果你想的永远是顺风顺水的，我劝你一定不要创业，先谈
个恋爱吧，等恋爱把你打击的五荤六素的时候，你再过来创业吧。&lt;br /&gt;

　　一个人的运气是公平的，如果你年轻的时候是好运气，你年长不一定好，你年轻就遭了很大的罪，你就等着吧，你未来的时光一定很辉煌，所以年轻人如果你现在日子很难过而且越来越难过，你应该很高兴，说明你这个人未来成就有多么大，这就是创业家的运气。&lt;br /&gt;

　　在创业的时候，我们就像在一个黑屋里面，我把灯全关掉，你自己也不知道光在什么地方，团队眼巴巴看着你，问题好大，你能否解决，你给自己说，那个就是方向，往那走，激励自己，往那走，跟我走，这就是创业家的精神，永远不知道未来会发生什么样的事情，这就是创业家精神。&lt;br /&gt;

　　没有哪个创业家走到今天都是很容易的走到今天的，无论他愿意不愿意给你讲他内心的苦处给你，没有人的成功是轻松得来的，不要觉得事情走到今天这
一步，创业太苦了，总是很苦闷，其实没有苦就没有甜，如果你习惯于面临每一个挑战都能够超越这个挑战，遇到一个超过一个，遇到一个超过一个以后，我告诉你
大概三两次，四五次后，超越本身就变成一种快感。&lt;br /&gt;

　　我们的老师刚才讲到，创业是一种生活方式，创业是一种思维，我有一个词是创业是一种心灵状态，在人生中你会发现如果顺风顺水的活，你会特别没有
意思，像清汤寡水一样，你就想找一些事来折腾一下，不论遇到多么大困难的时候，都是很高兴的一件事。到那个时候，你就把创业当成一种快乐，创业的乐趣有很
多很多，就像我讲的，当年我从HR转行做总监，我什么都不会，白痴一样，但我努力努力去做，最后我成功了。&lt;br /&gt;

　　我创业的时候我是一个总编辑，我不懂技术，我也没有资金，但是我努力努力，走到今天来我相信我什么都可以做，我现在去学校当教师我遇到很大困
难，举个例子，我英文很烂，可是我需要跟教授讲英文，我要看英文的paper，将来我还要用英文讲课，这对我来讲好难好难，但是我相信我一定能够克服的，
因为对一个创业家来讲，勇气比什么都重要。坚韧不拔的决心比什么都重要，而决心比智力更加重要。&lt;br /&gt;

　　所以各位同学，我今天讲了很多很残酷的话在这里边，我没有讲任何漂亮的话忽悠你来创业吧，我希望各位在创业之前，能够接受这样的心理状态，在这
样的心态状态之下，再走向你的创业之路，才有可能是成功的。所以对于创业者来讲，做好这样的的准备，就来享受创业给你带来的苦和乐。&lt;br /&gt;

　　谢谢各位。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4153795138672198384?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4153795138672198384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/10/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4153795138672198384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4153795138672198384?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/10/blog-post.html" title="李善友：创业需要智商+情商+胆商" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYBQ384eip7ImA9WhdUEUw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-3613835753942103562</id><published>2011-09-27T20:07:00.003+10:00</published><updated>2011-09-27T20:09:12.132+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-27T20:09:12.132+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Tomcat内存设置详解</title><content type="html">&lt;div class="blog_content"&gt;
最近在熟悉一个开发了有几年的项目，需要把数据库从mysql移植到oracle，首先把jdbc的连接指向mysql，打包放到tomcat里
面，可以跑起来，没有问题，可是当把jdbc连接指向oracle的时候，tomcat就连续抛java.lang.OutOfMemoryError的
错误，上网google了一下，了解了一下tomcat的运行机制，也解决了问题，share出来，以备查。 &lt;br /&gt;
&lt;br /&gt;
1、首先是：java.lang.OutOfMemoryError: Java heap space &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;解释：&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Heap size 设置 &lt;br /&gt;
&lt;br /&gt;
JVM
堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap 
size的值，其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms 
-Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。 &lt;br /&gt;
提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。 &lt;br /&gt;
提示：Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。 &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;解决方法：&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
手动设置Heap size &lt;br /&gt;
修改TOMCAT_HOME/bin/catalina.bat，在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行： &lt;br /&gt;
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m &lt;br /&gt;
&lt;br /&gt;
或修改catalina.sh &lt;br /&gt;
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行： &lt;br /&gt;
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" &lt;br /&gt;
&lt;br /&gt;
2、其次是：java.lang.OutOfMemoryError: PermGen space &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;原因：&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
PermGen
 space的全称是Permanent Generation 
space,是指内存的永久保存区域，这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen 
space中，它和存放类实例(Instance)的Heap区域不同,GC(Garbage 
Collection)不会在主程序运行期对PermGen space进行清理，所以如果你的应用中有很CLASS的话,就很可能出现PermGen 
space错误，这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 
其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;解决方法：&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
1. 手动设置MaxPermSize大小 &lt;br /&gt;
修改TOMCAT_HOME/bin/catalina.bat（Linux下为catalina.sh），在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行： &lt;br /&gt;
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m &lt;br /&gt;
&lt;br /&gt;
catalina.sh下为： &lt;br /&gt;
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
另外看到了另外一个帖子，觉得挺好，摘抄如下： &lt;a href="http://www.iteye.com/topic/80620" target="_blank"&gt;&lt;span style="color: #108ac6;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
发
现很多人把问题归因于： spring,hibernate,tomcat，因为他们动态产生类,导致JVM中的permanent heap溢出 
。然后解决方法众说纷纭，有人说升级 
tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题，在spring论坛上讨论很激烈，因为spring在AOP时使用
CBLIB会动态产生很多类。 &lt;br /&gt;
&lt;br /&gt;
但问题是为什么这些王牌的开源会出现同一个问题呢，那么是不是更基础的原因呢？tomcat在Q&amp;amp;A很隐晦的回答了这一点，我们知道这个问题，但这个问题是由一个更基础的问题产生。 &lt;br /&gt;
&lt;br /&gt;
于
是有人对更基础的JVM做了检查，发现了问题的关键。原来SUN 
的JVM把内存分了不同的区，其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就
固定了，但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制，现在的问题是动态加载类到这个区域后，gc根本没办法回收！ &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;对于以上两个问题，我的处理是： &lt;br /&gt;&lt;br /&gt;在catalina.bat的第一行增加： &lt;br /&gt;set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m &lt;br /&gt;&lt;br /&gt;在catalina.sh的第一行增加： &lt;br /&gt;JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;---------------------------------------------------------------------------------------------------------------------------------&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;PermGen space的全称是Permanent 
Generation space,是指内存的永久保存区域，经常在SUN JDK+Tomcat 
5.5.20运行服务的时候遇到这个问题，服务器跑几天后就会挂掉，并报java.lang.OutOfMemoryError: PermGen 
space异常。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 发现很多人把问题归因于： 
spring,hibernate,tomcat，因为他们动态产生类,导致JVM中的permanent heap溢出 
。然后解决方法众说纷纭，有人说升级 
tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题，在spring论坛上讨论很激烈，因为spring在AOP时使用
CBLIB会动态产生很多类。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但问题是为什么这些王牌的开源会出现同一个问题呢，那么是不是更基础的原因呢？tomcat在Q&amp;amp;A很隐晦的回答了这一点，我们知道这个问题，但这个问题由一个更基础的问题产生。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 于是有人对更基础的JVM做了检查，发现了问题的关键。原来SUN 
的JVM把内存分了不同的区，其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就
固定了，但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制，现在的问题是permsize默认只有4m，而动态加载类到这个区域
后，gc根本没办法回收，最后导致不够用的情况！这种错误常见在web服务器对JSP进行pre compile的时候。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
解决的方法手动设置MaxPermSize大小，修改TOMCAT_HOME/bin/catalina.sh，在“echo "Using 
CATALINA_BASE:&amp;nbsp;&amp;nbsp; $CATALINA_BASE"”上面加入以下行：JAVA_OPTS="-server 
-XX:PermSize=64M -XX:MaxPermSize=128m" 
，同时建议将相同的第三方jar文件移置到tomcat/shared/lib目录下，这样可以达到减少&lt;br /&gt;jar 文档重复占用内存的目的，这是治标的方法，要治本就只能就是不要用SUN的JDK，而改用BEA的JRokit。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外若遇到java.lang.OutOfMemoryError: Java heap space &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
 Heap size 设置JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap 
size的值，其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms 
-Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 
之和。提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。提示：Heap Size 
最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 解决方法：手动设置Heap size&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 修改TOMCAT_HOME/bin/catalina.sh&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在"echo "Using CATALINA_BASE:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $CATALINA_BASE"”上面加入以下行：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JAVA_OPTS="-server -Xms800m -Xmx800m&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -XX:MaxNewSize=256m"&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以下给出1G内存环境下java jvm 的参数设置参考：&lt;br /&gt;JAVA_OPTS="-server -Xms800m -Xmx800m&amp;nbsp;&amp;nbsp;&amp;nbsp; -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;Linux下测试可行的(4G内存)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: darkblue;"&gt;&lt;b&gt;JAVA_OPTS="-server -Xms2560m -Xmx2560m&amp;nbsp;&amp;nbsp;&amp;nbsp; -XX:PermSize=256M -XX:MaxNewSize=800m -XX:MaxPermSize=512m -Djava.awt.headless=true "&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-3613835753942103562?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/3613835753942103562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/09/tomcat.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/3613835753942103562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/3613835753942103562?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/09/tomcat.html" title="Tomcat内存设置详解" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYNQ3Y6fSp7ImA9WhdUFUg.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-2873845296299363706</id><published>2011-09-21T21:34:00.001+10:00</published><updated>2011-10-02T22:49:52.815+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T22:49:52.815+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>李彦宏创业七种致命武器：专注自己的领域</title><content type="html">作为2011年中国福布斯富豪榜的榜眼，&lt;a class="link_black" href="http://people.iresearch.cn/0410/5194.shtml" target="_blank"&gt;李彦宏&lt;/a&gt;数百亿的财富让人艳羡。但成功的背后靠的是艰辛的努力和独到敏锐的眼光。在李彦宏的创业经历中，有7样“致命武器”一直伴随着他，促使其茁壮成长。&lt;br /&gt;
&lt;b&gt;第一招：向前看两年&lt;/b&gt;&lt;br /&gt;
当年李彦宏在美国抛弃唾手可得的博士帽而艰苦创业的时候，美国IT界最火的是&lt;a class="link_black" href="http://ec.iresearch.cn/" target="_blank"&gt;电子商务&lt;/a&gt;。无数人拼了老命想要挤上这辆被看好的网络列车，甚至不惜抛掉自己熟悉的行业。&lt;br /&gt;
李彦宏没有跟随大流进入电子商务领域，而是悄悄走到了尚少有人问津的网络搜索领域。因为他看到了搜索对网络世界可能产生的巨大影响。&lt;br /&gt;
李彦宏告诫跃跃欲试的年轻人：一定要有向前看两年的眼光。跟风、赶潮流，你吃到的很可能只是残羹冷炙。&lt;br /&gt;
&lt;b&gt;第二招：少许诺多兑现&lt;/b&gt;&lt;br /&gt;
“这个项目多久可以完成？”“6个月。”“4个月行吗？给你加50％的报酬。”“对不起，我做不到。”&lt;br /&gt;
这是在李彦宏创业之初和一个客户的一次对话。后来，这个客户告诉他，对于李彦宏的拒绝，他感到非常满意，因为这反映出李彦宏是一个很真实和稳重的人，这样他的产品在质量上一定会有保证的。&lt;br /&gt;
&lt;b&gt;第三招：不需要钱的时候借钱&lt;/b&gt;&lt;br /&gt;
在创业过程中，“有钱走遍天下，无钱寸步难行”是颠扑不破的真理。在美国硅谷里，每天都有公司因为有了风险投资而开山立派，每天也都有公司因为囊中羞涩而关门大吉。李彦宏认为，一定要在不需要钱的时候去向投资人寻求投资。&lt;br /&gt;
用一年的时间来做半年的事情，这是李彦宏的风格。他认为，这样可以保证有一半的钱仍然在自己的掌握当中。在这样的情况下去向投资人借钱，你就会立于不败之地。因为“就算借不到，我的公司也不会马上垮掉”。&lt;br /&gt;
“不要轻易将主动权交给投资人，在创业的过程中没有人会乐善好施。”李彦宏告诫创业的青年人，“一定要在尚不缺钱的时候借到下一步需要的钱。”&lt;br /&gt;
&lt;b&gt;　　第四招：分散客户&lt;/b&gt;&lt;br /&gt;
在创业的初期，创业者常常会因为有了一两个固定的大用户而偷笑不止。“或许不久就是想哭都哭不出来埃”李彦宏这样说。&lt;br /&gt;
他刚回国创业的时候，公司主要是服务于几大门户网站。这几大网站都占据了公司收入的10％以上，任何一个客户的流失，都会对公司的效益造成极大的影响。&lt;br /&gt;
“命运只能掌握在自己手中，绝不能操纵在别人手中。”&lt;br /&gt;
&lt;b&gt;　　第五招：不要过早地追求赢利&lt;/b&gt;&lt;br /&gt;
过早地实现赢利就是在大量地缩减对技术的投入。&lt;br /&gt;
李彦宏认为，一个创新的公司，在技术上一定需要大规模的投入。这样才能使自己在技术上一直处于领先甚至于垄断的地位。&lt;br /&gt;
而这种领先在今后一定会带给企业大的回报。牺牲企业的长远利益宣布赢利，是不理智的行为。&lt;br /&gt;
&lt;b&gt;　　第六招：专注自己的领域&lt;/b&gt;&lt;br /&gt;
从1999年公司成立到现在，4年的时间里，&lt;a class="link_black" href="http://s.iresearch.cn/search.aspx?k=%E4%BA%92%E8%81%94%E7%BD%91" target="_blank"&gt;互联网&lt;/a&gt;世界沧海桑田，“&lt;a class="link_black" href="http://game.iresearch.cn/" target="_blank"&gt;网络游戏&lt;/a&gt;”“短信平台”纷纷强势登场，不少人捷足先登，赚得盆满钵满；不少人跟风而动，也摔得头破血流。而李彦宏说他只在做一件事：搜索。&lt;br /&gt;
他说不少人曾鼓动他向网络游戏、短信等领域涉足，但李彦宏并没有这样做。在他眼里，自己的公司，自己的领域还有很深的潜力可以挖掘，自己目前要做的只是将搜索这一个领域不断翻新。&lt;br /&gt;
“在今后的若干年，百度也将只在搜索领域发展。”李彦宏如是说。&lt;br /&gt;
&lt;b&gt;　　第七招：保持激情&lt;/b&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/28274498-2873845296299363706?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/2873845296299363706/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/09/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2873845296299363706?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2873845296299363706?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/09/blog-post.html" title="李彦宏创业七种致命武器：专注自己的领域" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak4HQn0_fCp7ImA9WhRSEEo.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-7204139236305468222</id><published>2011-08-03T22:18:00.003+10:00</published><updated>2011-11-12T17:22:13.344+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-12T17:22:13.344+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="finance" /><title>Glossary</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/SWOT_analysis"&gt;SWOT&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Australian_real_estate_investment_trust"&gt;A-REIT&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Official_Cash_Rate"&gt;Official cash rate&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Aggregate_demand"&gt;Aggregate demand&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.investopedia.com/terms/e/eps.asp#axzz1dSwa2oRS"&gt;EPS&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.investopedia.com/terms/d/dividend-per-share.asp#axzz1dSwa2oRS"&gt;DPS&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.investopedia.com/terms/p/price-earningsratio.asp#axzz1dSwa2oRS"&gt;PE&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-7204139236305468222?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/7204139236305468222/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/08/glossary.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/7204139236305468222?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/7204139236305468222?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/08/glossary.html" title="Glossary" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQFQns-eyp7ImA9WhdSF08.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-5388983141793566782</id><published>2011-07-27T09:50:00.001+10:00</published><updated>2011-07-27T09:51:53.553+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-27T09:51:53.553+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Car" /><title>Jump start a car</title><content type="html">1. red to dead+&lt;br /&gt;2. red to live+&lt;br /&gt;3. black to live-&lt;br /&gt;4. black to dead engine ground&lt;br /&gt;&lt;br /&gt;1. black from ground&lt;br /&gt;2. black from live-&lt;br /&gt;3. red from live+&lt;br /&gt;4. red from dead+&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-5388983141793566782?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/5388983141793566782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/07/jump-start-car.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/5388983141793566782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/5388983141793566782?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/07/jump-start-car.html" title="Jump start a car" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QCRXozeCp7ImA9WhdTEko.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-8860654631989533883</id><published>2011-07-10T14:15:00.000+10:00</published><updated>2011-07-10T14:16:04.480+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T14:16:04.480+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>郭志新：如何代理国外的产品</title><content type="html">　　&lt;strong&gt;郭志新（亚洲联盟咨询网董事长）：&lt;/strong&gt;大家好，今天这个话题，所谓人民币换成美元，来做生意。我是经常在国内、北美、 欧洲各个地方，最近我感觉有一个很大的区别，过去我们到美国去，我感觉美国什么东西都那么贵，美国吃的东西贵，消费品贵，房子也贵，结果返过来现在一看， 感觉美国什么东西都在便宜，尽管美国国内通货膨胀开始了，这里很大的原因就是人民币兑美元的差，我估计过去两年内，人民币提升了将近20%，这点其实是很 强的。&lt;br /&gt;这只是表面现象。 &lt;p&gt;　　而这里所产生的，我相信有很多的变化。但是对我们在座的人来讲，如何从商业上考虑，这时候恰恰是找到了国际上好的品牌，在国内市场进行销售，这里的机会确实值得我们探讨。&lt;/p&gt; &lt;p&gt;　　在过去的近20年时间内，我曾经在几个国际企业工作，我记得我在美国企业里工作的时候，往往我是企业内部管理者，我在全球各地找代理商，后来回 到国内以后，我们发现我的位置往往是帮助国内的企业去寻找国际品牌的代理，现在恰恰认为这是很好的时候。最近几年由于人民币兑美元的汇率上的增长国内的产 品往国外销售遇到很大困难，但是恰恰这个时候，我经营一个生意，本身也是美国的品牌，这几年特别是这两年销售非常好，当时我都不知道为什么，很大原因是因 为国际的产品在国内销售的时候，价格上逐渐有优势了。&lt;/p&gt; &lt;p&gt;　　我今天主要讲一下，当我们的组织者跟我讲，能不能分享一下如何代理好一个国际品牌产品，第二怎么能找到这个好的品牌，特别是目前的大的经济环境 下，我想在此把我个人的经验、经历跟大家做一个简单的沟通。大家知道，我们做好的品牌的代理，这里好的事情太多了，甚至我们清楚，国内很多大品牌，包括联 想这样大的品牌，之前也是在给国际某些公司做代理，而发展过程中，基本上独立成立了自己的全球性品牌。你可以这样讲，一个好的国际上优质的品牌，可以帮助 企业，不单单让你赚钱，实际上很多方面能够帮助企业进行本质上的提升。&lt;/p&gt; &lt;p&gt;　　因此我列举了一些做一个好的品牌代理的一些优势，和大家可以从中得到一些益处的东西。比如市场营销、财务管理、服务等等专业性提升，这些是必然 的。我们在做国外产品代理的时候，肯定跟它企业内部各个环节进行沟通，特别是技术。整个沟通过程中，你自己的队伍肯定有所提高。这里还包括，有些国外的公 司在中国做生意的时候，其实本身也带有一定的国际客户就在中国，甚至在中国得到独家代理权的话，他还会把客户推荐给你，所以这里有很多值得大家考虑的因 素，特别是今天这样一个高竞争环境里，如果得到一个好的品牌的代理权，如果从你的角度跟这样一个好的企业建立非常健康、互助的关系的话，我想各个方面你都 会有所提高，包括你自己及你的团队，在国际市场竞争中的运作和沟通能力都会有更大的提高。&lt;/p&gt; &lt;p&gt;　　是不是说什么产品都可以代理？这里就是我们今天真的要研究的东西。我在过去的将近8年的时间里，帮助很多，包括我的朋友，包括从我本身公司的业 务角度层面上，帮助其他的国内企业寻找或者帮助谈判过程中得到代理权。像最早的芯片代理，曾经我直接参与谈判的，比如一家美国的很强的一家企业，芯片在中 国的代理，我当时不懂这个芯片，在这种情况下，我怎么帮助中国的客户拿到代理权了呢？我至少懂得美国企业里管理沟通的形式是怎样的。这是非常典型的成功案 例。这将近是在七年以前，现在我这个客户仍旧是这个企业的代理，而且尽管这个企业后来发生很大变化，产品不断的升级，他始终随着这个企业发展，他现在已经 是非常成功的企业家了，而且在这个领域里，虽然大家不一定知道他，但他在这个领域得到了丰厚的回报。整个参与过程都是我帮助设计的，大家会问，你的朋友也 不懂芯片，为什么能拿到呢？这里有很多当时我们做的工作，包括包装我这个朋友，整个团队的包装，包括我们知道整个美国企业内部的管理情况、需求等等，但我 拿这个产品的时候不是很盲目的，在这之前我首先让这个公司、让我这位朋友做了很多细致的准备，首先我对这个公司进行了很细致的分析，到底是什么样的公司， 在美国情况怎样，在其他国家的发展怎样。我又对他的产品进行了非常细致的分析，卖点在哪里，中国的客户是谁？中国人对他的感觉怎样。如果对这样的事情不做 分析，盲目的代理一个产品，不但得不会成功，也会失去大量精力和时间。&lt;/p&gt; &lt;p&gt;　　你要知道，最开始有这样的一个考虑，我们今天不管做什么工作，特别是做生意，做别的品牌的代理，很大程度要考虑你最终可以得到什么利益。这是根 本的考虑，你要得到你想得到的，必须权衡整个各个方面的投入，这里有时间、精力、机会成本，可能是让你意想不到的，如果走错路会浪费很多资源。所以找真正 好的产品代理的时候，必须要做一些认认真真的分析，今天这样讲，想找一个代理的品牌，根本不是很难，只要有方法知道怎么找、怎么谈，肯定能拿到一个产品代 理，你要知道国际品牌也是很着急，他们压力也很大，很多公司也是上市公司，他们必须以季度、年度形式，他们业绩压力很大，急于想把产品卖出去，所以他的情 况甚至比你急，他需要找到好的销售伙伴，但你必须考虑，在这么多产品当中，哪一种产品是你真正要考虑的。所以必须从这几点上进行比较细致的分析。&lt;/p&gt; &lt;p&gt;　　我特别提到前期的销售方案策划，要知道，在销售过程中，一个产品的成功与否，前面成功的策划是最关键的，会影响到运营的方方面面。除此以外我们 要知道，当你找到一个产品的时候，必须要考虑这个产品是处于什么阶段，学MBA的人知道，任何一个产品和服务都有一个生长和覆灭的周期，四个阶段，有起 初、成长、高峰、下降阶段。特别是今天这种所谓的信息和技术变革如此之快的时候，我们这边想找到一个产品投入精力、钱、时间，我们必须要考虑到刚才的因素 还要考虑本身要干什么，你的产品已经到了成熟阶段，这时候再进去，如果时间掌握不好，可能没有多久就失败了，可能找到一个产品是下降时期的产品，最后也得 不到好的东西。&lt;/p&gt; &lt;p&gt;　　大概2001年的时候，我跟一家意大利的公司，进行接触。我也代表我的一个客户，他说我现在看到了中国有很好的机会，这是我的朋友跟我讲的，我 发现国外有很多壁挂炉，就是用煤气或者天然气来燃烧，这样能够在房间里可以供暖，就是一种单体壁挂炉，而且意大利这方面做的很好。2000年和2001年 是中国这个市场刚刚起步的时候，谈判我整个帮这个朋友谈判的，我认为得到了非常好的机会，包括人家的财政上的支持、品牌上的支持，花了大量成本和样品等 等。结果我发现我这个朋友这件事没有成功，原因是什么？第一他没有真正把这个产品吃透，没有找到真正的销售渠道，更主要的是当时恰恰是这个产品属于刚刚起 步阶段，结果这时候很困难，如果再往前努一下，可能非典前后的时候可能就会成功了，结果很快把这个事放弃了，努力了将近不到两年的时间，结果把代理权轻易 的给了另一家，卖给别人了，没想到那家公司掌握了这个机会，非常成功，几个大楼盘全卖出去了，我这个朋友再看惨了，没有把机会把握好，这时候我们要考虑 到，首先产品是在这个市场上哪个时期，如果现在做可能又是晚了。&lt;/p&gt; &lt;p&gt;　　我们要考虑到产品的周期，另外也要考虑到你在给人家做代理的时候，不单单要考虑产品，更主要的是考虑到给谁在做代理，这个公司是什么样的公司， 是上市公司？是一个中小型的加工企业？甚至到公司内部管理你这个代理公司的人如何，这些是非常重要的因素，都需要你跟他们进行接触。这里最终来讲，你要知 道，一个品牌树立是需要很长时间的，如果今天找到一个品牌，本身是一个很新的品牌，品牌的价值在很多方面没有树起来，这时候花了很多心血，结果发现母公司 本身品牌都起不来，你怎么可能有多大造诣呢？&lt;/p&gt; &lt;p&gt;　　这也很难讲，有些品牌，举个例子，大家知道一个味迁（音）拉面，我经常到日本去，我发现在日本找不到，到处都是拉面管，但在日本偏偏找不到，但 中国到处都是。所以我们选择做代理的时候，一是考虑产品本身，同时考虑给谁做代理，这个公司各个层面如何，同时跟这些公司接触的时候不是他考核你，你往往 处在被动的层面，接受他各个方面的审核，这是错的。这是平等的，只要你有足够的信心，完全是跟他平等的，彼此是要进行非常认真仔细而且有信心的跟他们交 涉，对他也同样进行考核，某些情况下，如果他选错代理，他有损失，但你把他选错了你也有巨大的损失，这一定是平等的，你以这种态度跟人家谈判的时候，外国 人是最喜欢谈判的，谈判是非常正常的，这样反而人家更信服你，而且你可以得到你的利益，也许你的产品在中国成功的可能性就会更大。&lt;/p&gt; &lt;p&gt;　　所以我几次拿到大的国际品牌代理的时候，都是去他的母国谈判，你要要求这样做，你要知道你的做法、决心甚至你的表现在他最高领导上留下的印象会对你这个代理权的拿到以及对对方公司的了解是至关重要的。有机会可以跟大家更细致的分享这些经验。&lt;/p&gt; &lt;p&gt;　　我发现国内很有意思，在看外面各式各样的带有英文感觉的品牌有些品牌说实在的，本身并不是国际品牌，都是国内一些企业在国外注册的商标，所以这些东西大家也要进行考虑，真正的国际品牌背后一定有非常强的支持你的力量这你要进行非常细致的考核。&lt;/p&gt; &lt;p&gt;　　另外跟这种公司进行接触的时候，你要考虑你跟他是什么关系，是经销他的产品还是代理他的产品，财务上各式各样的关系都要考虑。我提醒大家，如果 真正的有这种考虑，去代理一个国际品牌，特别是今天这种状况下，我们人民币在购买国际的产品方面有了很大的优势的时候，具体的如何跟大家确定关系，这是非 常重要的，你是经销商、代理商、你们之间的财务上的安排到底如何、利益点到底是什么？这里有很多具体的讲究的。&lt;/p&gt; &lt;p&gt;　　我这里跟大家提一个非常重要的一点，在某种专业的产品的代理方面，如果你能够得到专署或者独家的代理权，你一定要这样做，否则会发现你的生意会 遭到无数处的侵扰。举个例子，之前我的一个代理的产品，就不是这样的安排，是按照区域划分的，比如南区北区，发现这样的分法，销售会出现无休止的混乱，因 为你的管理销售人员，也会侵扰到别的区域，大家如果搞这种销售，肯定有很多这方面的经历，所以如果你跟国外任何一个品牌谈代理的条件的时候，这是一个非常 值得你去坚持，如果你得到独家的代理权，但认为产品是非常不错的情况下，既是你代理一个较新的品牌，但确是独家的，而且授权时间很长，值得你一搏的，而且 产品属于上升期的话，都值得你去博一把。否则跟几家不同的代理商去争是很麻烦的。&lt;/p&gt; &lt;p&gt;　　刚刚我们说了，到底代理什么产品，我们也谈到什么品牌值得你考横的方面。同时要知道，你要看看，你自己以及自己企业到底适合做什么。我们都知 道，中国有句话叫365行、行行出状元，隔行如隔山，我认为做任何代理的时候，大陆性的产品比较难了，比如说今天我代理麦当劳、肯德基，可以，没问题，但 你知道，我最近正在帮朋友申请麦当劳和肯德基代理的程序，我发现他们的条件很难，不单单难在需要很多投资的成本，一些中小城市动则几百万很正常，更重要的 是人经营的个人要有很大的投入性，至少你要去那里学习12个月，有些老板有钱，但如果不热爱的话会拿出12个月去学习么？很多时候我认为你今天要考虑的， 更加要找一些你自己认为比较擅长的，特别是跟自己企业或者专业有关的产品代理，我认为成功的胜算会大的多。这里你更应该考虑前面谈的产品如何、是否得到独 家代理或者专署代理权。当你做产品代理的时候，不能很盲目的随便来个产品就可以做了，这是不可能的，必须问你自己一些非常严肃的问题，你自己擅长么？能干 什么？认识谁？你的人脉关系如何？你的兜到底有多深有多少钱支撑这样的产品在国内的发展？这些都是诸位认真要考虑的很现实的问题。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-8860654631989533883?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/8860654631989533883/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/07/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8860654631989533883?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8860654631989533883?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/07/blog-post.html" title="郭志新：如何代理国外的产品" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEIGQ3c_fCp7ImA9WhdTEEw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4109118715276356004</id><published>2011-07-07T14:21:00.003+10:00</published><updated>2011-07-07T14:22:02.944+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T14:22:02.944+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>classifier4J学习笔记(2)－Bayes分类器</title><content type="html">1. 所有的分类器(BayesianClassifier和VectorClassifier)&lt;br /&gt;都继承自AbstractCategorizedTrainableClassifier&lt;br /&gt;&lt;br /&gt;IClassifer&lt;br /&gt;|__ICategorisedClassifier (是否给定类别)&lt;br /&gt;|__ITrainableClassifier (是否训练)&lt;br /&gt;&lt;br /&gt;2. 几个重要字段&lt;br /&gt;IWordsDataSource wordsData; //单词类别、频率等记录的存储来源&lt;br /&gt;ITokenizer tokenizer; //将文本切分成单词集合&lt;br /&gt;IStopWordProvider stopWordProvider; //stopword列表&lt;br /&gt;&lt;br /&gt;如JDBCWordsDataSource是一个基于JDBC的数据源，对应的数据库中表定义如下：&lt;br /&gt;CREATE TABLE word_probability (&lt;br /&gt;word VARCHAR(255) NOT NULL,&lt;br /&gt;category VARCHAR(20) NOT NULL,&lt;br /&gt;match_count INT DEFAULT 0 NOT NULL,&lt;br /&gt;nonmatch_count INT DEFAULT 0 NOT NULL,&lt;br /&gt;PRIMARY KEY(word, category)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;3. 几个重要方法&lt;br /&gt;3.1 classify&lt;br /&gt;//Function to determine the probability string matches a criteria for a given category&lt;br /&gt;public double classify(String category, String input) throws WordsDataSourceException {&lt;br /&gt;//首先由tokenizer将文本input切分成单词集合words&lt;br /&gt;//然后通过wordsData按照category获取单词频率&lt;br /&gt;WordProbability[] wps = calcWordsProbability(category, words);&lt;br /&gt;//计算总的概率，归一化，返回匹配值&lt;br /&gt;return normaliseSignificance(calculateOverallProbability(wps));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;calculateOverallProbability(wps)是如下计算单个wordProb的&lt;br /&gt;wordProb = matchCnt / (matchCnt + nonmatchCnt)&lt;br /&gt;而overallProb是如下计算的&lt;br /&gt;overallProb = (wordProb[0] * wordProb[1] * ......) /&lt;br /&gt;((wordProb[0] * wordProb[1] * ......) + ((1 -wordProb[0]) * (1 - wordProb[1]) * ......))&lt;br /&gt;不知道为什么这样就实现了Bayes方法:(&lt;br /&gt;&lt;br /&gt;3.2 isMatch&lt;br /&gt;//Function to determine if a string matches a criteria for a given category&lt;br /&gt;protected boolean isMatch(String category, String input) throws WordsDataSourceException {&lt;br /&gt;//sth. omitted ......&lt;br /&gt;double matchProbability = classify(category, input);&lt;br /&gt;return (matchProbability &amp;gt;= cutoff);&lt;br /&gt;//感觉就是先用classify方法获取匹配值，然后与cutoff比较以确定是否匹配&lt;br /&gt;//这里cutoff是阈值(threshold value)吗？？？&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;3.3 teachMatch&lt;br /&gt;//训练分类器，指出某个输入文本属于此类&lt;br /&gt;protected void teachMatch(String category, String input) throws WordsDataSourceException {&lt;br /&gt;//直接向wordsData添加数据&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;3.4 teachNonMatch&lt;br /&gt;//训练分类器，指出某个输入文本不属于此类&lt;br /&gt;protected void teachNonMatch(String category, String input) throws WordsDataSourceException {&lt;br /&gt;//直接向wordsData添加数据&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4109118715276356004?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4109118715276356004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/07/classifier4j2bayes.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4109118715276356004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4109118715276356004?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/07/classifier4j2bayes.html" title="classifier4J学习笔记(2)－Bayes分类器" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEIEQXg_cSp7ImA9WhdTEEw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-4842295216090421687</id><published>2011-07-07T14:21:00.002+10:00</published><updated>2011-07-07T14:21:40.649+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T14:21:40.649+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>classifier4J学习笔记(1)－文本摘要</title><content type="html">&lt;span&gt;classifier4J提供的文本摘要功能&lt;br /&gt;net.sf.classifier4J.summariser包&lt;br /&gt;&lt;br /&gt;类SimpleSummariser实现ISummariser接口的public String summarise(String input, int numSentences)&lt;br /&gt;方法，实现了简单的文本摘要功能。简单地说，它就是将词频较高的词所在的句子按其在文中的顺序抽取&lt;br /&gt;出来形成摘要，不失为一个简单可行的方法。&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @see net.sf.classifier4J.summariser.ISummariser#summarise(String input, int numSentences)&lt;br /&gt;    */&lt;br /&gt;   public String summarise(String input, int numSentences) {&lt;br /&gt;       // step 1 计算输入文章(input)的所有单词词频&lt;br /&gt;       // 使用helper类Utilities的getWordFrequency方法，包括词语拆分、提供stopword等步骤&lt;br /&gt;       // 这里String[] stopWords = { "a", "and", "the", "me", "i", "of", "if", "it", "is",&lt;br /&gt;       // "they", "there", "but", "or", "to", "this", "you", "in", "your", "on", "for", "as",&lt;br /&gt;       // "are", "that", "with", "have", "be", "at", "or", "was", "so", "out", "not", "an" };&lt;br /&gt;     &lt;br /&gt;       // get the frequency of each word in the input&lt;br /&gt;       Map wordFrequencies = Utilities.getWordFrequency(input);&lt;br /&gt;&lt;br /&gt;// step 2 获取较高频率的前100个单词集合&lt;br /&gt;       // now create a set of the X most frequent words&lt;br /&gt;       Set mostFrequentWords = getMostFrequentWords(100, wordFrequencies);&lt;br /&gt;&lt;br /&gt;// step 3 将输入切分成句子集合&lt;br /&gt;// 使用了String的split("(\\.|!|\\?)+(\\s|\\z)")&lt;br /&gt;       // break the input up into sentences&lt;br /&gt;       // workingSentences is used for the analysis, but&lt;br /&gt;       // actualSentences is used in the results so that the&lt;br /&gt;       // capitalisation will be correct.&lt;br /&gt;       String[] workingSentences = Utilities.getSentences(input.toLowerCase());&lt;br /&gt;       String[] actualSentences = Utilities.getSentences(input);&lt;br /&gt;&lt;br /&gt;// step 4 找出较高词频的前numSentences个句子&lt;br /&gt;       // iterate over the most frequent words, and add the first sentence&lt;br /&gt;       // that includes each word to the result&lt;br /&gt;       Set outputSentences = new LinkedHashSet();&lt;br /&gt;       Iterator it = mostFrequentWords.iterator();&lt;br /&gt;       while (it.hasNext()) {&lt;br /&gt;           String word = (String) it.next();&lt;br /&gt;           for (int i = 0; i &amp;lt; workingSentences.length; i++) {&lt;br /&gt;               if (workingSentences[i].indexOf(word) &amp;gt;= 0) {&lt;br /&gt;                   outputSentences.add(actualSentences[i]);&lt;br /&gt;                   break;&lt;br /&gt;               }&lt;br /&gt;               if (outputSentences.size() &amp;gt;= numSentences) {&lt;br /&gt;                   break;&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           if (outputSentences.size() &amp;gt;= numSentences) {&lt;br /&gt;               break;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;// step 5 将句子按照在文中出现的顺序重新排列&lt;br /&gt;       List reorderedOutputSentences = reorderSentences(outputSentences, input);&lt;br /&gt;&lt;br /&gt;// step 6 添加必要分隔符，形成摘要&lt;br /&gt;       StringBuffer result = new StringBuffer("");&lt;br /&gt;       it = reorderedOutputSentences.iterator();&lt;br /&gt;       while (it.hasNext()) {&lt;br /&gt;           String sentence = (String) it.next();&lt;br /&gt;           result.append(sentence);&lt;br /&gt;           result.append("."); // This isn't always correct - perhaps it should be whatever symbol the sentence finished with&lt;br /&gt;           if (it.hasNext()) {&lt;br /&gt;               result.append(" ");&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return result.toString();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;--&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-4842295216090421687?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/4842295216090421687/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/07/classifier4j1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4842295216090421687?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/4842295216090421687?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/07/classifier4j1.html" title="classifier4J学习笔记(1)－文本摘要" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQMQnY9eyp7ImA9WhdTEEw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-8489825662458856782</id><published>2011-07-07T14:19:00.001+10:00</published><updated>2011-07-07T14:19:43.863+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-07T14:19:43.863+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Document Classification using Naive Bayes</title><content type="html">&lt;p&gt;I have written earlier about &lt;a href="http://sujitpal.blogspot.com/2007/01/faceted-searching-with-lucene.html"&gt;faceted searching&lt;/a&gt;  where each facet a document exposed represented a tag that was  associated with the document. Of course, one of the most difficult  aspects of setting up such a system is the setting up of the tags  themselves. One way to build up the tag associations is to delegate it  to the creator of the document, an approach taken by sites with  user-generated content. Often, however, we have a large number of  untagged documents, which we want to present as a searchable faceted  collection. In such cases, we would have to assign the tags ourselves,  which can be quite labor-intensive if we decide to do this manually.&lt;/p&gt;  &lt;p&gt;One popular way to automatically tag documents is to use the &lt;a href="http://en.wikipedia.org/wiki/Naive_Bayes_classifier"&gt;Naive Bayes Classifier (BNC) algorithm&lt;/a&gt;.  You can read about the math in the link, but basically BNC is based on  the fact that if we know the probabilities of words appearing in a  certain category of document, given the set of words in a new document,  we can correctly predict if this new document is or is not that category  of document.&lt;/p&gt;  &lt;p&gt;I first heard of BNC from an ex-colleague who suggested the automatic tagging idea, extending what he understood about how &lt;a href="http://spamassassin.apache.org/"&gt;SpamAssasin&lt;/a&gt; email spam filter works. Shortly thereafter, I read about it in &lt;a href="http://www.ddj.com/"&gt;Dr Dobb's Journal&lt;/a&gt;. But I never had the opportunity to actually use it until now.&lt;/p&gt;  &lt;p&gt;I figured that since BNC seemed to be a useful algorithm, there would  be open source implementation available on the web. I found a &lt;a href="http://www.manageability.org/blog/stuff/open-source-probabilistic-networks-in-java"&gt;quite a few&lt;/a&gt; here. I looked through a few, but the only one I saw with halfway decent user-documentation was &lt;a href="http://classifier4j.sourceforge.net/"&gt;Classifier4J&lt;/a&gt;, so I chose that for my implementation of the automated tagger.&lt;/p&gt;  &lt;p&gt;For my test data, I chose a collection of 21 articles I had written on my &lt;a href="http://www.geocities.com/sujitpal/"&gt;website&lt;/a&gt;  years ago, and manually categorized into "Databases", "Web Development"  and "Linux". The plan was to train a Bayesian Classifier instance with  one match document from the target category and two non-match documents  from the two other categories, then make it analyze all 21 documents. My  initial implementation used the components provided in the classifier4j  distribution - SimpleWordsDataSource for the words data source, the  SimpleHTMLTokenizer for the tokenizer and the DefaultStopWordsProvider  for the stop words provider.&lt;/p&gt;  &lt;p&gt;However, the classification results were quite poor, and I wanted to  find out why. I tried to build the package from source, but the project  uses &lt;a href="http://maven.apache.org/maven-1.x"&gt;Maven 1.x&lt;/a&gt; which I  am not familiar with, and I ended up building an empty jar file. I then  tried to look at the words and their probabilities using the &lt;a href="http://www.ibm.com/developerworks/library/os-ecbug"&gt;Eclipse debugger&lt;/a&gt;,  but it did not give me any additional insights. So even though I try to  avoid recreating functionality as much as possible, I ended up  replacing most of the user-level components, depending only on  classifier4j's core classes to do the probability calculations.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Usage&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;For convenience, I created the AutoTagger class, which is called from client code as follows:&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="n"&gt;AutoTagger&lt;/span&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AutoTagger&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStopwordFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/path/to/my/stopwords.txt"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DriverManagerDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.mysql.jdbc.Driver"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;   &lt;span class="s"&gt;"jdbc:mysql://localhost:3306/classifierdb"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"user"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"pass"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addTrainingFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"database"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databaseFilesArray&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addTrainingFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"web"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;webFilesArray&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addTrainingFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"linux"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linuxFilesArray&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;train&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;autoTagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProbabilityOfFileInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"database"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;someDbFile&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The AutoTagger internally contains references to a Map of Classifier  objects keyed by category. The train() call will teach each of the  Classifier the matched words for that category as well as the  non-matches for all the other categories. The Bayesian classifier tends  to produce probabilities that are either 0.01 to indicate no match and  0.99 to indicate a match.&lt;/p&gt;  &lt;p&gt;The source for the AutoTagger class is shown below.&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;45&lt;br /&gt;46&lt;br /&gt;47&lt;br /&gt;48&lt;br /&gt;49&lt;br /&gt;50&lt;br /&gt;51&lt;br /&gt;52&lt;br /&gt;53&lt;br /&gt;54&lt;br /&gt;55&lt;br /&gt;56&lt;br /&gt;57&lt;br /&gt;58&lt;br /&gt;59&lt;br /&gt;60&lt;br /&gt;61&lt;br /&gt;62&lt;br /&gt;63&lt;br /&gt;64&lt;br /&gt;65&lt;br /&gt;66&lt;br /&gt;67&lt;br /&gt;68&lt;br /&gt;69&lt;br /&gt;70&lt;br /&gt;71&lt;br /&gt;72&lt;br /&gt;73&lt;br /&gt;74&lt;br /&gt;75&lt;br /&gt;76&lt;br /&gt;77&lt;br /&gt;78&lt;br /&gt;79&lt;br /&gt;80&lt;br /&gt;81&lt;br /&gt;82&lt;br /&gt;83&lt;br /&gt;84&lt;br /&gt;85&lt;br /&gt;86&lt;br /&gt;87&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AutoTagger&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;CLASSIFICATION_CUTOFF_PROBABILITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;stopwordFile&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;DataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;classifiers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;MultiMap&lt;/span&gt; &lt;span class="n"&gt;categoryMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MultiHashMap&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;AutoTagger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setStopwordFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;stopwordFile&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stopwordFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stopwordFile&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addTrainingFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;trainingFiles&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;trainingFile&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;trainingFiles&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;categoryMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trainingFile&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="c"&gt;// if an instance of the classifier does not exist for category, create one&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt; &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;containsKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CyberNekoHtmlTokenizer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DefaultTokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BREAK_ON_WORD_BREAKS&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileDrivenStopWordProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopwordFile&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unchecked"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClassifierException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;categoryList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;categoryList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;categoryMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;&lt;br /&gt;   &lt;span class="c"&gt;// teach the classifiers in all categories&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;categoryList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;matchCategory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;categoryList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nonmatchCategories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;categoryList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;         &lt;span class="n"&gt;nonmatchCategories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;categoryList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;       &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matchCategory&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;teachMatchFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="n"&gt;categoryMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matchCategory&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;teachMatchFile&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;teachMatchFiles&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;trainingFileName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;teachMatchFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teachMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matchCategory&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readFileToString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;teachMatchFile&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matchCategory&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nonmatchCategory&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nonmatchCategories&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;           &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teachNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonmatchCategory&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;           &lt;span class="n"&gt;FileUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readFileToString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;teachMatchFile&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;         &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonmatchCategory&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;       &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isFileInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;ClassifierException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getProbabilityOfFileInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;CLASSIFICATION_CUTOFF_PROBABILITY&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;getProbabilityOfFileInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;ClassifierException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt; &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;containsKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CyberNekoHtmlTokenizer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DefaultTokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BREAK_ON_WORD_BREAKS&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileDrivenStopWordProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopwordFile&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;BatchingBayesianClassifier&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;classifiers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unknown category:"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;classifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;classify&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readFileToString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;b&gt;JdbcWordsDataSource&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To be able to view (for debugging) the words that were being  considered for the classification process, I needed to put them in a  database. However, the provided JDBCWordsDataSource is very slow,  because it tries to do an insert/update for each word that is not a stop  word in the input document. I created a similar implementation of a  JdbcWordsDataSource that will accumulate the inserts and updates until  the entire document is read, then apply them all at once. It does the  same thing during classification, by batching up all the words and  issuing a single select call to get back all the word probability data.  This produces a much more tolerable response time for the train() call  (which is actually 3 calls, one teachMatch() and two teachNonMatch()  calls in my case), and an almost instantaneous response for the  classify() call. The code for my JdbcWordsDataSource is shown below:&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;  1&lt;br /&gt; 2&lt;br /&gt; 3&lt;br /&gt; 4&lt;br /&gt; 5&lt;br /&gt; 6&lt;br /&gt; 7&lt;br /&gt; 8&lt;br /&gt; 9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;45&lt;br /&gt;46&lt;br /&gt;47&lt;br /&gt;48&lt;br /&gt;49&lt;br /&gt;50&lt;br /&gt;51&lt;br /&gt;52&lt;br /&gt;53&lt;br /&gt;54&lt;br /&gt;55&lt;br /&gt;56&lt;br /&gt;57&lt;br /&gt;58&lt;br /&gt;59&lt;br /&gt;60&lt;br /&gt;61&lt;br /&gt;62&lt;br /&gt;63&lt;br /&gt;64&lt;br /&gt;65&lt;br /&gt;66&lt;br /&gt;67&lt;br /&gt;68&lt;br /&gt;69&lt;br /&gt;70&lt;br /&gt;71&lt;br /&gt;72&lt;br /&gt;73&lt;br /&gt;74&lt;br /&gt;75&lt;br /&gt;76&lt;br /&gt;77&lt;br /&gt;78&lt;br /&gt;79&lt;br /&gt;80&lt;br /&gt;81&lt;br /&gt;82&lt;br /&gt;83&lt;br /&gt;84&lt;br /&gt;85&lt;br /&gt;86&lt;br /&gt;87&lt;br /&gt;88&lt;br /&gt;89&lt;br /&gt;90&lt;br /&gt;91&lt;br /&gt;92&lt;br /&gt;93&lt;br /&gt;94&lt;br /&gt;95&lt;br /&gt;96&lt;br /&gt;97&lt;br /&gt;98&lt;br /&gt;99&lt;br /&gt;100&lt;br /&gt;101&lt;br /&gt;102&lt;br /&gt;103&lt;br /&gt;104&lt;br /&gt;105&lt;br /&gt;106&lt;br /&gt;107&lt;br /&gt;108&lt;br /&gt;109&lt;br /&gt;110&lt;br /&gt;111&lt;br /&gt;112&lt;br /&gt;113&lt;br /&gt;114&lt;br /&gt;115&lt;br /&gt;116&lt;br /&gt;117&lt;br /&gt;118&lt;br /&gt;119&lt;br /&gt;120&lt;br /&gt;121&lt;br /&gt;122&lt;br /&gt;123&lt;br /&gt;124&lt;br /&gt;125&lt;br /&gt;126&lt;br /&gt;127&lt;br /&gt;128&lt;br /&gt;129&lt;br /&gt;130&lt;br /&gt;131&lt;br /&gt;132&lt;br /&gt;133&lt;br /&gt;134&lt;br /&gt;135&lt;br /&gt;136&lt;br /&gt;137&lt;br /&gt;138&lt;br /&gt;139&lt;br /&gt;140&lt;br /&gt;141&lt;br /&gt;142&lt;br /&gt;143&lt;br /&gt;144&lt;br /&gt;145&lt;br /&gt;146&lt;br /&gt;147&lt;br /&gt;148&lt;br /&gt;149&lt;br /&gt;150&lt;br /&gt;151&lt;br /&gt;152&lt;br /&gt;153&lt;br /&gt;154&lt;br /&gt;155&lt;br /&gt;156&lt;br /&gt;157&lt;br /&gt;158&lt;br /&gt;159&lt;br /&gt;160&lt;br /&gt;161&lt;br /&gt;162&lt;br /&gt;163&lt;br /&gt;164&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; * A Jdbc based implementation of ICategorisedWordsDataSource that can be&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; * independently trained using files.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JdbcWordsDataSource&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;ICategorisedWordsDataSource&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;JdbcTemplate&lt;/span&gt; &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wordCountMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Transformer&lt;/span&gt; &lt;span class="n"&gt;quotingLowercasingTransformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Transformer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="nf"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"'"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lowerCase&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jdbcTemplate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;addMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ICategorisedClassifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DEFAULT_CATEGORY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;addWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;addNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ICategorisedClassifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DEFAULT_CATEGORY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;addWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;WordProbability&lt;/span&gt; &lt;span class="nf"&gt;getWordProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getWordProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ICategorisedClassifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DEFAULT_CATEGORY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unchecked"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;WordProbability&lt;/span&gt; &lt;span class="nf"&gt;getWordProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;matchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nonmatchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryForList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"select match_count, nonmatch_count "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"from word_probability "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"where word = ? and category = ?"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;matchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MATCH_COUNT"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;nonmatchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NONMATCH_COUNT"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matchCount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonmatchCount&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unchecked"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;calcWordsProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wordProbabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wordsList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"select word, match_count, nonmatch_count from word_probability where word in ("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TransformIterator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordsList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iterator&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;quotingLowercasingTransformer&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="sc"&gt;','&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;") and category=?"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryForList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"WORD"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;matchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MATCH_COUNT"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nonmatchCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NONMATCH_COUNT"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;WordProbability&lt;/span&gt; &lt;span class="n"&gt;wordProbability&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matchCount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonmatchCount&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;wordProbability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;wordProbabilities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordProbability&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wordProbabilities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toArray&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;initWordCountMap&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;flushWordCountMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isWordInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;updateWordMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;insertWordMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unchecked"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;removeDuplicateWords&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryForList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"select word, count(*) dup_count "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"from word_probability "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"group by word "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"having dup_count &amp;gt; 1"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"WORD"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"delete from word_probability where word in ("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TransformIterator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iterator&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;quotingLowercasingTransformer&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="sc"&gt;','&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;")"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;originalCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;containsKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;originalCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wordCountMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;originalCount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * Return true if the word is found in the category.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param category the category to look up &lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param word the word to look up.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @return true or false&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   */&lt;/span&gt;&lt;br /&gt; &lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unchecked"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isWordInCategory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryForList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;     &lt;span class="s"&gt;"select word from word_probability where category = ? and word = ?"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param category the category to update.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param word the word to update.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param isMatch if true, the word is a match for the category.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   */&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updateWordMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;       &lt;span class="s"&gt;"update word_probability set match_count = match_count + ? "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;       &lt;span class="s"&gt;"where category = ? and word = ?"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;       &lt;span class="s"&gt;"update word_probability set nonmatch_count = nonmatch_count + ? "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;       &lt;span class="s"&gt;"where category = ? and word = ?"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param category the category to insert.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param word the word to update.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @param isMatch if true, the word is a match for the category.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   */&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;insertWordMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"insert into word_probability("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;       &lt;span class="s"&gt;"category, word, match_count, nonmatch_count) values (?, ?, ?, 0)"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;jdbcTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"insert into word_probability("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;br /&gt;         &lt;span class="s"&gt;"category, word, match_count, nonmatch_count) values (?, ?, 0, ?)"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;         &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The JdbcWordsDataSource decouples the word accumulation and  persistence into two separate methods, which need to be called by the  classifier. The accumulation is all done in memory, and a  flushWordCountMap() will actually persist the map into the database.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;BatchingBayesianClassifier&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In order to use the batching capability, I needed to create a  subclass of BayesianClassifier that would only take this particular  implementation, and override the database dependent methods in the  parent. The BatchingBayesianClassifier is shown below:&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;43&lt;br /&gt;44&lt;br /&gt;45&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; * Batches words for performance against the JdbcWordsDataSource. This is &lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; * specific to this application's needs, so the constructor forces the caller&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; * to provide specific implementations of the super-class's ctor args.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BatchingBayesianClassifier&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;BayesianClassifier&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;BatchingBayesianClassifier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt; &lt;span class="n"&gt;wordsDataSource&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;CyberNekoHtmlTokenizer&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileDrivenStopWordProvider&lt;/span&gt; &lt;span class="n"&gt;stopwordsProvider&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordsDataSource&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stopwordsProvider&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;classify&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMatchCutoff&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nonStopwords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;FileDrivenStopWordProvider&lt;/span&gt; &lt;span class="n"&gt;stopwordsProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileDrivenStopWordProvider&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStopWordProvider&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopwordsProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isStopWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;nonStopwords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt; &lt;span class="n"&gt;wds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;WordProbability&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;wordProbabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcWordsProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonStopwords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toArray&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]));&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;normaliseSignificance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calculateOverallProbability&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordProbabilities&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;teachMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt; &lt;span class="n"&gt;wds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initWordCountMap&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teachMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flushWordCountMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;teachNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;WordsDataSourceException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt; &lt;span class="n"&gt;wds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JdbcWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWordsDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initWordCountMap&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teachNonMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="n"&gt;wds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flushWordCountMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;b&gt;CyberNekoHtmlTokenizer&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I also created my own implementation of the HTML Tokenizer using the &lt;a href="http://www.apache.org/%7Eandyc/neko/doc/html"&gt;NekoHTML parser&lt;/a&gt;  from Cyberneko. This was because the SimpleHtmlTokenizer was crashing  with the (admittedly bad and nowhere near spec-compliant) HTML in the  documents. Cyberneko's NekoHTML parser is more forgiving, and I was able  to pull out the body of my HTML document with the following  implementation:&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CyberNekoHtmlTokenizer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;DefaultTokenizer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CyberNekoHtmlTokenizer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CyberNekoHtmlTokenizer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tokenizerConfig&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenizerConfig&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="c"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * Uses the Cyberneko HTML parser to parse out the body content from the&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * HTML file as a stream of text.&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   * @see net.sf.classifier4J.ITokenizer#tokenize(java.lang.String)&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;   */&lt;/span&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tokenize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getBody&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;DOMParser&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DOMParser&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;InputSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ByteArrayInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;())));&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDocument&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;NodeList&lt;/span&gt; &lt;span class="n"&gt;bodyTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BODY"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bodyTags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLength&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No body tag in this HTML document"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;bodyTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bodyTags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bodyTag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTextContent&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTML Parsing failed on this document"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;b&gt;FileDrivenStopWordProvider&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The DefaultStopWordProvider contained a hard coded array of stop  words, which was pretty basic, so I built one to work off a file (the  contents of which I scraped from the classifier4j message board, btw),  which also treats numbers as stopwords. The code for the  FileDrivenStopWordProvider is shown below:&lt;/p&gt;  &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileDrivenStopWordProvider&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;IStopWordProvider&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;SortedSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TreeSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FileDrivenStopWordProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;stopWordFile&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;br /&gt;         &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopWordFile&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;       &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lowerCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;&lt;br /&gt;     &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileNotFoundException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"File:"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;stopWordFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" does not exist"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error reading file:"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;stopWordFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isStopWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lowerCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNumeric&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;b&gt;Results&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I ran the AutoTagger in two scenarios. The first was with low  training, where I took the first file that was created in each category,  and trained the classifiers with them, then ran the rest of the files  against the trained classifiers. The assumption was that I knew what I  was doing when classifying the first article, rather than attempt to  shoehorn an article into an existing category set. The results from the  run is shown below. The rows in gray indicate the files which were used  for training.&lt;/p&gt;  &lt;table border="1" cellpadding="0" cellspacing="0" width="100%"&gt;   &lt;tbody&gt;&lt;tr&gt;     &lt;td&gt;&lt;b&gt;File name&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;Orig. class&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(database)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(web)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(linux)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;Tags&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb001&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb002&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb003&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb005&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb006&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb007&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb001&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb002&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb003&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb004&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb005&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb006&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb007&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli001&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli002&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli003&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli004&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli005&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli006&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli007&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli008&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;As you can see, the results are not too great. Almost none of the  documents besides the ones used for training were matched. This could be  because of the paucity of training data. To rectify the situation, I  created a high training scenario, where all but one of the files in each  category is used for the training, then the trained classifiers are let  loose on that one remaining file to see what category it is. The  results for this test is shown below:&lt;/p&gt;  &lt;table border="1" cellpadding="0" cellspacing="0" width="100%"&gt;   &lt;tbody&gt;&lt;tr&gt;     &lt;td&gt;&lt;b&gt;File name&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;Orig. class&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(database)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(web)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;P(linux)&lt;/b&gt;&lt;/td&gt;     &lt;td&gt;&lt;b&gt;Tags&lt;/b&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb001&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb002&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb003&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb005&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artdb006&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database, web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artdb007&lt;/td&gt;     &lt;td&gt;database&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb001&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb002&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb003&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb004&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb005&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artwb006&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artwb007&lt;/td&gt;     &lt;td&gt;web&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;database, web&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;artli001&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli002&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli003&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;(none)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli004&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;database, web, linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli005&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli006&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli007&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt;   &lt;tr bgcolor="gray"&gt;     &lt;td&gt;artli008&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.01&lt;/td&gt;     &lt;td&gt;0.99&lt;/td&gt;     &lt;td&gt;linux&lt;/td&gt;   &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;The results are better than the first one, but it still misses a few.  A surprising finding is that it finds that some articles can belong to  multiple categories. Not so surprising, if you think that its the same  person writing all three types, so a web article could involve a  database, or a linux article could describe a database or webserver  installation.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The BNC algorithm probably works best when there is much more  training data available than what I provided it, and where the documents  are more stratified, for example, politics versus technology, so there  is less chance of overlapping words in each category. In my case, it  does detect some things, but the results can probably be improved by  providing more training data or pruning the words in the database after  the training is complete and before classification is done.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-8489825662458856782?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/8489825662458856782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/07/document-classification-using-naive.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8489825662458856782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8489825662458856782?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/07/document-classification-using-naive.html" title="Document Classification using Naive Bayes" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkAERnYzcSp7ImA9WhZaEk8.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-7766204985938721213</id><published>2011-06-28T11:31:00.001+10:00</published><updated>2011-06-28T11:31:47.889+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T11:31:47.889+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Photography" /><title>定焦与变焦镜头对比</title><content type="html">变焦镜头&lt;br /&gt;&lt;br /&gt;1. 变焦镜头允许摄影师选择不同的焦距，从广角到长焦；&lt;br /&gt;&lt;br /&gt;2. 变焦镜头允许摄影师不用移动就可接近拍摄对象；&lt;br /&gt;&lt;br /&gt;3. 变焦镜头提供更多的拍摄机会，因为无需更换镜头；&lt;br /&gt;&lt;br /&gt;4. 无需更换镜头减少了相机进灰的机会。&lt;br /&gt;&lt;br /&gt;刚刚进入市场时的变焦镜头都很重，而且画质无法与定焦镜头相提并论。随着设计水平的提高，目前变焦镜头的画质已有极大地提升，但对变焦比较大的镜头来说画质损失仍然是不可避免的。&lt;br /&gt;&lt;br /&gt;今天的职业摄影师，通常都拥有多支大光圈的定焦镜头，包括：广角镜头（20-28mm），50mm标准镜头，人像镜头（80-105mm），及可以拍特写或头肩照或拍摄体育和野生动物题材的长焦镜头（180-200mm）。&lt;br /&gt;&lt;br /&gt;那么为什么他们会选择这么多镜头，而不是1、2支能涵盖这些焦距的变焦镜头呢？&lt;br /&gt;&lt;br /&gt;因为有一些照片是无法用变焦镜头拍摄的。&lt;br /&gt;&lt;br /&gt;1. 定焦镜头拥有更大的光圈。大光圈可以控制照片的景深，通过景深摄影师可以引导观众的视线注意照片上最重要的东西。在人像摄影中，将模特与背景分离开是非常重要的。如果你注意到杂志上的广告，就能看到很多这种效果。&lt;br /&gt;&lt;br /&gt;2. 大光圈的额外好处是可以降低感光度，以减少照片噪点。&lt;br /&gt;&lt;br /&gt;3. 多数定焦镜头拥有景深标尺，可以方便地读出目前的景深范围和焦点距离。对需要严格控制景深的拍摄来说这非常有用。&lt;br /&gt;&lt;br /&gt;4. 定焦镜头的大光圈令自动对焦更快更准确。有多少次你的变焦镜头会来回“拉风箱”寻找焦点？因为它们的最大光圈不够大，进光量不够多。&lt;br /&gt;&lt;br /&gt;5. 相同焦距下，定焦镜头更锐利，而且最近对焦距离更短。&lt;br /&gt;&lt;br /&gt;6. 定焦镜头只提供一种视角，这是一个很好的练习机会。通过大量练习摄影师就能掌握每种焦距的优势和限制是什么。变焦镜头会令摄影师变懒，不愿意移动自己来获得更好的拍摄位置。&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/28274498-7766204985938721213?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/7766204985938721213/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/06/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/7766204985938721213?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/7766204985938721213?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/06/blog-post.html" title="定焦与变焦镜头对比" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cCRXY6fyp7ImA9WhZaEkw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-8260146915784616136</id><published>2011-06-28T09:47:00.002+10:00</published><updated>2011-06-28T09:57:44.817+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T09:57:44.817+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Photography" /><title>自由搭配 尼康D7000原厂镜头配镜指南</title><content type="html">&lt;p style="text-indent: 2em;"&gt;尼康最新单反相机D7000的出现，让尼康家族有了新的战斗力，同时也让尼康用户有了更多可选择的余地。作为&lt;a href="http://datalib.digi.qq.com/dc_model/3057/index.shtml" target="_blank" class="a-tips-Article-QQ"&gt;尼康D90&lt;/a&gt;的后继产品，D7000的升级幅度较大，整体设定更偏向中端单反，因此，镜头的搭配也与尼康D90稍有不同一些，在对一些高端镜头的支持上表现更好。今天的导购，我们分广角、定焦、长焦三种镜头类别，推荐合适&lt;a href="http://datalib.digi.tech.qq.com/dc_model/3638/index.shtml" target="_blank" class="a-tips-Article-QQ"&gt;尼康D7000&lt;/a&gt;的镜头。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;尼康D7000介绍&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康D7000作为新一代的中端单反相机，有着从内而外的进步，外至金属机身，内置39点自动对焦系统，无一不体现D7000大跨步的升级幅度。另外，新传感器的使用，让这款单反相机有了更高像素与更高画质的表现。&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/12/28/665/43248777.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 D7000&lt;/p&gt;&lt;p class="pictext" style="text-indent: 2em; text-align: left;"&gt;尽管尼康D7000机身外形及尺寸与D90极为类似，但升级后的1620万像素传感器，39点自动对焦系统，全高清视频拍摄功能，以及具有中级单反的象征——金属机身都使得尼康D7000的定位更偏向于&lt;a href="http://datalib.digi.qq.com/dc_model/3153/index.shtml" target="_blank" class="a-tips-Article-QQ"&gt;尼康D300S&lt;/a&gt;，专业性更强。&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/11/28/665/43248776.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康D7000&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康此次推出的中端单反相机定位的改变正好与&lt;a href="http://datalib.digi.tech.qq.com/dc_model/3604/index.shtml" target="_blank" class="a-tips-Article-QQ"&gt;佳能60D&lt;/a&gt;的定位相反，这也使得在与佳能同级产品的竞争当中更加有底气了，更为专业性的设定偏向，也让更多用户可以使用尼康D7000完成更多特殊要求的拍摄。&lt;/p&gt;&lt;table style="font-size: 12px; border-collapse: collapse;" align="center" border="1" cellpadding="5" cellspacing="0" width="550"&gt;&lt;tbody&gt;&lt;tr bgcolor="#d6ebff"&gt;&lt;td colspan="6" align="middle" bgcolor="#0476b3"&gt;&lt;p align="center"&gt;&lt;strong&gt;尼康D7000优缺点总结&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="middle" width="275"&gt;&lt;p align="center"&gt;优点&lt;/p&gt;&lt;/td&gt;&lt;td align="middle" width="275"&gt;&lt;p align="center"&gt;缺点&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" valign="top" width="275"&gt;1、画质、高感光有优势2、39点自动对焦系统3、金属机身4、6张/秒连拍5、双SD卡槽6、1080p全高清视频拍摄，带追焦功能&lt;/td&gt;&lt;td align="left" valign="top" width="275"&gt;1、上市价格贵2、部分功能操作较前代繁琐3、对焦速度不麻利&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼康D7000是一款性能出众的中低端单反相机，相对以往的同级产品来说，专业性以及可扩展性更强，因此，为其在镜头上花费更多一些也是值得的。尼康D7000高覆盖率的对焦系统以及出色的动态拍摄功能，让尼康D7000在选择镜头方面有了新想法的注入。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;尼康广角变焦镜头&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康相比较佳能，高级镜头以外的选择更广一些，源于尼康对中低端级别的镜头比佳能更重视一些。有不少成像、做工都很不错的镜头。与此同时，为大力发展DX画幅单反相机，推出了不少DX规格的非全画幅单反镜头，为尼康D7000这样的准专业单反相机提供了丰富的选择。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S DX 16-85mm F3.5-5.6G ED VR&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：5180元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/8/28/665/43248773.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S DX 16-85mm F3.5-5.6G ED VR图库评测论坛报价网购实价&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;AF-S  DX 16-85mm F3.5-5.6G ED  VR是一款以内置宁静波动马达和VR减震II功能为特点的DX尼克尔镜头。新型大变焦DX尼克尔镜头具有16-85mm的焦距，适合广泛的拍摄场景，包括 室内或室外的活动、城市风貌、人像和风景。将这款镜头安装在任一DX格式尼康数码单镜反光相机上时，视角相当于35mm格式胶片相机或尼康FX格式相机的 24-127.5mm。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构（组/片）：11组17片（2个ED 镜片，3个非球面镜片） &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;运用Nikon DX 格式的摄像角度：83°-18°50’ &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小f/stop：22 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离（微距设定）：约0.38m（整个变焦范围） &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大复制比率（微距设定）：1/4.6 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤光镜尺寸：67mm &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头盖：提供 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;遮光罩：HB-39 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头袋：CL-1015 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径×长度（从镜头卡口伸出的延伸段）：约72×85mm &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：约485g&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼康AF-S DX 16-85mm F3.5-5.6G ED VR镜头适合那些不满套机镜头的朋友，属于套机镜头的替代品，具有5倍光变，广角端相当于24mm，镜头的实用性较高，同时带有VR防抖功能，成像画质也较套机镜头有较大提高。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S DX NIKKOR 10-24mm f/3.5-4.5G ED&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：6000元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/9/28/665/43248774.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S DX 尼克尔 10-24mm f/3.5-4.5G ED 图片评测论坛报价网购实价&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼 康AF-S DX NIKKOR 10-24mm f/3.5-4.5G  ED镜头内置宁静波动马达（SWM），配合尼康DX格式数码单镜反光相机使用。该镜头紧凑轻便，是具有2.4倍超宽广角的DX格式尼克尔镜头，焦距范围为 10-24mm（相当于FX格式或35mm格式下15-36mm焦距的画角）。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;该镜头适合各种场景，从狭小的房间、建筑物、全景到具有夸张透视感的独特人像都可进行拍摄。新开发的光学系统带2个ED镜片和3个非球面镜片，具有超高画面重现功能。宁静波动马达（SWM）内置于镜头，确保流畅、安静的自动对焦操作以及舒适的拍摄体验。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;焦距：10-24 mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大光圈：f/3.5-4.5&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈：f/22-29&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：9 组 14 片（带 2 个 ED 镜片和 3 个非球面镜片）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;画角：109°–61° &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离：0.24 m&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;光圈叶片数：7 片（圆形）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤镜/接口大小：77 mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径 x 长度：约 82.5 x 87 mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：约 460g&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;作 为尼康DX画幅的超广角镜头，尼康AF-S DX NIKKOR 10-24mm f/3.5-4.5G  ED是目前最佳的选择，想要在尼康D7000上获得超广角的拍摄体验，变焦镜头当中非它莫属了。镜头抗畸变能力较强，锐度表现也上佳，唯一让人纠结的便是 它是一支非全幅镜头，如果将来升级为全画幅单反相机，使用机率就大大减少了。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S DX Zoom Nikkor 17-55mm F2.8G IF-ED&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：9500元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/7/28/665/43248772.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S DX Zoom Nikkor 17-55mm F2.8G IF-ED图库评测论坛报价&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;专 用于 Nikon DX Format 数码单镜反光相机，镜头轻巧，是 D2H 数码单镜反光相机的最佳拍挡。焦距 17-55毫米，变焦距达 3  倍，拍摄范围由广角至中距远摄。光圈达 f/2.8，方便实用。安装于 Nikon D2H，D1-系列或 D100 数码单镜反光相机时，画角相当于  25.5~ 82.5毫米 变焦 35毫米 [135] 格式的相机。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;技术特性：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构（组/片） : 10/14 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;运用NIikon DX 格式的摄像角度 : 79度-28度50分 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈: 22 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离(微距设定) : 0.36米/1.2 英尺&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;放大倍率 : 1/5 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤镜尺寸 : 77毫米 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度（从镜头卡口伸出的延伸段） : 85.5 x 110.5毫米 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量(大约) : 755克&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康 AF-S DX Zoom Nikkor 17-55mm  F2.8G镜头可以说是尼康DX画幅单反镜头中的镜皇，恒定2.8光圈和实用的焦段，同时还拥有极其锐利的成像画质，堪比定焦镜头，但高价格是其弊端，相 信使用单反相机的朋友都有升级器材的打算，作为一支高价非全幅镜头，显然只适合不打算升级全画幅单反相机的用户使用。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S尼克尔16-35mm f/4G ED VR&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：7990元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/6/28/665/43248771.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S 尼克尔 16-35mm f/4G ED VR&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼 康AF-S 16-35 mm f/4G ED VR是一款新型尼克尔镜头。搭配尼康全幅单反相机使用，成为一支具备减震（VR  II）功能的广角变焦镜头，支持减震补偿，相当于将快门速度提高了4档，还配有宁静波动马达（SWM）实现安静快速的自动对焦；相机在全焦段范围支持最大 光圈达f/4。镜头采用尼康独家技术，纳米结晶涂层大大降低了鬼影和眩光，配备2片ED玻璃和3片非球面镜片，像差补偿效果优异；减震效果极佳，镜头覆盖 整个宽广角，适合拍摄运动、新闻和风景的影像。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;焦距：16-35 mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大光圈：f/4&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈：f/22&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：12组17片（2片ED玻璃、3片非球面镜片、纳米结晶涂层）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;画角：107°-63°（尼康DX格式为83°- 44°）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小对焦距离：焦距范围16mm至35mm时为0.29m，焦距范围20mm至28mm时为0.28m &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;光圈叶片数：9片（圆形）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤镜/接口大小：77mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度：约82.5(直径) x 125 mm（从镜头卡口伸出的延伸段计算）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：约680g&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康AF-S 16-35 mm f/4G ED  VR是今年新推出的一支广角镜头，采用了恒定F4光圈，是尼康小三元的一份子，对于购买尼康D7000的朋友来说，这支镜头可以充当常用焦段的镜头来使 用，而如果升级全画幅单反相机，更是一支超广角的好镜头。这支镜头目前售价还是较高的，并不太适合替代套机镜头使用，但对于有升级机身打算的朋友来说，可 以当作是提前投资。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;尼康定焦镜头&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康定焦镜头种类丰富，而且尼康D7000支持新款G镜头以及旧款D镜头，选择性方面较广，没有太多的限制，今年尼康在镜头上下大力度，推出了不少定焦好镜头，不少老款D镜头顺势升级为同规格的G镜头。下面推荐三支最为常用的定焦镜头供各位选择。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S DX 35mm F1.8G镜头&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：1380元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/1/28/665/43248766.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S DX 尼克尔 35mm f/1.8G&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;AF-S  DX NIKKOR 35mm  F1.8G是尼康第一款DX格式定焦镜头，画角相当于FX格式下的52.5mm（35mm格式相当值）。该镜头的最大光圈是F1.8，能够用于光线不足的 室内昏暗环境下的手持拍摄。该镜头采用7  叶片圆形光圈，能轻松获得漂亮的背景虚化效果。镜头带有宁静波动马达（SWM），能够进行快速、安静的自动对焦，还可以配合D40系列以及D60等没有内 置对焦马达的数码单镜反光相机，进行自动对焦拍摄。该镜头紧凑、轻便，能获得定焦镜头独有的拍摄效果，适合于拍摄自然人像和风景。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;焦距：35mm（相当于FX格式和35mm格式下的52.5mm）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大光圈：F1.8&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈：F22&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：6组8片&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;光圈叶片数：7片&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;视角：44度&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离：0.3米/1英尺 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤光镜尺寸 : 52mm &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度：70 x 52.5mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：200克&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康AF-S DX 35mm  F1.8G镜头是尼康去年推出的一支DX定焦镜头，主打性价比，供以入门用户使用，而实际成像不俗，1300多元的售价确实很值得购买，相比50mm定焦 镜头，35mm在APS-C画幅单反相机上的实用性更高一些。搭配尼康D7000使用，可以成为一支很实用的定焦镜头。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：&lt;/strong&gt;&lt;strong&gt;尼康 AF-S 50mm/F1.4G&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：3450元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/5/28/665/43248770.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S 50mm/F1.4G&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;AF-S  Nikkor 50mm  f/1.4G的最大光圈为f/1.4，能够用于例如灯光昏暗的室内这种黑暗的环境中手持拍摄。该镜头能很容易地创造出美丽的背景虚化效果。带有宁静波动马 达（SWM），能够进行快速、安静的自动对焦。可以配合D40、D40X以及D60没有内置对焦马达的单镜反光相机机身，进行自动对焦拍摄。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;AF-S  Nikkor 50mm  f/1.4G是一款拥有高性能超大光圈的定焦镜头，尤其适合那些使用诸如D3与D700尼康FX格式相机、经常拍摄人物、夜景和天体的专业摄影师与高端爱 好者使用。更多的强大之处在于，当将其安装于DX格式的单镜反光相机上时，f/1.4的光圈值以及相当于约75mm的画角，能够拍摄出带有漂亮虚化效果的 人像照片。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;AF-S  50mm镜头—标准视角的高速定焦镜头(当安装于DX格式的单镜反光相机时，焦距约为75mm，35mm格式相当值)，最大光圈f/1.4，平衡的设计实 现了高MTF性能与感觉自然的虚化效果，全新研发的光学系统有效地校正眩光和色彩失真，宁静波动马达(SWM)确保流畅、安静的自动对焦操作，支持双对焦 模式—M/A(手动优先自动对焦)和M  (手动对焦)，自动对焦操作中不需要旋转对焦环，9叶片圆形光圈实现自然的虚化效果，采用金属镜头卡口，尽管在对焦过程中所有镜头组移动，镜筒长度不变。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：7 组 8 片 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;带有35mm（135）格式的摄像角度：46° &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小f/stop：16 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离（微距设定）：0.45m &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大复制比率（微距设定）：0.15x &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤光镜尺寸：58mm &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度（从镜头卡口伸出的延伸段）：约 73.5 x 54 mm &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量（大约）：约 280 g&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康AF-S 50mm F1.4G镜头是对AF 50mm F1.4D镜头的一次升级，从做工以及实际成像表现来看，尼康用户现在购买一支50mm  F1.4定焦镜头，这支是首选，没有理由再去选择AF 50mm F1.4D老款镜头，相比较适马50mm  F1.4镜头有轻便、稳定性更高的优势。尼康D7000搭配此镜头可以作人像镜头使用，也为日后升级全画幅单反相机作了准备。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF 85mm F1.4D IF镜头&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：6990元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/3/28/665/43248768.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 85mm F1.4D IF AF Nikkor&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼 康AF 85mm F1.4D  IF是1995年12月推出的中焦段定焦镜头，光学构成为9片8组，采用了接近准圆的9叶片光圈设计，最近对焦距离0.85m，体积为80×72mm，重 550克，使用77mm的大口径滤色镜片。除了有严谨的光学结构以外，用料扎实也是其魅力所在，镜桶和遮光罩均采用了坚固的金属材质并覆有华丽的皱纹漆面 涂层，它机械工艺极其精良，操控手感令人赞佩。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康阵营当中公认的人像镜王AF  85mm F1.4D  IF，自然是值得拥有的一支定焦镜头。大光圈、中焦段，对于人像拍摄来说是必备的元素。当然长焦镜头能更好地突出被摄者，但并不是所有的场合都适宜使用长 焦镜头远距离拍摄，因此尼康AF 85mm F1.4D IF带来的圆润焦外、锐利的成像表现使其成为无数尼康用户向往的一支专业级人像镜头。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构（组/片） : 8/9 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;带有35mm（135）格式的摄像角度 : 28度30分 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;运用Nikon DX 格式的摄像角度 : 18度50分 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈 : 16 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离(微距设定) : 0.85米/3 英尺&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;放大倍率 : 1/8.8 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤镜尺寸 : 77毫米 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度（从镜头卡口伸出的延伸段） : 80 x 72.5毫米 &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量(大约) : 550克&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康85mm F1.4D镜头是尼康旗下的人像镜皇，今年9月，尼康推出了新款AF 85mm  F1.4G带超声波对焦马达以及纳米镀膜的升级产品，但售价实在是高昂，既然尼康D7000没有像入门型号那样的对焦马达限制，选择旧款D型镜头也未尝不 可，两者相搭配同样是人像拍摄的利器。锐度以及焦外表现都十分出众，售价较以往也有了一定幅度的下降，目前7000元不到即可购入。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;尼康长焦镜头&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康长焦及超长焦镜头的数量较佳能还是偏少了一些，但考虑尼康D7000的产品定位，搭配超长焦镜头使用的机会不多，以下推荐两款与尼康D7000搭配使用较为合适的长变焦镜头。该组合无论是操作表现还是实际成像都可获得较好的平衡。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S DX 55-300mm f/4.5-5.6G ED VR&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：2700元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/2/28/665/43248767.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 AF-S DX 尼克尔 55-300mm f/4.5-5.6G ED VR&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼 康AF-S DX 尼克尔 55-300mm f/4.5-5.6G ED  VR是一支5.5倍超远摄变焦镜头，焦段覆盖55-300mm。是首支使用高折射率镜片的镜头，外形小巧，操作简便，内置减震功能，可补偿相机抖动，相当 于提高4档快门速度，2片ED（超低色散）镜片，有效补偿横向色差。宁静波动马达（SWM），可实现安静的自动对焦&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;焦距：55-300mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大光圈：f/4.5-5.6&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈：f/22-29&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：11组17片（2个ED镜片，1个HRI镜片)&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;画角：28° 50’– 5° 20’&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离：1.4 m（覆盖整个变焦范围）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大复制比率：0.28×&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;光圈叶片数：9片（圆形）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤光镜尺寸：58mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尺寸：约76.5 mm（最大直径）× 123 mm （由镜头卡口起计）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：约530 g&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼康AF-S DX 55-300mm f/4.5-5.6G ED VR镜头对于单纯想获得长焦端的用户来说，是一个很好的选择，防抖、超长焦以及轻便的特性都具备了。新产品使用的防抖系统更加成熟。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;推荐产品：尼康AF-S 70-200mm f/2.8G ED VR II镜头&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考售价：15550元&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="自由搭配 尼康D7000原厂镜头配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/4/28/665/43248769.jpg" /&gt; &lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼康 尼克尔 AF-S 70-200mm F2.8G ED VR II&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;主要特点：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;尼 康AF-S 70-200mm f/2.8G ED VR II  在其焦距范围内，从中焦到远摄均表现了出色的性能。该镜头适合于多种场景，包括从人像到舞台的场景，以及夜间照明下的运动、新闻摄影和需要焦外虚化的场 景。系统采用了7 片ED  玻璃镜片，提供了卓越的影像还原、高分辨率和高对比度的影像。纳米结晶涂层能有效解决鬼影和眩光，拍摄出清晰的影像。宁静波动马达（SWM）能够提供宁静 平滑的对焦，使相机的自动对焦跟踪系统得到更好的应用。这款镜头还提供三种对焦模式的高级操作：M、A/M、M/A，并可实现手动对焦或者手动微调对焦 （在自动对焦模式中通过简单地旋转镜头对焦环而实现）。减震系统（VR II）为相机震动补偿提供了相当于提高 4 档快门速度的拍摄效果。可使用 2  种减震模式。&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;&lt;strong&gt;参数规格：&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;焦距：70-200mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最大光圈：f/2.8&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最小光圈：f/22&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;镜头结构：16 组 21 片（带 7 片 ED 玻璃镜片和纳米结晶涂层的镜头元件）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;画角：34°20’ - 12°20’（尼康 DX 格式为 22°50’ - 8°）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;最近对焦距离：1.4 m（整个变焦范围）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;光圈叶片数：9（圆形）&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;滤镜/接口大小：77mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;直径x长度（由镜头卡口起计）：约 87 x 209 mm&lt;/p&gt;&lt;p style="text-indent: 2em;"&gt;重量：约 1540 g&lt;/p&gt;&lt;strong&gt;编辑点评：&lt;/strong&gt;尼 康AF-S 70-200mm f/2.8G ED VR II  推出市场，采用了数量惊人的7片ED镜片以及纳米结晶涂层，保证了该镜头的成像质量，搭配非全幅单反相机D7000也可以发挥很强的实力。而且尼康 D7000小型化的机身并不适合搭配体积、重量太高的镜头，70-200mm f/2.8G  规格的镜头可以说是尼康D7000平衡搭配的上限，也是尼康长焦镜头中使用率最高的镜头之一。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-8260146915784616136?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/8260146915784616136/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/06/9d7000-d90d300sd90d300s-d7000aps.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8260146915784616136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8260146915784616136?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/06/9d7000-d90d300sd90d300s-d7000aps.html" title="自由搭配 尼康D7000原厂镜头配镜指南" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcHSHo6eip7ImA9WhZaEkw.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-5825311091205583426</id><published>2011-06-28T09:40:00.001+10:00</published><updated>2011-06-28T09:40:39.412+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T09:40:39.412+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Photography" /><title>打造新生代全能王 尼康D7000配镜指南</title><content type="html">　　9月中旬刚刚发布的&lt;a href="http://datalib.digi.qq.com/dc_model/3056/index.shtml" target="_blank" class="a-tips-Article-QQ"&gt;尼康D700&lt;/a&gt;0 定位介于D90和D300s之间，就它本身的性能和机身设计来看，与其说是比D90高一等级的机身，不如干脆挑明了说，就是D300S的替代者。 D7000的核心采用了一块儿APS-C画幅（DX画幅）1620W有效的像素的CMOS传感器，最大记录分辨率为4,928×3,264，这也是除 D3x之外尼康目前像素数最高的CMOS，D7000连拍速度为6Fps，而且在使用14bit  RAW格式记录时连拍速度亦能达到6Fps，这一点相当的了不起。&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/182/49/648/42148877.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;尼康中级机身新霸主D7000&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　尼康D7000必然会在圣诞之前上市，预计将会有搭配AF-S DX NIKKOR 18-105mm F3.5-5.6 G ED  VR或者是AF-S DX NIKKOR 18-200mm F3.5-5.6 G ED VR  II这两种镜头的套装出售，作为万元左右这一等级的产品，购买D7000的群体必然不可能满足于这两种套装，我们根据不同的使用侧重在尼康庞大的镜头群中 为大家推荐几支优秀的高性能镜头。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/183/49/648/42148878.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;D7000套装之一：配备18-105VR&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/184/49/648/42148879.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;D7000套装之二：配备18-200VR&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　D7000的CMOS支持ISO 100-ISO 25600的广阔感光度范围，并且配合EXPEED  2图像处理引擎有望提供更为优秀的高感光画质。在中级机身至关重要的对焦检测组件方面，D7000采用了最新研发的Multi-CAM4800DX对焦系 统，拥有39个自动对焦点，其中9个为双十字对焦点数。测光组件方面则是沿用2,016像素3D-RGB传感器。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/185/49/648/42148880.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;D7000恢复了尼康铁骨铮铮的传统&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　和塑料化的D90不同，D7000恢复尼康铁骨铮铮的传统，机身采用镁合金制作(包括配用手柄MB-11也是相同材质)，防尘防滴溅全密封处理，提高了 对恶劣环境的适应能力。光学取景器则达到了专业机身的水准，100%覆盖，0.94的放大倍率和19.5mm的眼点，基本不弱于DX旗舰D300s，存储 介质方面则支持双SDXC(兼容SDHC和SD)。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/186/49/648/42148881.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;存储方面支持双SDXC&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　在已经事实成为单反标配的视频拍摄功能方面，尼康D7000支持1,920×1,080  24fps全高清视频，之前尼康的单反视频最大只能支持到1,280×720分辨率24fps，D7000也支持1,280×720分辨率30fps的视 频格式。记录格式MOV(H．264/MPEG-4  AVC)，D7000本机只有单声道麦克风，可以外接立体声麦克风实现双声道声音拾取，视频拍摄时支持程序自动曝光和手动曝光，对焦方面也支持AF- F（全时伺服自动对焦）模式，自动保持焦点对焦清晰，不需要人工干预。&lt;/div&gt;&lt;table align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　D7000上市时会以套装和单机身的形式一起出现，套头有18-105和18-200两种，18-105这支镜头勉强能满足家庭用户的需求，但对于摄影 爱好者来说，无论是像质还是亮骚都是远远不够的。我们向摄影爱好者郑重推荐尼康近年推出的DX画幅标头AF-S 35/1.8G来作为补充  。这两支镜头加起来覆盖了常用的广角到中焦焦段，并且拥有一个完全可以信任的F1.8大光圈可以用，只要不是特别诡异的拍摄题材，基本都可以满足，AF- S 35/1.8G的大光圈和卓越的成像素质在很大程度上弥补了AF-S DX  18-105/3.5-4.5G光圈略小的遗憾，在应对弱光拍摄时更加游刃有余。35/1.8G作为D7000+18-105VR套装的补充，推荐给初入 此门的摄影爱好者和喜欢纪实摄影的朋友们。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/187/49/648/42148882.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;D7000的18-105套机&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　Nikon AF-S Nikkor 35mm 1:1.8G  DX发布于2009年2月，这是一枚APS机身专用的DX画幅镜头，等效35mm焦距为52mm，由此，AF-S 35/1.8G  DX的定位一下子凸显出来，它是尼康为旗下所有APS机身所准备的一枚大口径标头,镜身搭载环形超声波马达的驱动方式也使它可用于全系列尼康数码相机，解 决了从D40开始D40X，D60这样没有对焦马达的机身无法使用传统的50/1.8或者35/2这样的机身驱动镜头的窘境。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/188/49/648/42148883.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　 　35/1.8G一枚锐利的镜头，无论你是对光学质量要求甚高还是喜欢捕捉弱光下的光影之魅，都值得考虑它。AF-S 35/1.8G  DX在全开光圈下表现就相当优秀，新的镀膜，新的光学材料和小像场赋予它相当高的整体锐度，画面感觉高反差而又油润不失层次，刻画细致入微，唯一美中不足 的是畸变略大。采用了7片圆形光圈叶片之后，AF-S 35/1.8G  DX的焦外虚化也相当柔和。当这一切建立在一千出头的价格上之后，35/1.8G就完全没有任何缺点可言了。&lt;/div&gt;&lt;table align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　D7000的另一种套装形式会是配合尼康AF-S DX尼克尔18-200mm f/3.5-5.6G ED VR  II，这是一支近乎全能的大变焦比镜头，在APS-C画幅的数码单反相机上，其焦距等效于27-300mm，涵盖从广角到超长焦的广阔范围，在以往的观念 之中，类似指标的镜头往往被视为一镜走天涯型的轻便旅游镜，但是D7000卓越的视频拍摄能力则能够赋予这支镜头以更实用的价值，那就是用于拍摄高清视 频。10倍光变，VR支持让解决了单反视频拍摄会受到镜头限制而适应面比较狭窄的情况，AFS超声波马达驱动和全时自动伺服功能的加入则解决了单反相机拍 摄视频时反差检测自动对焦速度十分有限的尴尬，宁静的超声波马达会在无声无息之中帮助用户完成对焦的工作。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/189/49/648/42148884.jpg" border="1" /&gt;&lt;/p&gt;&lt;span style="font-size: 12px;"&gt;D7000+18-200VR套装&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　尼康AF-S DX尼克尔18-200mm f/3.5-5.6G ED VR  II镜头的外形紧凑轻巧，却可实现约11.1倍的超高放大倍率变焦，覆盖的焦段范围相当于35mm格式下的27-300mm。镜头设计品质优异，采用2片 ED（超低色散）玻璃镜片和3片非球面镜片，同时还配备了VR II减震系统与内置宁静波动马达（SWM）。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　除了杰出的成像能力，该镜头还能提供很好的便携性，适合人像和风景等各种拍摄场景。新增加的变焦锁定开关允许拍摄者在镜头最小长度下锁定镜筒，避免在携带过程中由于重力使镜筒向外滑出。&lt;/div&gt;&lt;div class="c" style="text-align: center;"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/190/49/648/42148885.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　?　11.1 倍放大倍率的超大变焦镜头 &lt;p&gt;　　?　2片ED（超低色散）玻璃镜片和3片非球面镜片&lt;/p&gt; &lt;p&gt;　　?　带变焦锁定开关&lt;/p&gt; &lt;p&gt;　　?　宁静波动马达（SWM），实现平稳安静的高级自动对焦&lt;/p&gt; &lt;p&gt;　　?　配备减震（VR II），相当于提高 4 档快门速度的拍摄效果&lt;/p&gt; &lt;p&gt;　　?　采用尼康超级综合镀膜（SIC）&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　D7000面对中高端用户市场，因此套装镜头更加偏重于方便性，对于画质有着更高要求摄影爱好者来说，原厂的套装完全无法满足需要，单买机身然后选择自 己心仪的镜头组合肯定是更加明智的做法。我们推荐AFS 50/1.4G给喜欢拍摄人像的朋友，这个组合没有采用尼康久负盛名的AF  85/1.4D或者新锐的AFS  85/1.4G而是采用了新版标头AFS50/1.4G,原因在于装在D7000机身上时，50/1.4G的等效焦距差不多是75mm，正是对人像表现较 好的中焦焦段，而不选择85/1.4G或者85/1.4D的原因一来是价格都过于昂贵（前者尤其昂贵），二来，如果在影棚中使用，85mm镜头装在 D7000上的等效焦距为130mm左右，太长了一点点，稍小一点的室内就会施展不开，选择AFS  50/1.4G在便利性上十分出色的同时，对于复杂光源的适应性上也同样可圈可点。这支镜头加上18-105VR的组合对于喜欢拍摄人像的朋友来说，足以 应付从影室到环境人像，从T台到现场抓拍的各种需求。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/191/49/648/42148886.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　 　AFS 50mm  f/1.4G采用了8片7组的光学结构，这支镜头保持着尼康光学产品特有的硬朗明锐的结像风格，光圈只需略微收缩，他的锐度就进入了极佳状态，其细节描写 能力绝对不俗。f/1.4的大光圈设计使其驾驭弱光环境游刃有余，即便在昏黄的烛光下，他也能将被摄主体的暗部层次展示得尽善尽美。在机械品质方面您也没 有什么可担忧的，标头是一个品牌光学产品的“门面”，尼康绝对会真材实料地去打造好自己的“门面”。请不要吝啬了，因为您只需要支付3400元就能将 AFS 50mm f/1.4G收入摄影包中，像这样的经典光学产品是每一个严谨的摄影师都不可或缺的，在关键时刻他将是您可以信赖的伙伴。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/192/49/648/42148887.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　　对于摄影爱好者来说，微距是一个极其有意思的题材，探索永无止境，微距镜头所能表现的东西也是永无止境的。而且，我们眼中平淡无奇的世界在微距镜头之下将会变的完全不同，拥有一支微距镜头将会让你发现很多平时从未曾关注过的地方。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　 　作为广受好评的 AF Micro Nikkor 60mm F2.8 D的升级型号，AF-S Micro NIKKOR 60mm F2.8 G  ED在前作基础上加入了SWM超声波对焦马达，新增了ED超低色散镜片，并且引入了先进的纳米涂层技术。该镜头由9组12枚镜片组成，具有多达9枚圆形光 圈叶片，它的最小光圈为F32，最近对焦距离为18.5cm，可以实现等倍率微距拍摄功能。&lt;/div&gt;&lt;div align="center"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/193/49/648/42148888.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　 　AF-S Micro NIKKOR 60mm F2.8 G  ED的滤光镜口径为62mm，镜头体积为73×89mm，重425g，随镜头提供圆形避光罩。这支镜头在微距状态下时可以达到1:1的放大倍率。内对焦的 设计使自动对焦更加迅速而流畅。2个非球面镜片可以有效地矫正像差。纳米结晶涂层可消除内部反射，从而显著地降低鬼影和眩光。ED  镜片可以更有效地减少色差，产生较高锐度和高对比度的影像。所有这些特性都保证了AF-S Micro NIKKOR 60mm F2.8 G  ED可以获得精确的图像还原能力。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　AF-S Micro NIKKOR 60mm F2.8 G ED目前市场售价大约在三千出头四千不到的样子，相比刚上市时候的接近六千元已经是厚道了很多，对于单反用户来说并不是那么难以接受，拥有它，发现一个每天都有一些惊奇发生的地方。 &lt;p&gt;　　&lt;/p&gt;&lt;/div&gt;&lt;table align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;　 　如果问一个尼康的粉丝，什么镜头最能代表尼康？答案九成九会是小钢炮，那么历经八代发展之后，最新AF-S Nikkor 70-200mm  f/2.8G ED VR  II被粉丝们昵称为小竹炮，接任尼康中焦变焦镜皇一职。作为一个尼康粉丝，买得起单机身预计也要8K出头的D7000的朋友完全不在乎再添上一支万元出头 的小竹炮二代吧。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　70-200mm焦段的大口径恒定光圈变焦镜头应用范围极其广泛，从职业摄影师到摄影发烧友都会选上 一支留在自己的摄影包里，群众基础相当的广泛，而且这个焦段的专业镜头也是工厂光学设计和制造能力的体现。众多的用户和粉丝们有给自己的镜头起昵称的喜 欢，比如佳能的EF  70-200/2.8因为一袭白衣护体，故而被称为”小白“，尼康的80(70)-200/2.8因为外观特色是黑粗大长，因此诨名唤作”小钢炮“，缩写 是XGP&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　2009年7月30日，尼康AF-S 尼克尔70-200mm f/2.8G ED VR  II镜头全球同步发布。该产品采用多达7片ED（超低色散）玻璃镜片，纳米结晶涂层及VR  II减震系统与内置宁静波动马达（SWM）。同时，该镜头可以和尼康已经推出的 AF-S尼克尔14-24mm f/2.8G  ED和AF-S尼克尔24-70mm f/2.8G ED 一起完整覆盖14mm 到200mm 的焦段，并且在整个焦段范围内支持 f/2.8  的最大光圈。&lt;/div&gt;&lt;div class="c" style="text-align: center;"&gt;&lt;p align="center"&gt;&lt;img name="MM" alt="打造新生代全能王 尼康D7000配镜指南" src="http://img1.gtimg.com/digi/pics/hv1/194/49/648/42148889.jpg" border="1" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　这款快速远摄变焦镜头提供了出色的拍摄性能和超高的影像品质，可以满足专业用户和高级摄影爱好者的拍摄需求。从中焦到远摄，该镜头的杰出性能适合各种场景，包括人像、舞台、夜间照明下的运动、新闻摄影以及实现焦外虚化的浅景深效果。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;　　?　减震（VR II），相当于提高 4 档快门速度的拍摄效果 &lt;p&gt;　　?　采用 7 片 ED 玻璃镜片的全新光学设计&lt;/p&gt; &lt;p&gt;　　?　纳米结晶涂层，可抑制鬼影和眩光&lt;/p&gt; &lt;p&gt;　　?　宁静波动马达（SWM），实现平稳安静的高级自动对焦&lt;/p&gt; &lt;p&gt;　　?　三种内置对焦模式：M、M/A 和 A/M&lt;/p&gt; &lt;p&gt;　　?　9叶圆形光圈，带来自然的虚化美感&lt;/p&gt; &lt;p&gt;　　?　在整个变焦范围内，拍摄距离可近至 1.4 m&lt;/p&gt; &lt;p&gt;　　?　高品质的外观设计&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-5825311091205583426?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/5825311091205583426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/06/d7000.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/5825311091205583426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/5825311091205583426?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/06/d7000.html" title="打造新生代全能王 尼康D7000配镜指南" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkcGQng5fyp7ImA9WhZXE0k.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-6358030478422327053</id><published>2011-05-02T22:43:00.003+10:00</published><updated>2011-05-02T23:47:03.627+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-02T23:47:03.627+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="finance" /><title>Compared: best travel money cards in Australia</title><content type="html">Travellers are increasingly warming to prepaid travel money cards as the next best thing to carrying cash.&lt;br /&gt;&lt;br /&gt;Travel money cards such as the well-known Travelex Cash Passport and the relatively new American Express Global Travel Card combine the convenience of credit cards with the simplicity of cash exchange.&lt;br /&gt;&lt;br /&gt;When you buy a travel money card you also buy a certain amount of foreign currency at that day's exchange rate. This sits in credit on the card in the foreign currency -- unlike the fluctuating exchange rate that applies to credit cards and ATM withdrawals when used overseas.&lt;br /&gt;&lt;br /&gt;Travel Money cards also have the advantage of being totally separate from your bank account. Even if your card is defrauded while overseas, the most you could lose is the amount of money you've preloaded onto the card.&lt;br /&gt;&lt;br /&gt;The biggest advantage of all, though, is that there are no per-transaction fees for using travel money cards to make purchases.&lt;br /&gt;&lt;br /&gt;Unlike credit cards that charge up to 3.5% on every overseas purchase ($35 out of every $1,000), if you've loaded a travel money card with US dollars, and make a purchase in US dollars, there's no surcharge. In that way, they're much like spending cash.&lt;br /&gt;&lt;br /&gt;ATM cash withdrawal fees are also cheaper with travel money cards than with ordinary bank ATM cards. For example, NAB charges $4 + 2% per overseas withdrawal ($24 on $1000), while ANZ, Commonwealth Bank and Westpac charge $5 + 3% ($35 on $1000).&lt;br /&gt;&lt;br /&gt;However, travel money cards charge no percentage surcharge (as long as you're withdrawing cash in the currency you loaded onto the card) and a reduced flat fee -- for example, $2 for US dollar withdrawals on an American Express Global Travel card.&lt;br /&gt;The four cards on test&lt;br /&gt;&lt;br /&gt;We compared the four cards on the market:&lt;br /&gt;&lt;br /&gt;* ANZ Travel Card&lt;br /&gt;* Commonwealth Bank Travel Money Card&lt;br /&gt;* American Express Global Travel Card&lt;br /&gt;* Travelex Cash Passport&lt;br /&gt;&lt;br /&gt;Many outlets offer travel money cards that are just rebranded Travelex Cash Passport cards. We have not included them in this review.&lt;br /&gt;Revealed: the hidden fees of travel money cards&lt;br /&gt;&lt;br /&gt;Like any financial product, all sorts of fees and charges apply to catch the unwary. Still, even cash exchange is laden with fees, as evidenced by the atrocious rates charged at bureaux de change for walk-in (not pre-arranged) exchanges.&lt;br /&gt;&lt;br /&gt;We've done the work of sifting through the fees and charges for you, to identify the charges you need to watch out for.&lt;br /&gt;&lt;br /&gt;Initial card purchase fee: with all the travel money cards, you pay a one-off fee to buy the cards. This ranges from $11 (ANZ Travel Card) to $15 (all the others). Compared to the rest of the fees, this fee is inconsequential, however if you are travelling to numerous countries with different currencies, it does become more important if you have to buy travel money cards in various currencies, where the up-front fee is multiplied by the number of cards you need.&lt;br /&gt;&lt;br /&gt;It is worth noting that the American Express and Travelex cards can be purchased at Australia Post with an $0 card fee, rather than the standard $15 card fee.&lt;br /&gt;&lt;br /&gt;Initial cash purchase surcharge: most cards include the initial 'cash load' onto the card as part of the purchase fee. The only exception is Travelex, and only if you are loading Australian dollars onto the card -- they will take 1.1%. Loading a foreign currency onto a Travelex card is free when you initially buy the card.&lt;br /&gt;&lt;br /&gt;Cash reload fee: when you need to add more money to the card, all the cards charge 1 to 1.1% of the amount you're loading on. American Express Global Travel Card compares well to the other cards here -- it charges 1% of the reload amount, but caps it to a maximum of $10 each time, which means any recharge over $1,000 is a discounted rate.&lt;br /&gt;&lt;br /&gt;ATM withdrawal fees: every time you withdraw money from a foreign ATM, there's a flat fee charged. The cheapest fees are from American Express and ANZ -- $2.00 and $2.20 respectively for a withdrawal in the USA or £1.25 in the UK. Travelex is more expensive, charging $3.75 for a withdrawal at a USA ATM, and Commonwealth Bank is between the two extremes.&lt;br /&gt;&lt;div class="photo-text text"&gt;&lt;/div&gt;&lt;a href="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc4caadf04973b5a342bc767f1341-overseas-atm-withdrawal-fees-travel-money-card.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 471px; height: 172px;" src="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc4caadf04973b5a342bc767f1341-overseas-atm-withdrawal-fees-travel-money-card.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Shop surcharges: while this is not strictly a fee directly charged by the travel card provider, it will affect you nonetheless. While Visa and Mastercard purchases don't usually attract additional surcharges when paying for something at a shop, American Express cards often do. Using the American Express Global Travel card means you'll be paying up to an additional 5% on purchases (the average seems to be around 2.5 - 3%, and some outlets charge nothing extra and absorb the Amex cost into their prices.) In the USA, merchants are contractually obliged to American Express not to charge surcharges for American Express purchases, but some will still try to apply them.&lt;br /&gt;&lt;br /&gt;Wrong currency purchase fee: if you've loaded US dollars onto your travel money card but buy something in British pounds, the travel card provider charges a percentage surcharge to convert the transaction across. This is generally a similar rate as what's charged for ordinary overseas credit card purchases -- ANZ just says "the wholesale market rate from Visa", while Commonwealth Bank charges 2%, and American Express 3%. Travelex is horrendous on this point: it slugs you 8.45% of the transaction.&lt;br /&gt;&lt;div class="photo-text text"&gt;&lt;/div&gt;&lt;a href="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc794c41040a284454553767f1341-wrong-currency-purchase-fee.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 271px; height: 96px;" src="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc794c41040a284454553767f1341-wrong-currency-purchase-fee.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ANZ figure is estimated&lt;br /&gt;&lt;br /&gt;Monthly inactivity fee: ANZ and Travelex start draining your card balance if you haven't used the card for more than 12 months, at the rate of a few dollars a month. Commonwealth Bank and American Express do not charge this fee, and allow cards to remain open indefinitely.&lt;br /&gt;&lt;br /&gt;Card expiry balance forfeiture: if you keep a balance on your travel card past the expiry date on the card, ANZ, Travelex and Commonwealth Bank will zero your balance and keep it for themselves. American Express Global Travel Card is more ethical on this point -- it holds the money in trust until the cardmember claims it, even if the card is expired.&lt;br /&gt;&lt;br /&gt;Account closure fee: if you complete your trip and decide you want to get your money out of the card again and back as Australian dollars, you can close your account and convert the money back at the current exchange rate. Travelex is the only provider that also charges an additional $10 fee for this.&lt;br /&gt;How the travel money cards differ&lt;br /&gt;&lt;br /&gt;Apart from the differences in fees outlined above, some of the cards do have some unique features:&lt;br /&gt;&lt;br /&gt;Multiple currencies on one card: Commonwealth Bank is the only travel card provider that allows you to load up to six multiple currencies onto one card.&lt;br /&gt;&lt;br /&gt;You can put different amounts of money into each currency, and when you spend money in each country, it's deducted from the appropriate currency balance.&lt;br /&gt;&lt;br /&gt;If you run out of money in the right currency, the card will fall back to another currency, but you will be charged a wrong currency conversion fee of 2% (still cheaper than the 3% - 3.5% fee charged on most credit cards.)&lt;br /&gt;&lt;br /&gt;However, if you are organised, you can ring Commonwealth Bank and transfer money from one currency to another at no charge, which is a fantastic benefit.&lt;br /&gt;&lt;br /&gt;The other travel card providers require you to buy a separate card for each currency you want to take on a trip, which, at $15 a pop, could be the monetary equivalent of a cafe lunch for two that you could save by going with Commonwealth Bank. (You can, however, avoid paying a card fee for Travelex Cash Passport or American Express Global Travel cards if you buy them at Australia Post.)&lt;br /&gt;&lt;br /&gt;Methods for reloading the card: Ease of adding more money to your card while travelling is important. The weakest card in this respect is American Express Global Travel Card, which can only be recharged via an American Express Foreign Exchange Office in Australia, or via BPAY, which has a delay of several days.&lt;br /&gt;&lt;br /&gt;The ANZ Travel Card and Commonwealth Bank Travel Money Card have the advantage of being able to be reloaded instantly using internet banking (provided you have accounts with those banks).&lt;br /&gt;&lt;br /&gt;Travelex has an SMS recharge system, where you send a text message while overseas, and they direct debit your bank account based on an authorisation you give them when you first set up the card. However, this method still takes up to two days.&lt;br /&gt;&lt;br /&gt;All the cards offer reloading via BPAY, which provides a convenient option for anyone with internet or phone banking, however all the card providers warn this can take 2-3 days for funds to be credited.&lt;br /&gt;&lt;br /&gt;&lt;div class="photo-text text"&gt;&lt;/div&gt; &lt;a href="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9efc77d23c412fb1a34a15767f1341-pmt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 466px; height: 116px;" src="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9efc77d23c412fb1a34a15767f1341-pmt.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Branch reloads can only be done at Australian branches for all cards.&lt;br /&gt;&lt;br /&gt;Currencies available: some cards have a better range of currencies available than others. The weakest is the American Express Global Travel Card, which only offers US dollars (USD), Great Britain Pound (GBP) and Euro (EUR).&lt;br /&gt;&lt;br /&gt;The best is the Commonwealth Bank Global Money Travel Card, which offers those, plus Japanese Yen (JPY), New Zealand Dollar (NZD), Hong Kong Dollar (HKD), Canadian Dollar (CAD) and Singapore Dollar (SGD).&lt;br /&gt;&lt;div class="photo-text text"&gt;&lt;/div&gt; &lt;a href="http://www.ausbt.com.au/photos/view/maxsize:1225,528/mode:shrink/4d9ef3f1bc88447a97d84261767f1341-Australia-travel-card-comparison-currencies-available-USD-EUR-GBP-NZD-HKD-SGD-CAD-AUD-JPY"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 446px; height: 96px;" src="http://www.ausbt.com.au/photos/view/maxsize:1225,528/mode:shrink/4d9ef3f1bc88447a97d84261767f1341-Australia-travel-card-comparison-currencies-available-USD-EUR-GBP-NZD-HKD-SGD-CAD-AUD-JPY" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you need to go to a place which uses a currency not offered by any of the cards (for example China RMB, or Thai Baht) you can still use a travel money card, however you will just pay a "wrong currency conversion fee" each time you use the card -- 2-3% of the transaction amount for ANZ, CBA and Amex, and a hefty 8.45% for Travelex. In these circumstances, a better choice would be the international fee-free 28 degrees Mastercard, which we've explained extensively here.&lt;br /&gt;&lt;br /&gt;Exchange rates&lt;br /&gt;&lt;br /&gt;We checked the exchange rates on 8th April 2011 for purchasing US dollars, Euros, British Pounds and New Zealand Dollars for all the travel card providers.&lt;br /&gt;&lt;br /&gt;All the providers were very competitive with each other, with rates that were similar to the rate you get if you pre-book cash to pick up from Travelex (one of the cheapest ways to buy currency). There was little difference between the cards in terms of exchange rate on the day we checked.&lt;br /&gt;&lt;br /&gt;&lt;div class="photo-text text"&gt;&lt;/div&gt; &lt;a href="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc69d40ac47a6a93943f9767f1341-currency-exchange-compared.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 378px; height: 305px;" src="http://www.ausbt.com.au/photos/view/maxsize:640,480/4d9fc69d40ac47a6a93943f9767f1341-currency-exchange-compared.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(Green/larger numbers are better)&lt;br /&gt;Australian Business Traveller's recommendations&lt;br /&gt;What to buy&lt;br /&gt;&lt;br /&gt;If you're visiting a single country: ANZ Travel Card has a low $11 upfront fee, and has the advantage for ANZ customers of being linked to internet and phone banking so that more money can easily and instantly be transferred into the card. If you need Japanese Yen or Singapore Dollars, the ANZ card doesn't offer them, so you should go for the Commonwealth Bank card instead.&lt;br /&gt;&lt;br /&gt;If you're visiting multiple countries: It's hard to go past the convenience of the Commonwealth Bank Travel Money Card, which can store up to six currencies on one card, saving you the cost of purchasing multiple cards for each currency. You can also shift money between the currencies free of charge, which is a fantastic service.&lt;br /&gt;About the rest&lt;br /&gt;&lt;br /&gt;American Express Global Travel Card is let down by a lack of options for adding more funds to the card during the trip, and the "American Express surcharge" that you will be charged in many shops and restaurants. There are some upsides to the American Express card -- there is no 'monthly inactivity' fee after 12 months, and the ATM withdrawal fees for the US and Britain are the cheapest of all the cards.&lt;br /&gt;&lt;br /&gt;Travelex Cash Passport provides the best exchange rate and a convenient SMS reloading option if you need to put more currency on it, but you have to be very careful in using it, because if you buy in a currency other than the one you've loaded onto the card, you'll lose 8.45% of every transaction. Travelex also charges a $10 fee to get your money back off the card if you have money left over at the end of the trip, and if you  leave your card unused after 12 months, Travelex will gradually fritter the money away with monthly fees.&lt;br /&gt;How travel money cards compare to credit/ATM cards&lt;br /&gt;&lt;br /&gt;Almost all credit cards charge 3 - 3.5% on top of all foreign purchases (that's $30 - $35 on $1,000), while travel money cards do not charge any surcharge on purchases made on the card -- as long as you spend in the right currency.&lt;br /&gt;&lt;br /&gt;If you buy something in a currency other than the one you loaded on the card, you'll pay a conversion surcharge, but it is usually lower than the 3 - 3.5% charged on regular credit cards. For example, Commonwealth Bank only charges 2%. Travelex Cash Passport is an exception to this rule, though, slugging wrong currency purchases a whopping 8.45% penalty fee.&lt;br /&gt;&lt;br /&gt;In terms of ATM cash withdrawals, normal Australian bank accounts and credit cards charge around 3% of the withdrawal amount plus $5 each time (for example, an $11 fee for a $200 withdrawal).&lt;br /&gt;&lt;br /&gt;Preloaded travel money cards do not charge a percentage surcharge if you withdraw the currency you've loaded onto the card, but they do charge a flat ATM withdrawal fee -- in the range of US$2.00 - US$3.75 for a US dollar withdrawal, for example. So they are a bit cheaper for withdrawing cash than standard Australian credit/ATM cards.&lt;br /&gt;&lt;br /&gt;One inescapable gotcha that applies to both standard ATM and preloaded travel money cards is foreign ATM operator fees. These can be as high as $15 per transaction if the ATM is in the lobby of a five star hotel, for example.&lt;br /&gt;&lt;br /&gt;Unfortunately laws vary from country to country on whether ATM operators are required to warn you of these fees before proceeding with your transaction -- Australian Business Traveller staff have been stung without warning by a $15 fee using an English-language ATM in a five star hotel in China.&lt;br /&gt;&lt;br /&gt;This fee applies whether it's a travel money card or a standard ATM card used in the withdrawal, so the two are comparable on this point.&lt;br /&gt;&lt;br /&gt;It is worth noting that there is one credit card and one debit card on the market that allow fee free ATM withdrawals overseas, and do not charge any surcharge for international transactions. Read our writeup of the GE Finance 28 degrees Mastercard and NAB Gold Visa Debit.&lt;br /&gt;&lt;br /&gt;The downsides of these cards are that there is a greater potential for fraud than with the limited balance stored on a travel money card, and the exchange rate fluctuates on a daily basis. However, they are otherwise cheaper to use than preloaded travel money cards.&lt;br /&gt;How travel money cards compare to exchanging cash&lt;br /&gt;&lt;br /&gt;Travel money cards are roughly comparable to the exchange rate you get if you pre-book a cash exchange from Travelex.&lt;br /&gt;&lt;br /&gt;However, they have the advantage of being able to be easily replaced if you lose them, whereas replacing cash will require a travel insurance claim (if the policy even covers it) which can take many weeks to process.&lt;br /&gt;&lt;br /&gt;Travel money cards are generally issued in pairs so you can keep one in your wallet, and one in a hotel room safe. If the first one is stolen, it can be deactivated without deactivating the second card, which has a different card number and PIN number.&lt;br /&gt;&lt;br /&gt;They also have the advantage of only having a limited amount of money on them. If your card is skimmed and used fraudulently elsewhere, the amount of money you will lose is limited to the amount you've loaded onto the card.&lt;br /&gt;&lt;br /&gt;However, unlike cash, which is always accepted everywhere and without any additional fees, Travel Money Cards will not be accepted by vendors that don't take credit cards, and if you want to get cash out at an ATM, you will have to pay some fees.&lt;br /&gt;&lt;br /&gt;Beware, though, exchanging cash is only a good value option if you pre-arrange it. If you walk up to a change bureau, it can be very expensive.&lt;br /&gt;&lt;br /&gt;In our investigation of the cheapest currency exchange outlets in Australia earlier this year, we found that when buying £1000, the cost in Aussie dollars could be as little as $1696.65 (at Flight Centre Money Centre) or as much as $1916.00 (using the Travelex change booth at Sydney International Airport). That's a difference of almost $220!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-6358030478422327053?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/6358030478422327053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/05/compared-best-travel-money-cards-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/6358030478422327053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/6358030478422327053?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/05/compared-best-travel-money-cards-in.html" title="Compared: best travel money cards in Australia" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU8AQ3o9fip7ImA9Wx9aEU8.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-8593824095681596236</id><published>2011-03-03T14:43:00.000+11:00</published><updated>2011-03-03T14:44:02.466+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T14:44:02.466+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Grails Datasources Plugin</title><content type="html">The Datasources plugin allows you to define multiple databases/datasources and decide which datasource each of your Domain classes attaches to. Grails doesn't directly support this – there's only one DataSource and one SessionFactory, and all domain classes use them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are some implications of the approach I took. This doesn't provide XA transactions, 2PC, etc. It's just a partitioning of classes between two or more datasources. The way it works is to run after HibernateGrailsPlugin and DomainClassPlugin have done their work. Then it uses a configuration defined in grails-app/conf/Datasources.groovy and creates one or more extra DataSource, SessionFactory, TransactionManager, etc. and re-runs the HibernateGrailsPlugin's doWithDynamicMethods closure for the appropriate subset of domain classes. This way when you call a magic GORM method (e.g. list(), get(), findByNameAndDate(), etc.) it will use the correct underlying datasource. Any domain class not defined as using a secondary datasource will use the 'core' datasource defined in DataSource.groovy.&lt;br /&gt;&lt;br /&gt;Another issue is that all domain classes stay defined in the core datasource/SessionFactory – the existing behavior isn't changed, other than redefining the metaclass methods to use another datasource. The only effect of this is that if you use dsCreate = 'create-drop' or 'create' or 'update' for the core datasource, all tables will be created in the core database even though some won't be used. There is a work around if you want to limit the tables that are manipulated.&lt;br /&gt;&lt;br /&gt;Datasources DSL&lt;br /&gt;&lt;br /&gt;The DSL used in Datasources.groovy is very similar to the format of DataSource.groovy. One difference is that the 'hibernate' section is inside the 'datasource' section, and there are a few extra attributes.&lt;br /&gt;&lt;br /&gt;Name Type Required Description&lt;br /&gt;name String yes datasource name, used as a Spring bean suffix, e.g. 'ds2'&lt;br /&gt;readOnly boolean no, defaults to false if true, the datasource and corresponding transactional services will be read-only&lt;br /&gt;driverClassName String yes same as in DataSource&lt;br /&gt;url String yes same as in DataSource&lt;br /&gt;username String no same as in DataSource&lt;br /&gt;password String no same as in DataSource&lt;br /&gt;dbCreate String no same as in DataSource&lt;br /&gt;dialect String or Class yes (no autodetect) same as in DataSource&lt;br /&gt;jndiName String no same as in DataSource&lt;br /&gt;pooled boolean no, defaults to false same as in DataSource&lt;br /&gt;loggingSql boolean no, defaults to false same as in DataSource&lt;br /&gt;logSql boolean no, defaults to false same as in DataSource&lt;br /&gt;environments List&lt;String&gt; no, defaults to ['development', 'test', 'production'] list of environments this DataSource should be active in&lt;br /&gt;domainClasses List&lt;String&gt; or List&lt;Class&gt; yes the domain classes that should use this DataSource&lt;br /&gt;services List&lt;String&gt; no short names of the services that should use this DataSource (same as Spring bean without 'Service', e.g. 'user' for UserService)&lt;br /&gt;&lt;br /&gt;See the sample app (link below) for a usage example.&lt;br /&gt;&lt;br /&gt;OpenSessionInView&lt;br /&gt;&lt;br /&gt;An OpenSessionInViewInterceptor is defined for each datasource, so the features that it provides are available to all domain classes. For example you can load a domain instance and set a property, and it will be detected as dirty and pushed to the database. Also, lazy loaded collections will load since there's an active session available.&lt;br /&gt;&lt;br /&gt;Further, if you save, create, load, etc. domain instances from multiple datasources in one controller method, all will work fine.&lt;br /&gt;&lt;br /&gt;Transactional Services&lt;br /&gt;&lt;br /&gt;By default, any service defined as transactional will use the core datasource. If you want a service to use a specific datasource, add its name to the 'services' attribute for a datasource definition. If there's no one datasource for a particular service, you can still define programmatic transactions using withTransaction on any domain class for the appropriate datasource for each method or code block.&lt;br /&gt;&lt;br /&gt;HibernateTemplate&lt;br /&gt;&lt;br /&gt;I can't think of non-contrived reasons to do so, but it's possible to use a domain class in two or more datasources. The problem here is that the metaclass methods will end up mapped to the last declared datasource, so there's no way to use GORM for the other datasource(s). However you can use Spring's HibernateTemplate yourself - it has a lot of the functionality of GORM (GORM uses it under the hood). You can use the convenience method DatasourcesUtils.newHibernateTemplate(String dsName) to create a HibernateTemplate configured with the SessionFactory for the named datasource.&lt;br /&gt;&lt;br /&gt;Direct access to the datasources&lt;br /&gt;&lt;br /&gt;Typically you'll just use domain class GORM methods to access the different databases, but if you want to run a SQL query or update, you can access the extra datasources two ways. One is with dependency injection. For example if your Datasources.groovy defines a secondary datasource named billing then you can inject that into a service, controller, etc. with the name dataSource_billing, so declaring def dataSource_billing as a class-scope field will inject that datasource, and you could use it with a groovy.sql.Sql instance, e.g. Sql sql = new Sql(dataSource_billing).&lt;br /&gt;&lt;br /&gt;The other way is to use DatasourcesUtils.getDataSource(String dsName), e.g. Sql sql = new Sql(DatasourcesUtils.getDataSource('billing')).&lt;br /&gt;&lt;br /&gt;Java domain classes mapped with hbm.xml&lt;br /&gt;&lt;br /&gt;If you have legacy Java classes mapped with hbm.xml files you can use them by creating a hibernate.cfg.xml in grails-app/conf/hibernate/ for each data source. Note that you can mix hbm.xml-mapped classes with regular GORM classes in a data source. To tell the plugin which data source to use it in, prefix the name of the file with the data source name, e.g. grails-app/conf/hibernate/ds2_hibernate.cfg.xml for a data source named "ds2".&lt;br /&gt;&lt;br /&gt;Refer to the Hibernate documentation on the format for hbm.xml and hibernate.cfg.xml files, but as an example if you have the POJO com.foo.bar.SomeHbmMappedPojo.java and its corresponding com.foo.bar.SomeHbmMappedPojo.xml in "ds2", then your ds2_hibernate.cfg.xml would look like this:&lt;br /&gt;&lt;br /&gt;&lt;?xml version='1.0' encoding='UTF-8'?&gt;&lt;br /&gt;&lt;!DOCTYPE hibernate-configuration PUBLIC&lt;br /&gt;   '-//Hibernate/Hibernate Configuration DTD 3.0//EN'&lt;br /&gt;   'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'&gt;&lt;br /&gt;&lt;br /&gt;&lt;hibernate-configuration&gt;&lt;br /&gt;&lt;br /&gt;&lt;session-factory&gt; &lt;mapping resource='com/foo/bar/SomeHbmMappedPojo.hbm.xml'/&gt; &lt;/session-factory&gt;&lt;br /&gt;&lt;br /&gt;&lt;/hibernate-configuration&gt;&lt;br /&gt;&lt;br /&gt;Usage&lt;br /&gt;&lt;br /&gt;To install the plugin in your application just run the 'install-plugin' Grails script, e.g.&lt;br /&gt;&lt;br /&gt;grails install-plugin datasources&lt;br /&gt;&lt;br /&gt;You might want to use this plugin even if you have only one database. Since you can define a datasource as being read-only and point read-only domain classes at it, your prevent yourself from accidentally creating, deleting, or updating instances.&lt;br /&gt;&lt;br /&gt;I've created a basic (and rather contrived) test application. It has three datasources and five domain classes:&lt;br /&gt;&lt;br /&gt;    * Country, State&lt;br /&gt;    * Library, Book&lt;br /&gt;    * Visit&lt;br /&gt;&lt;br /&gt;Country and State are just lookup tables, so they use a read-only datasource. Visit has a weak foreign key to Library, but this is not enforced since they're stored in two databases. It's the responsibility of the application to ensure that the library id for each visit is valid. This is to simulate having a second database for auditing.&lt;br /&gt;&lt;br /&gt;Download the test app here (this is from the original blog post describing v0.1 of the plugin)&lt;br /&gt;&lt;br /&gt;To test the app:&lt;br /&gt;&lt;br /&gt;    * Create the databases using the scripts (ddl_core.sql, ddl2.sql, and ddl3.sql)&lt;br /&gt;    * run 'grails run-app'&lt;br /&gt;    * Create a new Library at http://localhost:8080/ds_test/library/create&lt;br /&gt;    * Create a new Book at http://localhost:8080/ds_test/book/create&lt;br /&gt;    * check the database to ensure they ended up in the correct database&lt;br /&gt;    * Create a new Visit at http://localhost:8080/ds_test/visit/create&lt;br /&gt;    * check the database to ensure it ended up in the correct database&lt;br /&gt;    * edit a State at http://localhost:8080/ds_test/state/edit/1, save, and note that change didn't take effect due to read-only datasource&lt;br /&gt;    * create a State at http://localhost:8080/ds_test/state/create, save you should see the error page due to read-only datasource&lt;br /&gt;    * test transaction failure at http://localhost:8080/ds_test/transactionTest/fail - you should see the error page and if you check the database nothing should have been inserted&lt;br /&gt;    * test transaction success at http://localhost:8080/ds_test/transactionTest/succeed - you should see a simple success message and if you check the database the inserts should have succeeded&lt;br /&gt;&lt;br /&gt;If you want to manually manage the tables in each database instead of letting Hibernate do it for you, you can use the schema-export script from here to capture the DDL for all the tables. Then you can execute the DDL statements for each database separately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-8593824095681596236?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/8593824095681596236/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/03/grails-datasources-plugin.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8593824095681596236?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/8593824095681596236?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/03/grails-datasources-plugin.html" title="Grails Datasources Plugin" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkAGRX8_eip7ImA9Wx9bFEQ.&quot;"><id>tag:blogger.com,1999:blog-28274498.post-2680289977627224790</id><published>2011-02-24T09:04:00.000+11:00</published><updated>2011-02-24T09:05:24.142+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-24T09:05:24.142+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>JDK自带VM分析工具jps，jstat，jmap，jconsole</title><content type="html">一、概述  &lt;br /&gt;&lt;br /&gt;    SUN 的JDK中的几个工具，非常好用。秉承着有免费，不用商用的原则。以下简单介绍一下这几种工具。(注：本文章下的所有工具都存在JDK5.0以上版本的工具集里，同javac一样，不须特意安装)  。&lt;br /&gt;     &lt;br /&gt;    我一共找到以下四个工具：重点看看jconsole和jmap。&lt;br /&gt;jps&lt;br /&gt;:与unix上的ps类似，用来显示本地的java进程，可以查看本地运行着几个java程序，并显示他们的进程号。 &lt;br /&gt;&lt;br /&gt;jstat&lt;br /&gt;:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 &lt;br /&gt;&lt;br /&gt;jmap&lt;br /&gt;:打印出某个java进程（使用pid）内存内的，所有‘对象’的情况（如：产生那些对象，及其数量）。 &lt;br /&gt;&lt;br /&gt;jconsole&lt;br /&gt;:一个java GUI监视工具，可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。&lt;br /&gt;二、 使用介绍： &lt;br /&gt;     &lt;br /&gt;    1、jstat ：我想很多人都是用过unix系统里的ps命令，这个命令主要是用来显示当前系统的进程情况，有哪些进程，及其 id。 jps 也是一样，它的作用是显示当前系统的java进程情况，及其id号。我们可以通过它来查看我们到底启动了几个java进程（因为每一个java程序都会独占一个java虚拟机实例），和他们的进程号（为下面几个程序做准备），并可通过opt来查看这些进程的详细启动参数。 &lt;br /&gt;    使用方法：在当前命令行下打 jps(需要JAVA_HOME，没有的话，到改程序的目录下打) 。&lt;br /&gt;&lt;br /&gt;可惜没有linux下的ps好用，名称不好用。但是在第四个工具jconsole的界面里面会有具体JAR包的名称。&lt;br /&gt;     &lt;br /&gt;    2、jstat ：对VM内存使用量进行监控。 &lt;br /&gt;    jstat工具特别强大，有众多的可选项，详细查看堆内各个部分的使用量，以及加载类的数量。使用时，需加上查看进程的进程id，和所选参数。以下详细介绍各个参数的意义。 &lt;br /&gt;    jstat -class pid:显示加载class的数量，及所占空间等信息。 &lt;br /&gt;    jstat -compiler pid:显示VM实时编译的数量等信息。 &lt;br /&gt;    jstat -gc pid:可以显示gc的信息，查看gc的次数，及时间。其中最后五项，分别是young gc的次数，young gc的时间，full gc的次数，full gc的时间，gc的总时间。 &lt;br /&gt;    jstat -gccapacity:可以显示，VM内存中三代（young,old,perm）对象的使用和占用大小，如：PGCMN显示的是最小perm的内存使用量，PGCMX显示的是perm的内存最大使用量，PGC是当前新生成的perm内存占用量，PC是但前perm内存占用量。其他的可以根据这个类推， OC是old内纯的占用量。 &lt;br /&gt;    jstat -gcnew pid:new对象的信息。 &lt;br /&gt;    jstat -gcnewcapacity pid:new对象的信息及其占用量。 &lt;br /&gt;    jstat -gcold pid:old对象的信息。 &lt;br /&gt;    jstat -gcoldcapacity pid:old对象的信息及其占用量。 &lt;br /&gt;    jstat -gcpermcapacity pid: perm对象的信息及其占用量。 &lt;br /&gt;    jstat -util pid:统计gc信息统计。 &lt;br /&gt;    jstat -printcompilation pid:当前VM执行的信息。 &lt;br /&gt;    除了以上一个参数外，还可以同时加上 两个数字，如：jstat -printcompilation 3024 250 6是每250毫秒打印一次，一共打印6次，还可以加上-h3每三行显示一下标题。 &lt;br /&gt;     &lt;br /&gt;   3、jmap 是一个可以输出所有内存中对象的工具，甚至可以将VM 中的heap，以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid&gt;a.log可以将其保存到文本中去（windows下也可以使用），在一段时间后，使用文本对比工具，可以对比出GC回收了哪些对象。 jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。 &lt;br /&gt;     &lt;br /&gt;    4、jconsole 是一个用java写的GUI程序，用来监控VM，并可监控远程的VM，非常易用，而且功能非常强。由于是GUI程序，这里就不详细介绍了，不会的地方可以参考ＳＵＮ的官方文档。 &lt;br /&gt;    使用方法：命令行里打 jconsole，选则进程就可以了。 &lt;br /&gt;     &lt;br /&gt;    友好提示：windows查看进程号，由于任务管理器默认的情况下是不显示进程id号的，所以可以通过如下方法加上。ctrl+alt+del打开任务管理器，选择‘进程’选项卡，点‘查看’-&gt;''选择列''-&gt;加上''PID''，就可以了。当然还有其他很好的选项。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;三、参考资料：&lt;br /&gt;&lt;br /&gt;    article:http://elf8848.javaeye.com/blog/442806&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28274498-2680289977627224790?l=suange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://suange.blogspot.com/feeds/2680289977627224790/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://suange.blogspot.com/2011/02/jdkvmjpsjstatjmapjconsole.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2680289977627224790?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28274498/posts/default/2680289977627224790?v=2" /><link rel="alternate" type="text/html" href="http://suange.blogspot.com/2011/02/jdkvmjpsjstatjmapjconsole.html" title="JDK自带VM分析工具jps，jstat，jmap，jconsole" /><author><name>Terry Su</name><uri>https://profiles.google.com/102569865250310036074</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-u7UX4zHcXPg/AAAAAAAAAAI/AAAAAAAACIg/78HKeLcZFOc/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry></feed>

