<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-22167157</id><updated>2011-12-11T18:26:52.749-08:00</updated><title type='text'>The last bit</title><subtitle type='html'>A java developer's understanding.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-22167157.post-8897099657712286587</id><published>2008-03-12T15:59:00.000-07:00</published><updated>2008-03-12T16:01:00.715-07:00</updated><title type='text'>Configure MQ on iSeries</title><content type='html'>To run MQ on iSeries, one must start the MQ subsystem with command:&lt;br /&gt;&lt;br /&gt;strsbs sbsd(qmqm/qmqm)&lt;br /&gt;&lt;br /&gt;Then we can access the queue manager with "wrkmqm" command.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-8897099657712286587?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/8897099657712286587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=8897099657712286587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/8897099657712286587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/8897099657712286587'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2008/03/configure-mq-on-iseries.html' title='Configure MQ on iSeries'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-1190188311029412833</id><published>2008-03-12T15:56:00.000-07:00</published><updated>2008-03-12T15:59:25.146-07:00</updated><title type='text'>Europa catch</title><content type='html'>Europa is the name for Eclipse 3.3 EE version. I recently began to Europa for JEE5 development. Found a big catch. I used Europa with JBoss4.2.2. For some reason I found I can not deploy a class named "TestServlet" as a web service class. No matter what the package name I gave. It always result in error "Allocate exception for servlet TestServlet". Very strange.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-1190188311029412833?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/1190188311029412833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=1190188311029412833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/1190188311029412833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/1190188311029412833'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2008/03/europa-catch.html' title='Europa catch'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-5006487882534503708</id><published>2008-02-20T11:55:00.001-08:00</published><updated>2008-02-20T12:07:02.293-08:00</updated><title type='text'>import signature files from iSeries</title><content type='html'>Here is how I imported the company's digital certificate (key pair) from iSeries machine:&lt;br /&gt;&lt;br /&gt;1. get the KDB file from the iSeries file structure and move it to a windows box&lt;br /&gt;2. Use a java-based tool named iKeyMan.bat to open the key db file. The tool is shipped with Websphere product.&lt;br /&gt;3. export the key pair to an existing "jks" format file which is java keystore. The file will server as the keystore, and can be used to sign jar files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-5006487882534503708?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/5006487882534503708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=5006487882534503708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/5006487882534503708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/5006487882534503708'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2008/02/import-signature-files-from-iseries.html' title='import signature files from iSeries'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-6618641546719127804</id><published>2008-02-07T12:53:00.000-08:00</published><updated>2008-02-07T12:57:17.429-08:00</updated><title type='text'>DB connection error in websphere + iSeries</title><content type='html'>Recently we have a stale connections problems in a WebSphere App server running on iSeries database. I realized the problem might be the getConnection() method is not synchronized(serialized) at the JDBC driver implementation. So two threads can potentially get the same connection and step on each other. It sounds like a bug to me. The solution is easy, just synchronize the code that call getConnection() method, of course, I am assuming the calling class is already in a Singleton mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-6618641546719127804?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/6618641546719127804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=6618641546719127804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/6618641546719127804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/6618641546719127804'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2008/02/db-connection-error-in-websphere.html' title='DB connection error in websphere + iSeries'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-1037560265170437456</id><published>2008-01-18T11:45:00.000-08:00</published><updated>2008-01-18T11:52:18.916-08:00</updated><title type='text'>Some more tips</title><content type='html'>1. I found a cookie problem recently, basically the cookie can not be set from a web app on a linux server. It turned out the server had a very off time. And the cookie expiration time is calculated by current server time + cookie life time. If the server is behind the time too much, it will no set the cookie to the browser any more.&lt;br /&gt;&lt;br /&gt;2. Always use varchar instead of char in DB column design to save space if the column's String length is unknown. In DB2 use varchar type directly, in Oracle we should use varchar2 type since varchar is reserved for other purpose according to one article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-1037560265170437456?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/1037560265170437456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=1037560265170437456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/1037560265170437456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/1037560265170437456'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2008/01/some-more-tips.html' title='Some more tips'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-4323262252428036283</id><published>2007-03-08T13:16:00.000-08:00</published><updated>2007-03-08T13:18:20.491-08:00</updated><title type='text'>Load a resource file in ear environment</title><content type='html'>Three issues&lt;br /&gt;1. the properties files must be in the class path of the application module trying to read it&lt;br /&gt;2. you have to use the correct class loader (Thread.currentThread().getContextClassLoader()).&lt;br /&gt;3. call classloader's getResource(String propResource) method.&lt;br /&gt;&lt;br /&gt;It will not work by simply using ClassLoader.getSystemResource() method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-4323262252428036283?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/4323262252428036283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=4323262252428036283' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/4323262252428036283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/4323262252428036283'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/03/load-resource-file-in-ear-environment.html' title='Load a resource file in ear environment'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-5415651739740809246</id><published>2007-03-01T16:04:00.000-08:00</published><updated>2007-03-01T16:05:29.547-08:00</updated><title type='text'>two tips</title><content type='html'>&lt;strong&gt;Regular Expressions:&lt;/strong&gt;&lt;br /&gt;using $1, $2.. to match find result. use () to group characters. * + are applied after the searching characters. using \w for all alphanumeric char.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How to throw business exception in web service calls.&lt;/strong&gt;&lt;br /&gt;The best way is to define some serializable fields when creating the exception class which will be returned by a web service method call. Otherwise when calling wsdl2java, it will automatically create a message field and getMessage() for you, which will cause problem in RAD tool. The reason for all this I guess is because the Exception class itself is not Serializable, and its fields can not be transfered. So it requires developer to create a subclass of Exception with its own fields to hold the exception code and message. Which can be shown within the fault segment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-5415651739740809246?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/5415651739740809246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=5415651739740809246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/5415651739740809246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/5415651739740809246'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/03/two-tips.html' title='two tips'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-2470449612723208914</id><published>2007-02-20T15:05:00.000-08:00</published><updated>2007-02-20T15:08:11.006-08:00</updated><title type='text'>jsf newbie problem</title><content type='html'>javax.servlet.jsp.JspException: Cannot find FacesContext is often the error you got when you run a jsf enabled page for the first time. For example if you invoke a page using &lt;a href="http://localhost:8080/yourJSFpage.jsp"&gt;http://localhost:8080/yourJSFpage.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Actually you should use  &lt;a href="http://localhost:8080/faces/yourJSFpage.jsp"&gt;http://localhost:8080/faces/yourJSFpage.jsp&lt;/a&gt;  when calling the page.This is required because FacesContext is initialized when the JSF servlet controller is invoked.  Or you can do &lt;a href="http://localhost:8080/yourJSFpage.faces"&gt;http://localhost:8080/yourJSFpage.faces&lt;/a&gt; .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-2470449612723208914?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/2470449612723208914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=2470449612723208914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/2470449612723208914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/2470449612723208914'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/02/jsf-newbie-problem.html' title='jsf newbie problem'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-6616028520393660953</id><published>2007-02-20T13:21:00.000-08:00</published><updated>2007-02-20T13:25:50.661-08:00</updated><title type='text'>Websphere server v6 + Websphere MQ v6 setup</title><content type='html'>I spent 3 whole working days trying to setup Websphere MQ (v6) and Websphere Server (v6). Finally got the sender (session bean) and the receiver (MDB) working.&lt;br /&gt;Here are the things I learned.&lt;br /&gt;1. MQ needs upgrade to v6.0.2 to be connectable from WAS. (must do for donwload trial version)&lt;br /&gt;2. Need to specify the MQ_ROOT_DIR in WAS to synchronize the client jars.&lt;br /&gt;3. Some previous failure deployment file can be stuck in the "profiles/default" temp and wstemp directories. Need to remove them to have a clean startup on WAS.&lt;br /&gt;4. If you want to use websphere default JMS queue (not MQ) , a bus need to be setup.&lt;br /&gt;See&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/websphere/library/techarticles/0504_barcia/0504_barcia.html"&gt;http://www-128.ibm.com/developerworks/websphere/library/techarticles/0504_barcia/0504_barcia.html&lt;/a&gt;5. 5. If you want to use websphere MQ on the same server as WAS, a good tutorial (but for MQ 5.3) is&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/websphere/techjournal/0505_woolf/0505_woolf.html"&gt;http://www-128.ibm.com/developerworks/websphere/techjournal/0505_woolf/0505_woolf.html&lt;/a&gt;&lt;br /&gt;The code might need change though in the finally block of sender. (Don't close a resource if it is null, thus avoid noise exceptions)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-6616028520393660953?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/6616028520393660953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=6616028520393660953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/6616028520393660953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/6616028520393660953'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/02/websphere-server-v6-websphere-mq-v6.html' title='Websphere server v6 + Websphere MQ v6 setup'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-117026972957158527</id><published>2007-01-31T10:55:00.000-08:00</published><updated>2007-01-31T11:02:22.913-08:00</updated><title type='text'>Java Serialization Review</title><content type='html'>Java Serialization is always a tricky place and a hot spot for java job interview. Two important things:&lt;br /&gt;1. If the Super class is not serializable and the sub class is. Then one important requirement is that the Superclass must have a non-arg constructor accessible by the sub class. Otherwise run time exception. Also all the fields in the super class will not be restored through serialization. ( The Default value or values set in the super class constructor will be used for these fields) &lt;br /&gt;&lt;br /&gt;2. If the serializable contains a member variable which is not Serializable. Runtime exception will throw. The easy workaround is to mark the non-serializable object as a static memeber. Static member will not be serialized and default value is used. This also reflect why we should use POJO as much as possible and avoid complex non-serializable objects. Normally these objects are Unit object and should not be included in a transfer object at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-117026972957158527?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/117026972957158527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=117026972957158527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/117026972957158527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/117026972957158527'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/01/java-serialization-review.html' title='Java Serialization Review'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-117026970523094445</id><published>2007-01-31T10:54:00.000-08:00</published><updated>2007-01-31T10:55:05.233-08:00</updated><title type='text'>Websphere session bean remote invokation tips</title><content type='html'>Here is how to access remote session bean in Websphere 6.0 server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For remote session bean lookup, use the following code:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class RemoteTest {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  try {&lt;br /&gt;   Properties prop = new Properties();&lt;br /&gt;   prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");&lt;br /&gt;   prop.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809");&lt;br /&gt;   Context initContext = new InitialContext(prop);&lt;br /&gt;   EchoHome echoHome = (EchoHome) PortableRemoteObject.narrow(&lt;br /&gt;     initContext.lookup("ejb/com/yuan/EchoHome"), EchoHome.class);&lt;br /&gt;   Echo echo = (Echo) PortableRemoteObject.narrow(&lt;br /&gt;     echoHome.create(), Echo.class);&lt;br /&gt;   System.out.println("AAA" + echo.print());&lt;br /&gt;   &lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Two Technical points:&lt;br /&gt;&lt;br /&gt;1. All client side library must be in the classpath to avoid exception.&lt;br /&gt;The easy way is to include all jars under the server/lib dir.&lt;br /&gt;&lt;br /&gt;2. The lookup address should be the raw name of the session bean (including full class name). &lt;br /&gt;It is different from the lookup in the container environment (java:comp/env/ejb/Echo).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-117026970523094445?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/117026970523094445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=117026970523094445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/117026970523094445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/117026970523094445'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2007/01/websphere-session-bean-remote.html' title='Websphere session bean remote invokation tips'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-115868612200493196</id><published>2006-09-19T10:10:00.000-07:00</published><updated>2006-09-19T10:19:15.663-07:00</updated><title type='text'>Hibernate session.</title><content type='html'>Hibernate session management is a little tricky for new users. &lt;br /&gt;There are two ways to obtain a session:&lt;br /&gt;sessionFactory.getCurrentSession();  and&lt;br /&gt;sessionFactory.openSession();&lt;br /&gt;&lt;br /&gt;The first way requires the following line in the hibernate.cfg.xml:&lt;br /&gt;&amp;lt;property name="current_session_context_class"&amp;gt;thread&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;br /&gt;Seems if you use the first method, when you commit a transaction by calling tx.commit(), the session will be closed automatically. This can introduce error if you try to close the session again.&lt;br /&gt;&lt;br /&gt;Whereas if you use the second method, a transaction will not close the session after commit, you will have the chance to manually close the session. &lt;br /&gt;&lt;br /&gt;The above comments applies for hibernate 3.1, I used it with Tomcat5.5 datasource on Java1.4&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-115868612200493196?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/115868612200493196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=115868612200493196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115868612200493196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115868612200493196'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/09/hibernate-session.html' title='Hibernate session.'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-115652757920401344</id><published>2006-08-25T10:36:00.000-07:00</published><updated>2006-08-25T10:39:39.216-07:00</updated><title type='text'>why need to synchonize on an object before calling wait method</title><content type='html'>A very nice answer I found online:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Just to reinforce things. The reason to call wait() is because you are waiting for a particular state to be achieved - which will be signified by someone calling notify or notifyAll. That state has to be, by definition, shared mutable state (it is shared between you and the notifier thread and it must be mutable or you will be waiting a very very very long time). As you know access to shared mutable state must always be performed while holding a suitable lock (AtomicXXX and lock-free concurrent collections not-withstanding). So you have to hold the lock to check the state you are going to wait() upon. The wait() atomically releases the lock and suspends the thread. The notification thread then acquires the lock, modifies the state and calls notify()/notifyAll(). At that point the wait()ing thread is removed from the wait-set and is now waiting to reacquire the lock that the notifying thread may not have yet released. When the waiting thread returns from wait() it owns the lock again and should then re-check the state to see if the new state is what it is waiting for. If it is then, generally, while still holding the lock the thread performs some action that relied on the object being in the state it waited for.&lt;br /&gt;&lt;br /&gt;Note that wait() must always be called in a loop testing the condition being waited upon. Spurious wakeups are permitted and do occur.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To me, I think the reason of requiring the synchonization is to ensure the atomicity of "checking the status and wait" operations. So that no other thread can change the status in the middle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-115652757920401344?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/115652757920401344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=115652757920401344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115652757920401344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115652757920401344'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/08/why-need-to-synchonize-on-object.html' title='why need to synchonize on an object before calling wait method'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-115505954738829876</id><published>2006-08-08T10:39:00.000-07:00</published><updated>2006-08-08T10:52:27.400-07:00</updated><title type='text'>xsd:all tag</title><content type='html'>I am using xsd schema to validate xml files and using xsd:all tag to group elements. Based on w3 documents, the default minOccurs of an element in xsd:all should be zero. (meaning it can just not show up without explicitly set its minOccurs to zero). But I found this is not true for any xsd validators I tested (XML spy, xerces SAXParser). I have to set the minOccurs to zero for each element if I want it to be optional. &lt;br /&gt;What makes thing worse is the misleading parsing error message when I am using xerces packages in java. I started testing adding minOccurs attributes to some elements to see if this will solve the problem. However the error message does not change, i.e. the element I just added 'minOccurs=0' still seems mandatory based on the error message. I guess this is a bug in the xerces package. Only utill I fixed all the elements, the error message is gone. Whereas in XML spy, it's much better. Whenever I added minOccurs for an element, I can see it is no longer required when I try to validate the xml. This is how I figured the default value of minOccurs for elements in xsd:all group is &lt;strong&gt;one&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-115505954738829876?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/115505954738829876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=115505954738829876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115505954738829876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115505954738829876'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/08/xsdall-tag.html' title='xsd:all tag'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-115446990669493823</id><published>2006-08-01T14:49:00.000-07:00</published><updated>2006-08-01T15:16:03.083-07:00</updated><title type='text'>Install PHP5 with Apache2 and mysql on windows</title><content type='html'>Today I installed php5 on my working desktop to edit my baby's website: www.qqvivian.com.&lt;br /&gt;Here is my experience:&lt;br /&gt;Windows + Apache 2 + PHP 5 installation (This only applies to Apache 2.0.x, for 2.2.x, the dll doesn't work)&lt;br /&gt;&lt;br /&gt;1. Install Apache.&lt;br /&gt;2. Unzip PHP to a directory, add it to path and PHP_HOME&lt;br /&gt;3. Copy php\php.ini-recommended to windows\php.ini&lt;br /&gt;4. Edit php.ini, set doc_root to apache htdocs directory&lt;br /&gt;5. Edit php.ini, set extension_dir, uncomment extension=php_bz2.dll.&lt;br /&gt;6. Install php as Apache module: Add the following lines to "httpd.conf" file under apache conf directory. &lt;br /&gt;   LoadModule php5_module "php/php5apache2.dll"&lt;br /&gt;   AddType application/x-httpd-php .php&lt;br /&gt;7. Add test page phpinfo.php, restart Apache to see.&lt;br /&gt;&lt;?php  phpinfo(); ?&gt; &lt;br /&gt;&lt;br /&gt;Everything is easy, except one tricky point. The above steps work only for Apache version 2.0.x, it will not work for latest 2.2.x. Obviously the php dll files are not fresh for 2.2.x.&lt;br /&gt;&lt;br /&gt;After that, I try to configure php working with existing mysql database:&lt;br /&gt;Still everything is clear, two steps involved: uncomment php_mysql.dll ext in php.ini and expose "libmysql.dll" file in "path". However this will not work, I am getting the error of: "PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\\php\\ext\\php_mysql.dll' - The specified module could not be found.\r\n in Unknown on line 0"&lt;br /&gt;&lt;br /&gt;After google for a while I found an excellent solution: &lt;br /&gt;&lt;br /&gt;http://www.codecomments.com/PHP_Language/message274647.html&lt;br /&gt;&lt;br /&gt;You have to copy "libmysql.dll" file to "windows\system32" directory. Yes, I know, it is already in the Path, you still have to do it. I believe it is related to windows security issue set by MS. Seems this is a very common problem, but the answer is not so obvious from php or mysql website. I update a wiki to post the solution:&lt;br /&gt;&lt;br /&gt;http://www.cementhorizon.com/wiki/index.php/&lt;br /&gt;Solution_:_Unable_to_load_dynamic_library_C:phpextphp_mysql.dll_-_the_specified_module_could_not_be_found.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-115446990669493823?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/115446990669493823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=115446990669493823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115446990669493823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115446990669493823'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/08/install-php5-with-apache2-and-mysql-on.html' title='Install PHP5 with Apache2 and mysql on windows'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-115394092508326751</id><published>2006-07-26T11:55:00.000-07:00</published><updated>2006-07-26T12:08:45.093-07:00</updated><title type='text'>XML special character</title><content type='html'>XML understand only thress special characters "&amp; lt;", "&amp; gt;" and "&amp; amp;"&lt;br /&gt;While copying data from html to xml, must be very careful.&lt;br /&gt;Most common error happens for "&amp; nbsp;" which is not allowed in xml/xsl without a declaration.&lt;br /&gt;Fix: change "&amp; nbsp; " to " &amp; #160; " before push it to xml doc.&lt;br /&gt;&lt;br /&gt;Also we should change "&lt;" to "&amp; lt;", "&gt;" to "&amp; gt;" before push.&lt;br /&gt;Also note "&amp;" is not allowed for xml doc, however in most HTML pages it has already been changed to "&amp;amp; amp;", which will be valid in XML, so we don't need to take care of this case generally.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-115394092508326751?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/115394092508326751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=115394092508326751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115394092508326751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/115394092508326751'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/07/xml-special-character.html' title='XML special character'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114531286031759106</id><published>2006-04-17T15:22:00.000-07:00</published><updated>2006-04-17T15:27:40.326-07:00</updated><title type='text'>A great tip ^M</title><content type='html'>Today I spent a while fixing the famous ^M problem when copying file from DOS to Unix.&lt;br /&gt;&lt;br /&gt;Find two solutions:&lt;br /&gt;1. Use dos2unix command can convert a dos file to unix format (removing annoying ^M)&lt;br /&gt;2. Since originally the dos files are introduced through CVS checkin. If I change the the file type from "binary" to "ASCII" in eclipse. CVS will figure out the file format and automatically remove ^M for me.&lt;br /&gt;&lt;br /&gt;One note:&lt;br /&gt;If you open a dos file using vi in Unix environment. vi won't show ^M for you since vi will open the file as dos format. I didn't know this initially.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114531286031759106?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114531286031759106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114531286031759106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114531286031759106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114531286031759106'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/04/great-tip-m.html' title='A great tip ^M'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114435281940310762</id><published>2006-04-06T12:44:00.000-07:00</published><updated>2006-04-06T12:46:59.426-07:00</updated><title type='text'>Still about oracle time</title><content type='html'>Oracle time setup is complicated: You have following choices to retrieve timezone and time info:&lt;br /&gt;&lt;br /&gt;select to_char(sysdate,'YYYY-MM-DD HH:MI') from dual;&lt;br /&gt;select dbtimezone from dual;&lt;br /&gt;select current_timestamp from dual;&lt;br /&gt;select sessiontimezone from dual;&lt;br /&gt;select systimestamp from dual;&lt;br /&gt;&lt;br /&gt;One strange one I encountered today is while I am using the oracle advanced queue (AQ). There are columns named ENQ_TIME and TIME_MANAGER_INFO. Both are autogenerated fields. For ENQ_TIME, oracle use the timezone time (local time); for TIME_MANAGER_INFO, oracle use GMT time! Strange&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114435281940310762?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114435281940310762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114435281940310762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114435281940310762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114435281940310762'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/04/still-about-oracle-time.html' title='Still about oracle time'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114408656640206987</id><published>2006-04-03T10:47:00.000-07:00</published><updated>2006-04-03T10:49:26.420-07:00</updated><title type='text'>Oracle reference.</title><content type='html'>I always forget Oracle's way of retriving the current timestamp. &lt;br /&gt;&lt;br /&gt;"select sysdate from dual;" &lt;br /&gt;&lt;br /&gt;Next time I can come here to look it up. &lt;br /&gt;&lt;br /&gt;Also a very useful oracle reference:&lt;br /&gt;&lt;br /&gt;http://www.cit.uws.edu.au/docs/oracle/ddd/faq.php&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114408656640206987?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114408656640206987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114408656640206987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114408656640206987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114408656640206987'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/04/oracle-reference.html' title='Oracle reference.'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114349313764757110</id><published>2006-03-27T12:46:00.000-08:00</published><updated>2006-03-28T22:59:32.060-08:00</updated><title type='text'>Wasting of time</title><content type='html'>Last Friday is a bad day for me. I spent three hours in deploying an Eclipse plugin. The plugin was written by another developer. I copied it into my Eclipse plugin directory, everything is fine. Then I made some source code changes and recompiled the package using "javac" and "ant jar" commands. Copied the new jar to plugin directory. It just did not work. Giving me "class not found" exception when Eclipse tried to load the plugin. &lt;br /&gt;&lt;br /&gt;AfterI read some online guides about writing Eclipse plugins, I figured out how. Seems I have to create an eclipse plugin project, write the source file, test the plugin using Eclipse runtime test environment, then export the plugin. The magical thing is in the export phase, some meta data is generated for the plugin and saved in a property file, which will be used in plugin deployment. Also I noticed potentially there are two ways of organization of eclipse plugin file, possibly depending on the Eclipse version. I still haven't figured out why my original way of compiling and packaging failed. Because I manually inserted some meta data too.&lt;br /&gt;&lt;br /&gt;One lesson, when you are new to something, better stick with a tutorial first. Don't think you know how things work and waste time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114349313764757110?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114349313764757110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114349313764757110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349313764757110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349313764757110'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/03/wasting-of-time.html' title='Wasting of time'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114349229066012846</id><published>2006-03-27T12:30:00.000-08:00</published><updated>2006-03-28T22:50:36.940-08:00</updated><title type='text'>Perforce vs CVS</title><content type='html'>In my current job, I am required to use Perforce to do version controlling. Perforce is a better versioning tool than CVS, more advanced, complicated and stable. Since I always use Eclipse as my Java IDE, I tried to find a good Perforce plugin for Eclipse. The result is not so good.&lt;br /&gt;&lt;br /&gt;I didn't find a tool that can have "Team Synchronization" view like the CVS plugin. So when somebody else editted and checked in (submitted) a file which I didn't open for edit in my client space. I will not know such changes in Perforce. Whereas such change is very easy to view when I do a "Team Synchronization" using default CVS plugin with Eclipse. So now I can only blindly update the files I didn't open for edit in Perforce. I really don't like this idea. &lt;br /&gt;&lt;br /&gt;Another thing I don't like is that you have to manually mark a file "Open for add" (Or delete) before you can check in(submit) the change into the depot in Perforce. When you create a file using CVS plugin, a nice commit sign will be posted on the file you just created in the Team Synchronization view, which reminds you this is a new file that should be checked into CVS. &lt;br /&gt;&lt;br /&gt;I guess the CVS plugin is so proactive which makes me like CVS, even though I know it's not perforce's fault. I just can't find a tool equivalently powerful as the CVS plugin for Perforce. I have to live with how things work and hopefully I will like it after a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114349229066012846?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114349229066012846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114349229066012846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349229066012846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349229066012846'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/03/perforce-vs-cvs.html' title='Perforce vs CVS'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-114349111445961923</id><published>2006-03-27T12:18:00.000-08:00</published><updated>2006-03-28T22:47:33.140-08:00</updated><title type='text'>Hibernat hates Spring</title><content type='html'>Hibernate is a cool object-database mapping tool. Spring a J2EE framework. They work together greatly in my previous job. Today I saw an interesting article.&lt;br /&gt;&lt;br /&gt;http://houseofhaug.net/blog/archives/2005/08/12/hibernate-hates-spring/&lt;br /&gt;&lt;br /&gt;I think the reason is Hibernate don't want Spring to limit its usage. Since it is a product supported by JBoss now, hibernate wants more freedeom. Not only to change its interface easier, but also upgrade itself into a framework tool, which is what Spring has been doing.&lt;br /&gt;&lt;br /&gt;Enterprise tools just seem to be growing more and more complex and difficult to use. I hope I can still stick with EJB2 with the help of a nice eclipse plugin named Lomboz. It has some limitations, but very nice after played for a while.&lt;br /&gt;&lt;br /&gt;Today, sounds like EJB3(Hibernate3) is the only solution. I have read some tutorial to able to discuss with people about J2EE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-114349111445961923?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/114349111445961923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=114349111445961923' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349111445961923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/114349111445961923'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/03/hibernat-hates-spring.html' title='Hibernat hates Spring'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22167157.post-113944884671105626</id><published>2006-02-08T17:33:00.000-08:00</published><updated>2006-03-28T22:43:46.420-08:00</updated><title type='text'>Motive</title><content type='html'>I realize it might be a good idea to record my daily programming life. That way, it will be nice to be able to review what I did in the past. To see the evolution of the languages and tools I have been using, to see the evolution of my professional life. A little about myself: I am a software engineer, 29 years old, love the programming job I am doing. I have a lovely wife and daughter.   [last updated 10:42pm March 28 2006]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22167157-113944884671105626?l=lastbit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lastbit.blogspot.com/feeds/113944884671105626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22167157&amp;postID=113944884671105626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/113944884671105626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22167157/posts/default/113944884671105626'/><link rel='alternate' type='text/html' href='http://lastbit.blogspot.com/2006/02/motive.html' title='Motive'/><author><name>Peter</name><uri>http://www.blogger.com/profile/05882774152485283391</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
