CPAN Suggests
James McMurry sent me this link to CPAN today. It does the "Google Suggest" thing for CPAN.
Has anyone done similar in Java?
Blogging Year In Review: 2004
I'm done for the year work-wise, and probably blog-wise. So this is as good a time to take a look back on the blogs that I wrote this year.
January
My adventures of installing Windows on the Second Hard Drive (Linux on the First) still gets a lot of hits from Google by people who wants to do the same.
I wanted a Patterns of GUI Application Architecture book. One that's a level above the Swing books, and one level below the User Experience books. SourceBeat's Desktop Java Live might be just such a book.
February
I wrote about Subversion for the first time. I would write about it several more times later. But, as 2004 draws to a close, I'm still using CVS as my source control tool here at home. Inertia is to blame. I have very good reasons to switch to Subversion. But I don't have any good reason to switch away from CVS.
March
The No Fluff Just Stuff Java conference was here in St. Louis. It will come back in March 18-20, 2005. I highly recommend it.
April
I learned about spurious wakeup in a comment by Tom Hawtin to my Thread Synchronization Puzzle blog entry.
I appreciate all the comments left on my blog.
May
I talked about Mono and BeanShell. Both a solid technoligies without a lot of hype but does a lot of things. I haven't installed Mono since I upgraded to FC3 yet because the yum repo for Mono 1.0.5 on FC3 does not exist.
June
I had a little bit fun at JavaOne's expense. What I didn't expect was that this entry was later cited in a blog entry by Bob Sutor, IBM's Director of WebSphere Product and Market Management in IBM's Software Group. Makes me wonder how blog entries are propogated in the blogosphere.
I had a blog entry about the Home Edition of XML Spy. This is another one of those, I heard about it, I downloaded it, I installed it, but I never really used it items.
July
Unlike XMLSpy, I did use the Free Together Designer From Borland. The fact that it's written in Java and runs on Linux might have something to do with it. A Borland sales rep called me a few days later asking me when I will buy Together Control Center. I felt really guilty for not planning to purchase within the next 12 months.
August
I predicted that Sun will never open source Java. Now that we've learned IBM's plans on open sourcing Java, maybe the day will come when Java is bundled with my Linux distribution. And that's all I'm asking for.
September
I made a blunder with this silly blog entry. But I drew a lot of hits with this one.
October
The good times are back! Java jobs made a strong resurgence in October. All indications is that it will go on strong for as long as the eye can see!
October also saw the launch of Google Desktop Search. Unfortunately, the download-install-forget cycle is repeated for Google Desktop Search. During the last couple of months, I have attempted to use it only a handful times and each time I did not find what I need. The locate command from Cygwin was far more useful for me (I have a cron job that runs updatedb --localpaths='c:/' at midnight).
November
In case you missed it, I love JPackage.org.
December
I haven't blogged it yet, but Eric Burke gave a fantastic presentation on Hibernate at the OCI Java Lunch. He will bring the talk to the St. Louis JUG in April 2005.
There's my year of blogging in 2004.
Have a Merry Christmas and a Happy New Year.
I'll see you in 2005.
Welcome To The World of Timing Glitches and Race Conditions
For those of you who don't understand what I was talking about four days ago in The Case Against Web Applications, please go read Joel on Software.
Joel Spolsky: The bug: often, the timing is such that the Google Suggest popup appears after I type Joel but before I click the mouse, so I think I'm clicking on the "Google Search" button intending to search for, say, Joel, not that I would search for myself, after all, I'm right here, but I'm really clicking on the popup listbox item for "Joel Turner", whoever that is. Any relation to Tina? Or Bachman?
... That's what I meant by "raising the bar."
CD Burning in Fedora Core 3---A Tip
I reported the troubles I had in burning CDs in Fedora Core 3 36 days ago. Yesterday, I revisited the Fedora Core 3 Tips and Tricks, and spotted a tip posted by Chris McBride on December 7:
The following works for me to burn a CD cdrecord --scanbus cdrecord -v dev=ATA:1,0,0 -eject -speed=4 image.iso
I tried it and it worked. I was able to burn the FC3 ISO onto a CD and it passed the media check.
Thanks Chris.
The Case Against Web Applications
The recent release of the Google Suggest has the community buzzing with amazement, grand predictions, frantic reverse engineering, and hectic explanations.
Ever the contrarian, I would like to pour some cold water onto the whole circus. Think, people, think!
Here's some questions to ask:
- What is the essential feature of the browser that made Google Suggest possible?
- When did this feature first appear in a browser? Which browser? What version?
- Why haven't we been using it for the many years since the feature first appeared?
- Who invented this feature? What is he doing now?
- How much did it cost to develop Google Suggest?
- What kind of processing power and bandwidth is needed to host the server side components in support of this feature?
Now, for something completely different: Who is Kevin Gibbs? Which company does he work for? What does he do during the 80% of the time when he's not doing the "20% time, any project you want" thing?
Finally, just to make it sting a little for the JavaBlogs crowd: Was it written in Java? J2EE? IoC Containers? Or was it written in Python (Paul Graham-ish grin)?
Now, my challenge: Do you have a little bitty search box on your blog? Now go ahead and make it behave just like Google Suggest!
Spring 1.1.3 Comes To JPackage.org
Last night, while I was asleep, yum, the Fedora Core 3 automatic system update daemon, quitely pulled down Spring 1.1.3 from JPackage.org.
(Also last night, a power outage knocked me off the internet for several hours, but that happened several minutes after the update.)
The RPMs at JPackage.org are getting more and more up-to-date now.
How Many Days Ago Was That?
After doing my "how many days ago" calculation in my head once too many, I set out to find a way to let my computer do the work. After trying Java and C, I settled on this bash script:
[weiqi@gao] $ cat ~/bin/daysago #!/bin/bash # # Usage: daysago [date] # bc <<<`date +%j`-`date -d $1 +%j` [weiqi@gao] $ daysago 11/23 18
Can you name all the bash features used in this script?
Google Suggest
Jonathan Pollack: Since we're all quite familiar with Google's advanced features, give this a try...:
In Case You Cared
如果你关心VC 2005的话,你应该阅读Stan Lippman的blog.
http://blogs.msdn.com/slippman
Stan Lippman写的<<C++ Primer>>,可能是世界上最流行的C++入门书了.
I don't think the above quote will come out right on some browsers and agregators, but here is the translation anyway:
In case you cared about VC 2005, you should read Stan Lippman's blog.
http://blogs.msdn.com/slippman
Stan Lippman's C++ Primer is probably the most popular introductory C++ book in the world.
Tapestry Presentation Posted
Rob Smith: I presented on Tapestry tonight at the St. Louis Java Users Group. Here's a link to the presentation in pdf format.
Tapestry At The JUG Tonight
Tonight's topic at the JUG will be Tapestry. Rob Smith from OCI will present. Rob also wrote an JNB article on the topic earlier this year.
Come on down to One City Place at 6:30pm today (Thursday December 9, 2004).
Sun To Add Java Bytecode In Support Of Scripting Languages
Tim Bray: All this is inefficient. So it might be worthwhile to add a new bytecode to the JVM to help with at least some of this choreography and housekeeping; especially since it doesn
Google Groups Date Based Search Is Back
Just visited Google Groups Beta Advanced Search. I'm happy to find that the date based search is back! (see)
What JPackage.org Brought To My Computer
It's been a couple of weeks since I started using JPackage.org to manage my Java packages. I'm happy to report that it has changed my behavior, for the better: I stopped manually downloading and installing packages that are included in JPackage.org.
The number of packages included in JPackage.org is staggering. It would take me weeks if not months to install all of them by hand. I'll append a list of all the packages at the end of this post.
Whereas in the past, every time I install something, I have to inspect its lib directory to see if any of its required libraries are already installed as part of some other package. That's something that I don't have to worry about with JPackage.org.
The nightly yum update script that Fedora Core 3 runs help keeping the packages fresh.
The tomcat, jetty, jonas, jboss packages are already integrated with the Linux's service management system. I can start them as services with one simple command. I can also configure them to be started at boot time without too much effort.
Because everything is in RPM, I can use RPM queries to inspect the state of any package. The list at the end of this post is constructed using the rpm -qa and rpm -qi commands (and a bit of awk and vi.)
I still need to understand more thoroughly the way JPackage.org organizes jar files. But I can definitely see the usefulness of the commands provided by the jpackage-utils package:
[weiqi@gao] $ build-classpath rhino xmlbeans bsh2 /usr/share/java/rhino.jar:/usr/share/java/xmlbeans/xbean-1.0.3.jar:/usr/share/ja va/xmlbeans/xmlpublic-1.0.3.jar:/usr/share/java/xmlbeans/xbean_xpath-1.0.3.jar:/ usr/share/java/bsh2/bsh-reflect-2.0.jar:/usr/share/java/bsh2/bsh-commands-2.0.ja r:/usr/share/java/bsh2/bsh-util-2.0.jar:/usr/share/java/bsh2/bsh-classgen-2.0.ja r:/usr/share/java/bsh2/bsh-bsf-2.0.jar:/usr/share/java/bsh2/bsh-core-2.0.jar:/us r/share/java/bsh2/bsh-classpath-2.0.jar
The /usr/bin/ant script (the /opt/apache-ant-1.6.2/bin/ant script before I switched to JPackage.org) uses build-classpath to gather its own classpaths. But I don't know how to use it from inside my own Ant build scripts yet.
I wish JPackage.org could be made to work on Windows, probably with the help of Cygwin.
Here's the list:
abbot-0.13.0 adaptx-0.9.6 adaptx-doc-0.9.6 aelfred-1.2 ant-1.6.2 ant-antlr-1.6.2 ant-apache-bcel-1.6.2 ant-apache-bsf-1.6.2 ant-apache-log4j-1.6.2 ant-apache-oro-1.6.2 ant-apache-regexp-1.6.2 ant-apache-resolver-1.6.2 ant-commons-logging-1.6.2 ant-commons-net-1.6.2 ant-contrib-0.6 ant-jai-1.6.2 ant-jalopy-1.0 ant-javamail-1.6.2 ant-jdepend-1.6.2 ant-jmf-1.6.2 ant-jsch-1.6.2 ant-junit-1.6.2 antlr-2.7.4 antlr-jedit-2.7.4 ant-nodeps-1.6.2 ant-scripts-1.6.2 ant-swing-1.6.2 anttex-0.2 ant-trax-1.6.2 aopalliance-1.0 argouml0.15-0.15.4 ashkelon-0.8.2 asm-1.4.1 aspectj-1.1.1 aspectj-installer-1.1.1 aspectwerkz-0.9 attrib4j-0.9.0 autojar-1.2.2 avalon-excalibur-4.1 avalon-excalibur-scratchpad-4.1 avalon-framework-4.1.4 avalon-logkit-1.2 axion-1.0 axis-1.1 batik-1.5 batik-rasterizer-1.5 batik-slideshow-1.5 batik-squiggle-1.5 batik-svgpp-1.5 batik-ttf2svg-1.5 bcel-5.1 blowfish-j-2.12 bouncycastle-1.25 bouncycastle-jdk1.4-1.25 bouncycastle-jdk1.5-1.25 bsf-2.3.0 bsh-1.3.0 bsh2-2.0 bsh2-bsf-2.0 bsh2-classgen-2.0 burlap-2.1.12 c3p0-0.8.4.1 carol-1.5.1 castor-0.9.5 castor-doc-0.9.5 castor-test-0.9.5 castor-xml-0.9.5 catchxsl-1.2.1 catchxsl-themes-1.2.1 cglib1-1.0 cglib-2.0.2 checkstyle-3.4 checkstyle-optional-3.4 c-jdbc-1.0.4 classpathx-jaf-1.0 classpathx-jaxp-1.0 classpathx-jaxp-scripts-1.0 classpathx-mail-1.0 classworlds-1.0 colt-1.1.0 colt-hep-1.1.0 concurrent-1.3.2 corejava-format-1.22 cos-multipart-0.05Nov2002 cpptasks-1.0 crimson-1.1.3 cryptix-3.2.0 cryptix-asn1-20011119 cryptix-pgp-3.2.0 daim-0.9.2 daim-scripts-0.9.2 db-ojb-1.0.1 db-torque-3.1 db-torque-gen-3.1 dnsjava-1.5.1 docbook-xsl-java-saxon-1.67.0 docbook-xsl-java-xalan-1.67.0 dom4j-1.5 dresden-ocl-1.1 dresden-ocl-argo-1.1 dtdparser-1.21 dynamicjava-1.1.5 easymock-1.1 easymockclassextension-1.1 eclipse-gef-3.0.1 eclipse-gtk2-3.0.1 eclipse-jdt-3.0.1 eclipse-pde-3.0.1 eclipse-platform-3.0.1 eclipse-scripts-3.0.1 eclipse-source-3.0.1 ecs-1.4.2 ehcache-0.9 ehcache-bootstrap-2.1.6.0.9 ejb-2.1 fastutil-4.3.1 flute-1.3 fop-0.20.5 forehead-1.0.b4 fractal-2.2 freemarker-2.3 gcviewer-1.15 gef-0.10.2 geronimo-modules-1.0 geronimo-specs-1.0 gjt-jpl-pattern-0.2 gjt-jpl-util-0.6 gnu-crypto-2.0.1 gnu-crypto-sasl-jdk1.4-2.0.1 gnu.getopt-1.0.9 gnu.regexp-1.1.4 gnu.trove-1.0.2 gvf-1.36 hessian-2.1.12 hibernate-2.1.6 howl-logger-0.1.7 hsqldb-1.72.3 ht2html-2.0 html-parser-1.02 httpunit-1.6 i18n-lib-0.1.3 ibatis1-1.3.1 ibatis-2.0.6 isorelax-20030108 isorelax-bootstrap-20030108 itext-1.02b j2ee-connector-1.5 j2ssh-0.2.7 jacorb-2.2 jai-1.1.2 jakarta-commons-attributes-2.1 jakarta-commons-beanutils-1.7.0 jakarta-commons-betwixt-1.0 jakarta-commons-cli-1.0 jakarta-commons-codec-1.3 jakarta-commons-collections-3.1 jakarta-commons-configuration-1.0.d3 jakarta-commons-daemon-1.0 jakarta-commons-daemon-jsvc-1.0 jakarta-commons-dbcp-1.2.1 jakarta-commons-dbutils-1.0 jakarta-commons-digester-1.6 jakarta-commons-discovery-0.2 jakarta-commons-el-1.0 jakarta-commons-fileupload-1.0 jakarta-commons-grant-1.0.b5.cvs20040118 jakarta-commons-graph-0.8.1.cvs20040118 jakarta-commons-httpclient-2.0.2 jakarta-commons-io-1.0.cvs20040118 jakarta-commons-jelly-1.0 jakarta-commons-jelly-tags-ant-1.0 jakarta-commons-jelly-tags-antlr-1.0 jakarta-commons-jelly-tags-avalon-1.0 jakarta-commons-jelly-tags-bean-1.0 jakarta-commons-jelly-tags-betwixt-1.0 jakarta-commons-jelly-tags-bsf-1.0 jakarta-commons-jelly-tags-define-1.0 jakarta-commons-jelly-tags-dynabean-1.0 jakarta-commons-jelly-tags-email-1.0 jakarta-commons-jelly-tags-html-1.0 jakarta-commons-jelly-tags-http-1.0 jakarta-commons-jelly-tags-interaction-1.0 jakarta-commons-jelly-tags-jaxme-1.0 jakarta-commons-jelly-tags-jetty-1.0 jakarta-commons-jelly-tags-jms-1.0 jakarta-commons-jelly-tags-jmx-1.0 jakarta-commons-jelly-tags-jsl-1.0 jakarta-commons-jelly-tags-junit-1.0 jakarta-commons-jelly-tags-log-1.0 jakarta-commons-jelly-tags-ojb-1.0 jakarta-commons-jelly-tags-quartz-1.0 jakarta-commons-jelly-tags-soap-1.0 jakarta-commons-jelly-tags-sql-1.0 jakarta-commons-jelly-tags-swing-1.0 jakarta-commons-jelly-tags-threads-1.0 jakarta-commons-jelly-tags-util-1.0 jakarta-commons-jelly-tags-validate-1.0 jakarta-commons-jelly-tags-velocity-1.0 jakarta-commons-jelly-tags-xml-1.0 jakarta-commons-jelly-tags-xmlunit-1.0 jakarta-commons-jexl-1.0 jakarta-commons-jxpath-1.2 jakarta-commons-lang-2.0 jakarta-commons-latka-1.0 jakarta-commons-launcher-0.9 jakarta-commons-logging-1.0.4 jakarta-commons-messenger-1.0.d10 jakarta-commons-modeler-1.1 jakarta-commons-net-1.2.2 jakarta-commons-pool-1.2 jakarta-commons-primitives-1.0 jakarta-commons-validator-1.1.3 jakarta-poi-2.5 jakarta-slide-server-2.0 jakarta-slide-server-webapps-tc4-2.0 jakarta-slide-webdavclient-2.0 jakarta-taglibs-standard-1.1.1 jakarta-turbine-jcs-1.0 jal-20031117 jalopy-1.0 jalopy-console-1.0 jasper4-4.1.30 jasper5-5.0.19 jasperreports-0.5.2 java-1.4.2-gcj-compat-1.4.2.0 java-1.4.2-gcj-compat-devel-1.4.2.0 java-1.4.2-sun-1.4.2.06 java-1.4.2-sun-alsa-1.4.2.06 java-1.4.2-sun-devel-1.4.2.06 java-1.4.2-sun-src-1.4.2.06 java-1.5.0-sun-1.5.0 java-1.5.0-sun-alsa-1.5.0 java-1.5.0-sun-devel-1.5.0 java-1.5.0-sun-fonts-1.5.0 java-1.5.0-sun-jce-policy-1.5.0 java-1.5.0-sun-plugin-1.5.0 java-1.5.0-sun-src-1.5.0 javacc-3.2 java_cup-0.10 javagroups-2.1.1 javalayer-0.4 javassist-3.0 jaxen-1.1 jaxen-bootstrap-1.1 jboss4-aop-4.0.0 jboss4-buildmagic-tasks-2.0 jboss4-cache-4.0.0 jboss4-common-4.0.0 jboss4-jmx-4.0.0 jboss4-system-4.0.0 jcifs-1.1.2 jclasslib-2.0 jclasslib-scripts-2.0 jcommon-0.9.7 jcommon-test-0.9.7 jcoverage-1.0.5 jcrontab-1.4.1 jdepend22-2.2 jdepend-2.6 jdiff-1.0.9 jdo-1.0.1 jdom-1.0 jd.xslt-1.5.5 jd.xslt-scripts-1.5.5 jedit-4.2 jetty4-4.2.20 jetty5-5.0.0 jexcelapi-2.4.3 jext-3.2 jfreechart-0.9.20 jftp-1.44 jgroups-2.2.6 jing-20030619 jisp2-2.5.1 jisp3-3.0.0 jlex-1.2.6 jline-0.8.1 jmi-1.0 jmock-1.0.0 jms-1.1 joesnmp-0.3.2 jonathan-3.1 jonathan-core-4.0 jonathan-jeremie-4.0 joram-4.1.0 joscar-0.9.3 jotm-1.5.3 jpackage-utils-1.6.1 jrefactory-2.8.9 jrexx-1.1.1 jruby-0.7.0 jsch-0.1.17 jsf-1.1.01 jswat-2.20 jta-1.0.1 jtidy-1.0 jtidy-scripts-1.0 jtopen-4.2 junit-3.8.1 junitdoclet-jdk14-1.0.2 junitejb-1.0 junitperf-1.8 jwebunit-1.1.1 jython-2.2 jzlib-1.0.5 kilim-2.0.32 kunststoff-2.0.2 kxml-2.1.8 ldapjdk-4.17 ldapsdk-4.17 libswt3-gtk2-3.0.1 limewire-3.5.6 log4j-1.2.8 logi.crypto-1.1.2 lucene-1.3 maybeupload-1.1.0 metouia-1.0 mg4j-0.9.1 mockobjects-0.09 mockobjects-alt-httpclient-0.09 mockobjects-alt-jdk1.4-0.09 mockobjects-httpclient-0.09 mockobjects-jdk1.4-0.09 mod_jk-ap20-1.2.6 monolog-1.8.3 msv-strict-1.2 mx4j-2.0.1 mysql-connector-java-3.0.14 nanoxml-2.2.3 nanoxml-lite-2.2.3 nekohtml-0.9.3 netcomponents-1.3.8 nsuml-1.4.0 objectweb-anttask-1.2 objectweb-deploysched-0.2 odmg-3.0 oldgef-0.9.6 oldi18n-lib-0.1 oldj2ssh-0.1.7 oldjavalayer-0.1.1 oldjdom-1.0 oldkilim-1.1.3 oldkxml-1.21 oldlogi.crypto-1.0.7 oldrhino-1.5 openejb-2.0 openorb-1.2.0 oro-2.0.8 oscache-2.0.2 p6spy-1.3 pdfbox-0.6.6 pell-multipart-1.30 piccolo-1.04 pircbot-1.4.2 pja-2.5 pmd-1.9 portecle-0.9 prefedit-0.6 proxool-0.8.3 puretls-0.9 qdox-1.4 quartz-1.4.2 radeox-0.9 regexp-1.3 relaxngDatatype-1.0 rhino-1.6 rngpack-1.1 sablecc-2.18.2 sac-1.3 saxon-6.5.3 saxon-aelfred-6.5.3 saxon-fop-6.5.3 saxon-jdom-6.5.3 saxon-scripts-6.5.3 servletapi3-3.3.1 servletapi4-4.0.4 servletapi5-5.0.18 snmptrapappender-1.2.8 soap-2.3.1 stax-bea-1.0 struts-1.2.4 struts-webapps-tomcat3-1.2.4 struts-webapps-tomcat4-1.2.4 struts-webapps-tomcat5-1.2.4 swarmcache-1.0 swingwt-0.85 tanukiwrapper-3.1.1 tjdo-2.1 tomcat3-3.3.2 tomcat3-webapps-3.3.2 tomcat4-4.1.30 tomcat4-admin-webapps-4.1.30 tomcat4-compat-4.1.30 tomcat4-webapps-4.1.30 tomcat5-5.0.27 tomcat5-admin-webapps-5.0.27 tomcat5-webapps-5.0.27 toolbar-0.4 tranql-1.0 tyrex-1.0.1 uddi4j-2.0.2 update-alternatives-1.8.3 vdoclet-0.2 velocity-1.4 velocity-dvsl-0.45 velocity-tools-1.1 village-1.5.3 violinstrings-1.0.2 webmacro-1.1 webnfs-1.2 webwork-1.4 webwork-multipart-1.4 wengsoftsnmp-3 werken.xpath-0.9.4 werkz-1.0 wsdl4j-1.4 ws-jaxme-0.3.1 xalan-j2-2.6.0 xalan-j2-xsltc-2.6.0 xapool-1.4 xdoclet-1.2.1 xerces-j2-2.6.2 xerces-j2-scripts-2.6.2 xercesjarv-20030530 xmlbeans-1.0.3 xml-commons-1.0 xml-commons-apis-1.0 xml-commons-resolver-1.1 xml-commons-resolver-nb-1.1 xml-commons-which-1.0 xmldb-api-20011111 xmldb-api-sdk-20011111 xmlrpc-1.2 xmlunit-1.0 xpp2-2.1.10 xpp3-1.1.3.4 xpp3-minimal-1.1.3.4 xsdlib-2.2 xstream-1.0.2 xt-dash-20020426
Google Groups Drops Date Based Search
I forgot where I read it yesterday, but I did remember to double check it today. It seems that the new version of Google Groups, now in beta, will not support searching by date ranges:

This will render a Google game that I posted 339 days ago unplayable.
Unless Google adds the date range search back when the new Google Groups goes live, the game is retired.
And if anybody at Google read this, please consider saving this feature.
Today's homework: Using Google Groups, find out when the phrase "Web Application" first appeared on the internet (at least the part of the internet archived in Google Groups.)
Forgot My Password Again
This just irritates me to no end! It appears that my password was forgotten again---not by me, but by them!

After I've told them of all of my life's details, and after I've successfully logged in many times, (and almost posted a comment on Eric's blog :) many times,) for them to come back all of a sudden one day and accuse me of forgetting my password just rubs me the wrong way.
It would have been much better if they have said: "We are sorry, this website is temporarily out of service because we cannot verify your password at the moment. If you believe you have entered the correct password, please call our customer service center at 123-456-7890."
