<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Rich Unger&apos;s Blog</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/" />
<modified>2008-01-10T02:49:03Z</modified>
<tagline></tagline>
<id>tag:weblogs.java.net,2008:/blog/richunger/236</id>
<generator url="http://www.movabletype.org/" version="3.01D">Movable Type</generator>
<copyright>Copyright (c) 2008, richunger</copyright>
<entry>
<title>Text-to-Speech NetBeans Module</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2008/01/texttospeech_ne_1.html" />
<modified>2008-01-10T02:49:03Z</modified>
<issued>2008-01-10T02:46:56Z</issued>
<id>tag:weblogs.java.net,2008:/blog/richunger/236.8961</id>
<created>2008-01-10T02:46:56Z</created>
<summary type="text/plain"><![CDATA[I'm getting back into the coding groove.&nbsp; Just for fun, last night I integrated the FreeTTS engine into the NetBeans Platform. The module does 4 things: Integrates the engine Provides an extension point in its layer file for new voices...]]></summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[I'm getting back into the coding groove.&nbsp; Just for fun, last night I integrated the <a href="http://freetts.sourceforge.net">FreeTTS </a>engine into the NetBeans Platform.
<p>


The module does 4 things:


<ol>
<li> Integrates the engine

<li> Provides an extension point in its layer file for new voices

<li> Provides an options dialog for selecting a voice

<li> Provides an API hook for speaking a String in the current voice.&nbsp; Thus it would be trivial for a NB developer to add an action that says something (e.g. TTS.getDefault().speak("the time is " + getTimeString())&nbsp; )
</ol>



  
<p>
<a title="Text-to-Speech in NetBeans" href="http://www.flickr.com/photos/66623665@N00/2182241230/"><img src="http://static.flickr.com/2047/2182241230_5a587e2310_m.jpg" border="0" /></a>
<p>
It was pretty easy.&nbsp; I spent most of the evening unraveling the weird manifest and classloader tricks the freeTTS project does.&nbsp; (IMHO there's no reason for a TTS library to create a classloader.&nbsp; Ever.)
<p>
A few hints to library writers: 
<ol>
<li> overloading the Main-Class attribute in your jar's manifest to do anything other than specifying a class with a main() method is a bad idea.
<li> If the way you read in your configuration requires a hack to work with webstart, you're making too many assumptions.
<li> It's not the library code's job to figure out which classloader a user-supplied extension is in.&nbsp; It's the users job to add their jar to the classpath.&nbsp; By trying to do it in the library's source code, you're just ensuring that anyone integrating your library in a way you didn't foresee can't do it.
</ol>
<p>
Seriously, I spent just a few minutes getting FreeTTS to work on the command line, maybe half an hour writing the netbeans code, and several hours figuring out just why the heck the engine wasn't finding any voices when it ran in NetBeans.]]>

</content>
</entry>
<entry>
<title>Learning Computer Science: Where does Java Belong?</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2008/01/learning_comput.html" />
<modified>2008-01-09T01:02:16Z</modified>
<issued>2008-01-09T01:02:09Z</issued>
<id>tag:weblogs.java.net,2008:/blog/richunger/236.8950</id>
<created>2008-01-09T01:02:09Z</created>
<summary type="text/plain"> In light of the article presented in the Journal of Defense Software Engineering, and the responses it has generated, I just couldn&apos;t resist throwing my 2 cents in, particularly as I&apos;m killing time between job interviews. If you haven&apos;t...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p> In light of the <a href="http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html">article presented in the Journal of Defense Software Engineering</a>, and the responses it has <a href="http://developers.slashdot.org/article.pl?sid=08/01/08/0348239">generated</a>, I just couldn't resist throwing my 2 cents in, particularly as I'm killing time between job interviews.
   </p><p>
If you haven't been following this debate, let me recap.&nbsp; Some Ada experts are saying that the growing monoculture of Java in college curricula is damaging the quality of CS education.&nbsp; It's producing software engineers who do not know how to engineer.
<br style="font-style: italic;" /><span style="font-style: italic;">"Students found it hard to write programs that did not have a graphic interface, had no feeling for the relationship between the source program and what the hardware would actually do, and (most damaging) did not understand the semantics of pointers at all, which made the use of&nbsp; C in systems programming very challenging."</span>
   </p><p>
I think Java is a wonderful language for teaching computer science.&nbsp; However, they're not entirely wrong, either.
   </p><p>
I bring the perspective of one who's been through such a curriculum.&nbsp; <a href="http://www.wustl.edu">Washington University</a> was one of the first schools to jump on the Java bandwagon, thanks to the efforts of some <a href="http://www.amazon.com/Practical-Guide-Structures-Algorithms-using/dp/158488455X/ref=sr_1_2/002-9790377-8921622?ie=UTF8&amp;s=books&amp;qid=1177635433&amp;sr=8-2">wonderful professors</a>.&nbsp; I took the first iteration of CS 101 taught in that language, back in 1997.&nbsp; Previously, CS 101 was taught in Scheme, and CS 102 was taught in C++.
   </p><p>
The change in these courses were extremely popular.&nbsp; We were able to build more substantial software in our first semester than students had in previous semesters.&nbsp; In our first semester, we were already learning the rudiments of good object oriented design.&nbsp; In our second semester, we were learning the rudiments of good concurrent programming.
   </p><p>
However, the next year I took a Design Patterns class that was taught in C++.&nbsp; I was completely unprepared.&nbsp; I spent half the semester catching up to the kids who knew what pointers were, and how to do linking and write a makefile.&nbsp; I didn't learn the Design Patterns until I took Advanced Design Patterns a year later.
   </p><p>
The general attitude of most professors at the time was that students needed to get off their butts and learn the languages themselves.&nbsp; The professors were teaching <span style="font-style: italic;">computer science,</span> not programming.&nbsp; &lt;crotchety-old-guy&gt;In <span style="font-style: italic;">my </span>day, if we needed to use a different language, we bought a book and learned it in a week!&lt;/crotchety-old-guy&gt;
   </p><p>
Well, that may be fine if you learned Ada and are expected to pick up Pascal, but taking a student who's only been taught Java, and expecting them to go off and pick up C++ before class is going to cause problems.&nbsp; They're not going to have the first clue how to run a linker, what a pointer is, or what the point of a header file is supposed to be.
   </p><p>
This is exactly what the authors of the Journal article mean when they say:
   </p><p>
<span style="font-style: italic;">...we have regretted the introduction of Java as a first language of
instruction for most computer science majors. We have seen how this
choice has weakened the formation of our students, as reflected in
their performance in systems and architecture courses.</span>
   </p><p>
WashU's student ACM chapter saw these problems, and put together their own curriculum for a lab-based class that taught these and other concepts behind good coding techniques.&nbsp; We even chose a <a href="http://books.google.com/books?id=to6M9_dbjosC&amp;dq=programming+practice&amp;pg=PP1&amp;ots=3XP6Ngy37a&amp;sig=uoaCjdWIopnohvHN3db44fJ-338&amp;hl=en&amp;prev=http://www.google.com/search?q=programming+practice&amp;ie=utf-8&amp;oe=utf-8&amp;rls=FlockInc.:en-US:official&amp;client=firefox&amp;sa=X&amp;oi=print&amp;ct=title&amp;cad=one-book-with-thumbnail">textbook</a>.&nbsp; We figured, if they would teach this class, that would free up the higher level systems and architecture classes to teach what they want, instead of the rush to the bottom that was occurring at the time.
   </p><p>
Well, at the time, no one wanted to teach it.&nbsp; However, I've heard they since introduced it, and students are finally learning how to code and debug before taking systems and architecture classes.
   </p><p>
So, does all this mean that WashU made the wrong move?&nbsp; I don't think so.&nbsp; Java is not bad for education.&nbsp; Bad curricula is bad for education.&nbsp; They made some mistakes in the implementation, and then they fixed them.
   </p><p>
The Journal's critique had 3 major themes:
   </p><p>
<span style="font-style: italic;">1. Mathematics requirements in CS programs are shrinking.</span>
   </p><p>
Okay, if they're talking about discrete mathematics, numerical methods, and automata theory, this is clearly a bad trend.&nbsp; However, WashU used to have engineering requirements in mathematics that just didn't make sense.&nbsp; I don't need Laplace transforms to do CS.&nbsp; I only need them if I'm going to work for <a href="http://www.wolfram.com/">Wolfram</a>.
   </p><p>
<span style="font-style: italic;">2. The development of programming skills in several languages is giving
way to cookbook approaches using large libraries and special-purpose
packages.</span>
   </p><p>
The fact that such packages are <span style="font-style: italic;">available </span>for Java does not mean Java is bad for education.&nbsp; My instructor for Algorithms and Data Structures allowed us to use C++
or Java, so long as we weren't just calling java.util.Hashtable to
write our hash table.&nbsp; Nothing wrong with that.
   </p><p>
<span style="font-style: italic;">3. The resulting set of skills is insufficient for today’s software
industry (in particular for safety and security purposes) and,
unfortunately, matches well what the outsourcing industry can offer. We
are training easily replaceable professionals.</span>
   </p><p>
This one is best read with the source in mind.&nbsp; These guys are <span style="font-style: italic;">Ada </span>experts in the <span style="font-style: italic;">Defense </span>industry.&nbsp; Formal methods and provability are very important, but they are not core classes that everybody should take.&nbsp; They are invaluable if you're going to work in defense or safety applications, but probably not if you're going to work on, say, speech recognition.&nbsp; For that, we need students who took courses in machine learning.&nbsp; The field is now big enough for multiple specializations.
   </p><p>
By all means, teach classes in other languages.&nbsp; Students should be forced to take at least one class in a functional language.&nbsp; However, for CS 101, Java is an excellent choice.
   </p><p>
I also took a course in assembly, and even a course in VHDL.&nbsp; Talk about bare metal -- C is for wimps :)
   </p><!-- technorati tags begin --><p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/education" rel="tag">education</a>, <a href="http://technorati.com/tag/java" rel="tag">java</a>, <a href="http://technorati.com/tag/%20" rel="tag"> </a></p><!-- technorati tags end -->]]>

</content>
</entry>
<entry>
<title>Youtube player in JDIC browser</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2008/01/youtube_player.html" />
<modified>2008-01-07T02:51:32Z</modified>
<issued>2008-01-07T02:51:26Z</issued>
<id>tag:weblogs.java.net,2008:/blog/richunger/236.8933</id>
<created>2008-01-07T02:51:26Z</created>
<summary type="text/plain"><![CDATA[At Geertjan's suggestion, I tried his Youtube modules with my JDIC integration.&nbsp; Worked out of the box, no problem.&nbsp; I didn't have to change a thing.&nbsp; Nice when that happens, eh?...]]></summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[At Geertjan's suggestion, I tried his <a href="http://blogs.sun.com/geertjan/entry/youtube_movie_player_in_plugin">Youtube modules</a> with my <a href="http://jdic-netbeans.dev.java.net">JDIC integration</a>.&nbsp; Worked out of the box, no problem.&nbsp; I didn't have to change a thing.&nbsp; Nice when that happens, eh?



  
<a title="JDIC/Youtube/NetBeans mashup" href="http://www.flickr.com/photos/66623665@N00/2173363265/"><img src="http://static.flickr.com/2145/2173363265_e93edb977f_m.jpg" border="0" /></a>]]>

</content>
</entry>
<entry>
<title>JDIC - NetBeans Integration Updated for 6.0</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2008/01/jdic_netbeans_i.html" />
<modified>2008-01-03T00:45:05Z</modified>
<issued>2008-01-02T23:24:44Z</issued>
<id>tag:weblogs.java.net,2008:/blog/richunger/236.8916</id>
<created>2008-01-02T23:24:44Z</created>
<summary type="text/plain"><![CDATA[To jump back into programming, and to familiarize myself with the new release of NetBeans, I've updated the jdic-netbeans integration.&nbsp; Here you can see the browser embedded in NB, replacing the default "Swing browser". There's still some issues with the...]]></summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>To jump back into programming, and to familiarize myself with the new release of NetBeans, I've updated the <a href="http://jdic-netbeans.dev.java.net">jdic-netbeans</a> integration.&nbsp; Here you can see the browser embedded in NB, replacing the default "Swing browser".

 <p>  <a title="jdic-nb6-screenshot.jpg" href="http://www.flickr.com/photos/66623665@N00/2160123882/"><img src="http://static.flickr.com/2169/2160123882_6755d135f6_m.jpg" border="0" /></a>

<p>There's still <a href="http://www.netbeans.org/issues/show_bug.cgi?id=79130">some issues</a> with the integration that I've never managed to tackle, relating to heavyweight-lightweight component mixing.&nbsp; The browser doesn't handle being resized very well, and tends to put itself in front of other TopComponents.&nbsp; Any ideas welcome!

<p><img src="http://www.netbeans.org/nonav/issues/showattachment.cgi/31996/BrowserResizeAfterFloatProperties.png" style="" title="" alt="" width="600" />

<p>The source code is available on the java.net <a href="http://jdic-netbeans.dev.java.net">project site.</a><!-- technorati tags begin --><p style="font-size:10px;text-align:right;">Tags: <a href="http://technorati.com/tag/netbeans" rel="tag">netbeans</a>, <a href="http://technorati.com/tag/jdic" rel="tag">jdic</a></p><!-- technorati tags end -->]]>

</content>
</entry>
<entry>
<title>Man, I leave you guys alone for one little year...</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2007/12/man_i_leave_you.html" />
<modified>2007-12-20T23:18:15Z</modified>
<issued>2007-12-20T23:18:06Z</issued>
<id>tag:weblogs.java.net,2007:/blog/richunger/236.8874</id>
<created>2007-12-20T23:18:06Z</created>
<summary type="text/plain">Dear Java Industry, I leave you guys alone for one little year, and just look what happens! While I was off gallivanting, NetBeans added a GPL license, switched to mercurial, and released a new version. The JDK also went mercurial...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>Dear Java Industry,</p>

<p>I leave you guys alone for one little year, and just look what happens!  </p>

<p>While I was off <a href="http://unger.vox.com/">gallivanting</a>, NetBeans added a GPL license, switched to mercurial, and released a new version.  The JDK also went mercurial on me.  Google released their Android platform.  Spring, Tapestry, Wicket, and GWT are all in new major releases.</p>

<p>Things sure to move quickly around here.  I've got a lot to catch up on.</p>

<p>I'm like a kid in a candy store.  I can't wait to play with it all!</p>

<p>Unfortunately, my laptop is broken.  Anyone know a good laptop repair shop in the Seattle area?</p>]]>

</content>
</entry>
<entry>
<title>Itinerant Java Speaker: Bariloche, Argentina</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2007/04/itinerant_java.html" />
<modified>2007-04-23T18:02:44Z</modified>
<issued>2007-04-23T18:02:32Z</issued>
<id>tag:weblogs.java.net,2007:/blog/richunger/236.7126</id>
<created>2007-04-23T18:02:32Z</created>
<summary type="text/plain">As some of you may remember from my last entry, my fiance and I are traveling the world, and I&apos;m looking to meet some java programmers in different places along the way. Well, the first to answer my call was...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>As some of you may remember from my <a href="http://weblogs.java.net/blog/richunger/archive/2007/02/the_itinerant_s.html">last entry</a>, my fiance and I are traveling the world, and I'm looking to meet some java programmers in different places along the way.</p>

<p>Well, the first to answer my call was Gustavo Santucho and his girlfriend Guadalupe.  They, along with a few other programmer friends, have their own consulting company, based in beautiful Bariloche, Argentina.  This is the a city near the fantastic Nahuel Huapi National Park, near the Chilean border.</p>

<p>They picked us up as we arrived by bus, and immediately we discovered that his English was far better than my Spanish :)<br />
I've gotten a little bit better now, since taking some Spanish lessons from a friend of his in Buenos Aires, but most of our conversations at the time were in English.</p>

<p>Looking around the small city, you wouldn't think there'd be much local work for java programmers.  It's basically a tourist town, situated on a very large and sleepy lake.  However, Gustavo took me for a drive, and on the way he kept pointing to grocery and pharmacy chain stores, saying "they're a client, they're a client".  They also have a significant percentage of clients from overseas.  They gain most new clients by word of mouth, and in fact, they're getting more work than they can handle right now, and are thinking about ways to expand the company.</p>

<p>Gustavo tells me that the trend in his part of South America is away from webapps and towards RCP-based software, which is why they started using the NetBeans platform.  I was particularly pleased to see them using my <a href="https://jdic-netbeans.dev.java.net/">JDIC-NetBeans integration</a> on one of their apps.</p>

<p>Guadalupe is the real UI designer in the group.  She just emailed me some screenshots for a big new project they have, working for the local electric company:</p>

<p><img alt="guada1.png" src="http://weblogs.java.net/blog/richunger/archive/guada1.png/guada1.png" width="1292" height="791" /></p>

<p><img alt="guada2.png" src="http://weblogs.java.net/blog/richunger/archive/guada2.png/guada2.png" width="1272" height="660" /></p>

<p>As you can see, they're integrating components from the NetBeans Graph Visualization library (graph.netbeans.org) and Geotools.</p>

<p>Gustavo and Guadalupe were extremely hospitable, and we had a fantastic time.  If you're interested in reading about the more vacation-like aspects of our time together, check out <a href="http://unger.vox.com">my personal blog</a>.</p>

<p>Well, we're off to the airport soon.  We're about to fly to Athens and make our way all the way around Europe (clockwise).  Caio!</p>]]>

</content>
</entry>
<entry>
<title>The itinerant speaker&apos;s itinerary</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2007/02/the_itinerant_s.html" />
<modified>2007-02-26T19:12:03Z</modified>
<issued>2007-02-26T19:11:51Z</issued>
<id>tag:weblogs.java.net,2007:/blog/richunger/236.6687</id>
<created>2007-02-26T19:11:51Z</created>
<summary type="text/plain">I&apos;m finally underway for my round-the-world trip, and as I said in my last entry, I&apos;m available for speaking on NetBeans RCP, IVR Speech Recognition, and other topics en route. If you&apos;re interested in tracking my progress, regular updates will...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>I'm finally underway for my round-the-world trip, and as I said in my <a href="http://weblogs.java.net/blog/richunger/archive/2007/01/itinerant_javan.html">last entry</a>, I'm available for speaking on NetBeans RCP, IVR Speech Recognition, and other topics en route.</p>

<p>If you're interested in tracking my progress, regular updates will be in my <a href="http://unger.vox.com">personal blog</a>.</p>

<p>I'm just posting now because I recently procured the tickets for the first half of my journey.  My dates are not set yet, but the cities are.  My general itinerary starts with a flight to Buenos Aires on March 12th.  I'll be in Argentina and Chile for 5 weeks.  Then, it's on to Athens and Crete.  From Greece, I'll be going to Italy, Croatia, France, Spain, Portugal, Morocco, the UK, Ireland, Belgium, Amsterdam, Germany, Estonia, Latvia, Lithuania, Poland, The Czech Republic, Hungary, Romania, Bulgaria, Turkey, Egypt, Ethiopia, Kenya, Tanzania, Zambia, Botswana, South Africa, and India (Mumbai, Rajasthan, and Delhi).  From there, the itinerary is not set, but it is likely to include Thailand, Vietnam, and Cambodia.  Beyond that, we've not decided.</p>

<p>We're looking to meet people who want to show us a bit of their home country, and maybe put us up on their couches as payment for an appearance at your local JUG or company forum :)</p>

<p>A few folks commented on my last post (specifically from South Africa and Italy).  I'm sorry I didn't include better contact info in my last post.  Blog comments leave me no way to get in touch with you, so I'll try this again: rich (dot) unger (at) gmail.</p>]]>

</content>
</entry>
<entry>
<title>Itinerant Java/NetBeans speaker</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2007/01/itinerant_javan.html" />
<modified>2007-01-29T10:12:20Z</modified>
<issued>2007-01-29T10:06:44Z</issued>
<id>tag:weblogs.java.net,2007:/blog/richunger/236.6431</id>
<created>2007-01-29T10:06:44Z</created>
<summary type="text/plain">I&apos;ve not been posting lately, but it&apos;s not for lack of excitement around here. For one thing, I&apos;ve been collaborating on the forthcoming NetBeans RCP book. If you&apos;re at all interested in RCP development, I promise you this book will...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>I've not been posting lately, but it's not for lack of excitement around here.</p>

<p>For one thing, I've been collaborating on the forthcoming <a href="http://blogs.sun.com/geertjan/entry/tables_of_contents_for_netbeans">NetBeans RCP book</a>.  If you're at all interested in RCP development, I promise you this book will make your job easier.  I started on the NB platform about 3 or 4 years ago, and I struggled with it <i>a lot</i>.  I can't believe how much easier it is now.  The support in the IDE for writing platform-based apps is better (thanks largely to Jesse Glick), the information on platform.netbeans.org is much, much better (thanks largely to Geertjan), and this book is going to be the icing on the cake.</p>

<p>And, while I was writing that chapter, I also gave notice at Nuance.  After 6+ years at the speech recognition giant, I'm calling it quits.  I'd like to stress that there were no hard feelings or anything particularly negative at Nuance that made me feel I had to leave.  My experience at Nuance has been tremendous. Right out of college, I was fortunate to work in an exciting and technically challenging software field (speech recognition) with a lot of really, really smart programmers and linguists.  Everything I learned about developing large, high-quality software products I learned at Nuance.  I grew a lot there, both professionally and personally.</p>

<p>I was just ready to take a break, and soon I'll be looking for new challenges.  But first...</p>

<p>My girlfriend gave notice at her job as well.  We've decided to travel the world together for about a year.  We're going to South America, Europe, and Africa.  Everything after that we haven't planned out yet, but it's likely to include parts of India, China, southeast Asia, possibly Japan, Australia/NZ, or some islands in the south pacific.  I'll be posting all about this on my new <a href="http://unger.vox.com">personal blog</a>.</p>

<p>As part of this grand adventure, I'm attempting an experiment.  I figure, if Sun, with their millions spent on marketing and travel, can have a "NetBeans World Tour", why can't I?</p>

<p>The lonely planet books all say that the best way to travel to foreign countries is to engage with locals in a more substantive way than just interacting with hotel clerks and waiters.  Have conversations with people who are not paid to have conversations with you (i.e. people in the tourism industry).</p>

<p>In my opinion, one way to do this is to meet people with similar interests.  Like, maybe Java. </p>

<p>I've spoken twice at JavaOne and once at OOPSLA on the subject of NetBeans RCP development.  I've also got fodder for talks from my experience at Nuance doing speech recognition with java in general, and NetBeans RCP in particular, as well as the material I've contributed to the new book.</p>

<p>Also, while not specifically Java-related, my girlfriend and travel companion Patty is an expert (and has spoken at conferences) on advances in telecommunications infrastructure, particularly in the realm of <a href="http://en.wikipedia.org/wiki/Fiber_to_the_home">FTTP</a>.</p>

<p>So here's my idea: we'll have several slide decks on USB keys with us.  If you have a JUG or other organization somewhere on our itinerary, and you'd like one or both of us to come and speak, we'd be happy to, in exchange for space on your couch or in your guest room for the night, and maybe some company to help us explore your home country.  Show us your favorite museum, pub, hiking trail, or landmark.</p>

<p>In a nutshell, we're trading expertise for experiences.</p>]]>

</content>
</entry>
<entry>
<title>Getting feedback to website coders</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/11/getting_feedbac.html" />
<modified>2006-11-10T20:28:18Z</modified>
<issued>2006-11-10T20:28:13Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5910</id>
<created>2006-11-10T20:28:13Z</created>
<summary type="text/plain">As a software developer who has... you know... users, I like to gather as much user feedback as possible. Thus, when I&apos;m on the other side of the fence, I try to give helpful, specific feedback to coders of websites...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Testing</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>As a software developer who has... you know... users, I like to gather as much user feedback as possible.  Thus, when I'm on the other side of the fence, I try to give helpful, specific feedback to coders of websites that I frequent.  Sometimes, however, the levels of bureaucracy between me and them makes this difficult.  It's probably something the business community should do something about.</p>

<p>Here's an example:</p>

<p>I went to citibank's credit card site, because I have a cashback card with them and I want to get a refund check.  Unfortunately, they have a limit of $300 per year that you can get, and if you've used their card enough to earn more than that, you aren't allowed to get any check at all through the website.  Instead, you get the error message:</p>

<p><i>We are unable to process your request at this time. Either your total accumulated cash back rebate balance does not qualify for a check, or your request cannot be completed online. If you have any questions, please call the Cash Back Redemption Line at ^=dividendRedemptionNumber^</i></p>

<p>First of all, there's a lazy, but intentional limitation that forces me to waste my time and the time of one of their phone agents to issue a check that the website should be perfectly capable of doing.  Secondly, they can't even tell me the phone number because of a simple coding error that didn't get caught in their QA cycle.</p>

<p>So, I took care of my business over the phone (by calling the number on the back of my credit card), and then I sent them a message through their "Contact Us" link:</p>

<p><i><br />
When I attempt to redeem a reward, and my reward balance is over $300, I get: We are unable to process your request at this time. Either your total accumulated cash back rebate balance does not qualify for a check, or your request cannot be completed online. If you have any questions, please call the Cash Back Redemption Line at ^=dividendRedemptionNumber^. </p>

<p>I can't dial ^=dividendRedemptionNumber^ :)<br />
</i></p>

<p>Here I am, just trying to make it easier on the next guy, and save Citibank a little money in their call center.</p>

<p>The reply was quick and polite, and clearly done by a human.  These are all good traits of a customer service organization.  However, they get it spectacularly wrong:</p>

<p><i><br />
We apologize for any inconvenience.</p>

<p>Our records currently indicate that your rewards check request was processed on 11/10/2006. Your request cannot be processed a second time. Please allow 7-10 days to receive the check.</p>

<p>Thank you for using our website.<br />
</i></p>

<p>Somehow, I doubt the bug report got filed in their internal issue tracker for the website developers.</p>]]>

</content>
</entry>
<entry>
<title>A new NetBeans Platform Sample: AudioStation</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/11/a_new_netbeans_1.html" />
<modified>2006-11-02T01:25:51Z</modified>
<issued>2006-11-02T01:25:44Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5849</id>
<created>2006-11-02T01:25:44Z</created>
<summary type="text/plain">Tim, Jarda and I taught a workshop on NetBeans plugin development at OOPSLA last week. As part of that course, I cooked up a new sample app to showcase the platform. It&apos;s a simple WAV file editor which showcases the...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<a href="http://flickr.com/photos/66623665@N00/285235542/">Tim, Jarda</a> and I taught a workshop on NetBeans plugin development at <a href="http://www.oopsla.org">OOPSLA</a> last week.  As part of that course, I cooked up a new sample app to showcase the platform.
<br><br>
It's a simple WAV file editor which showcases the use of the Lookup API to plug different visualizations of the WAV file into a Multi-View component:
<br><br>
<img alt="AudioStation.gif" src="http://weblogs.java.net/blog/richunger/archive/images/AudioStation.gif" width="600" height="491" />
<br><br>
Here I show two Multi-View components.  They're showing the different views available: the editable waveform view and the read-only frequency domain view (uses FFT).
<br><br>
The source code is checked into the NetBeans CVS tree under <a href="http://www.netbeans.org/source/browse/platform/samples/AudioStation/">platform/samples/AudioStation</a>
<br><br>
I have the project broken out into a progression of lessons, with the source code for the solution to each lesson.  I've not yet uploaded that anywhere.  I'd like to work with someone at Sun (Geertjan?) to figure out the best way to present it.
<br><br>
Hope some folks find this useful.]]>

</content>
</entry>
<entry>
<title>Commonly Solved Problems</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/10/commonly_solved.html" />
<modified>2006-10-06T01:18:21Z</modified>
<issued>2006-10-06T01:18:10Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5692</id>
<created>2006-10-06T01:18:10Z</created>
<summary type="text/plain">Google just introduced Code Search, which lets you search &quot;public source code&quot;, which I imagine is every OSS project they could lay eyes on. My first search (because I was just looking at the new version of commons-lang), was for...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Open Source</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[Google just introduced <a href="http://www.google.com/codesearch">Code Search</a>, which lets you search "public source code", which I imagine is every OSS project they could lay eyes on. My first search (because I was just looking at the new version of <a href="http://jakarta.apache.org/commons/lang/upgradeto2_2.html">commons-lang</a>), was for "<a href="http://www.google.com/codesearch?q=file%3AStringUtils.java&amp;btnG=Search&amp;hl=en&amp;lr=">file:StringUtils.java</a>".<br /><br />There were about 400 hits.<br /><br />There were even lots of different StringUtils classes in <a href="http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=file%3Aapache.*StringUtils.java&amp;btnG=Search">different apache products.</a>&nbsp;  Though, it is clear these numbers are slightly inflated, as different versions of the same file come up.<br /><br />My, but we love to solve that StringUtils problem :)<br />]]>

</content>
</entry>
<entry>
<title>debugging PermGen OutOfMemoryError problems in windows</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/09/debugging_permg.html" />
<modified>2006-09-30T00:47:10Z</modified>
<issued>2006-09-30T00:45:39Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5660</id>
<created>2006-09-30T00:45:39Z</created>
<summary type="text/plain"><![CDATA[Recently, a bug showed up in my stack: "java.lang.OutOfMemoryError: PermGen space"I loathe these kinds of bugs.&nbsp; They're notoriously difficult to reproduce, and tough to isolate.Coincidentally, around that time Gregg Sporar posted about this very type of memory leak: http://weblogs.java.net/blog/gsporar/archive/2006/09/javazone_sessio.htmlHe suggests...]]></summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[Recently, a bug showed up in my stack: "java.lang.OutOfMemoryError: PermGen space"<br /><br />I loathe these kinds of bugs.&nbsp; They're notoriously difficult to reproduce, and tough to isolate.<br /><br />Coincidentally, around that time Gregg Sporar posted about this very type of memory leak: http://weblogs.java.net/blog/gsporar/archive/2006/09/javazone_sessio.html<br /><br />He suggests using <a href="http://download.java.net/jdk6/docs/technotes/tools/share/jmap.html">jmap </a>to see what's in PermGen space.&nbsp; Unfortunately, I'm on windows.&nbsp; Until jdk6, jmap wasn't even available on windows, and even in jdk6, the windows version <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6346039">doesn't support the -permspace flag</a>.<br /><br />Then, my coworker Raj pointed me to jconsole.&nbsp; This is a tool that comes with jdk5 and lets you monitor the JVM's MBeans graphically.&nbsp; All you need to do is launch your VM with the -Dcom.sun.management.jmxremote flag.<br /><br />In my case, I was profiling NetBeans' internal tomcat server, so I entered this flag in Windows...Runtime...Servers...Bundled Tomcat...Properties...Platform...VM Options and restarted the server.<br /><br />Two screens were of use to me in jconsole.&nbsp; The first is the memory usage screen:<br /><br/><img alt="jconsole-mem.png" src="http://weblogs.java.net/blog/richunger/archive/jconsole-mem.png" width="628" height="541" /><br /><br/>And the second is the classes screen, which shows me how many classes have been loaded, and has a handy checkbox that will enable printing to stdout the names of all classes as they're being loaded.<br /><br/><img alt="jconsole-classes.png" src="http://weblogs.java.net/blog/richunger/archive/jconsole-classes.png" width="628" height="541" /><br /><br/>In the end, I found that the problem was in NetBeans itself: <a href="http://www.netbeans.org/issues/show_bug.cgi?id=85179">http://www.netbeans.org/issues/show_bug.cgi?id=85179</a><br />]]>

</content>
</entry>
<entry>
<title>jdic-netbeans project is online</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/06/jdicnetbeans_pr.html" />
<modified>2006-06-23T18:43:28Z</modified>
<issued>2006-06-23T18:43:07Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5083</id>
<created>2006-06-23T18:43:07Z</created>
<summary type="text/plain"><![CDATA[Some of you NB users may already be aware of my NBM for adding a JDIC-embedded browser to NB.&nbsp; The binary can be obtained from the nbextras.org update center, or from http://www.nbextras.org/2006/04/24/1145914287438.htmlWell, now the source is checked into https://jdic-netbeans.dev.java.net/You can...]]></summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: JavaDesktop</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[Some of you NB users may already be aware of my NBM for adding a JDIC-embedded browser to NB.&nbsp; The binary can be obtained from the nbextras.org update center, or from http://www.nbextras.org/2006/04/24/1145914287438.html<br /><br />Well, now the source is checked into https://jdic-netbeans.dev.java.net/<br />You can get the sources using svn and build it yourself.&nbsp; Contributions are welcome...<br /><br />Cheers,<br />Rich<br /><br />PS: This is the first entry I'm writing with the Performancing firefox extension.&nbsp; Very nice!<br />]]>

</content>
</entry>
<entry>
<title>How do I?</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/06/how_do_i.html" />
<modified>2006-06-14T23:21:09Z</modified>
<issued>2006-06-14T23:20:33Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.5027</id>
<created>2006-06-14T23:20:33Z</created>
<summary type="text/plain">Any other java.net bloggers out there figure out how to use a firefox plugin (e.g. Performancing) to blog here? I would have posted this to a java.net discussion forum, but the natural one (called &quot;How do I?&quot;, located at https://java-net.dev.java.net/servlets/ForumMessageList?forumID=95)...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>Any other java.net bloggers out there figure out how to use a firefox plugin (e.g. Performancing) to blog here?</p>

<p>I would have posted this to a java.net discussion forum, but the natural one (called "How do I?", located at https://java-net.dev.java.net/servlets/ForumMessageList?forumID=95) seems completely overrun by newbies asking all manner of general java coding questions.  Methinks the forum descriptions are not sufficiently clear :)</p>]]>

</content>
</entry>
<entry>
<title>A simple class browser</title>
<link rel="alternate" type="text/html" href="http://weblogs.java.net/blog/richunger/archive/2006/05/a_simple_class.html" />
<modified>2006-06-09T00:45:50Z</modified>
<issued>2006-05-26T07:26:05Z</issued>
<id>tag:weblogs.java.net,2006:/blog/richunger/236.4904</id>
<created>2006-05-26T07:26:05Z</created>
<summary type="text/plain">At JavaOne, Geertjan gave a talk on building an IDE for a specific framework (Wicket). I work on a similar project for an in-house framework. One feature that I thought would be useful is a convenient Java Class selector. I...</summary>
<author>
<name>richunger</name>

<email>rich_unger@alum.wustl.edu</email>
</author>
<dc:subject>Community: NetBeans</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.java.net/blog/richunger/">
<![CDATA[<p>At JavaOne, Geertjan gave a talk on building an IDE for a specific framework (Wicket).  I work on a similar project for an in-house framework.  One feature that I thought would be useful is a convenient Java Class selector.

<p>I really like the "Fast Open" selector that you get from the "Navigate...Go To Class" menu item.  I looked at the code, and was dismayed to see that it was hard-coded for opening classes, and was not reusable for just selecting a class for another purpose (such as inserting a class reference in an xml file).

<p>So, I sat down to write such a widget, and was pleased to be able to put something pretty featureful together in a couple of hours.  I use the MDR API for querying classes.

<p><img alt="classbrowser.jpg" src="http://weblogs.java.net/blog/richunger/archive/classbrowser.jpg/classbrowser.jpg" width="408" height="327" />

<p>The list box contains all classes whose classname (without package) starts with the substring in the text field.  The list selection is the value returned by the dialog.

<p>Here's a little tour of the code:


<pre>
public class ClassSelector extends javax.swing.JDialog
{
    // the data for the ListModel
    private List<JCClass> candidates = new ArrayList<JCClass>();

    // an example usage
    public static String getFullyQualifiedClassName()
    {
        ClassSelector cs = new ClassSelector();
        cs.setVisible(true);
        JCClass c = cs.getSelection();
        return c == null ? null : c.getFullName();
    }

    public ClassSelector()
    {
        this(WindowManager.getDefault().getMainWindow(), true);
    }

    public ClassSelector(java.awt.Frame parent, boolean modal)
    {
        super(parent, modal);
        initComponents();
    }

    public JCClass getSelection()
    {
        return (JCClass)matchingList.getSelectedValue();
    }

    private void initComponents()
    {
        // matisse-generated code here
    }

    private void matchingListKeyPressed(java.awt.event.KeyEvent evt)
    {
        // make ENTER work the same as the OK button
        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
            okButtonActionPerformed(null);
    }

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)
    {
        matchingList.setSelectedIndex(-1);
        dispose();
    }

    private void okButtonActionPerformed(java.awt.event.ActionEvent evt)
    {
        dispose();
    }

    private ListModel createListModel()
    {
        return new Model();
    }

    private ListCellRenderer createCellRenderer()
    {
        return new Renderer();
    }

    private class Model extends KeyAdapter implements ListModel
    {
        private List<ListDataListener> listeners = new ArrayList<ListDataListener>();

        public Model()
        {
            classNameField.addKeyListener(this);
        }

        public int getSize()
        {
            return candidates.size();
        }

        public Object getElementAt(int index)
        {
            return candidates.get(index);
        }

        public void addListDataListener(ListDataListener l)
        {
            listeners.add(l);
        }

        public void removeListDataListener(ListDataListener l)
        {
            listeners.remove(l);
        }

        private void fireListChange()
        {
            ListDataEvent evt = new ListDataEvent(this,
                    ListDataEvent.CONTENTS_CHANGED, 0, getSize()-1);
            for (ListDataListener l : listeners)
            {
                l.contentsChanged(evt);
            }
        }

        private void refresh()
        {
            String str = classNameField.getText();

            if (str == null || str.trim().length() == 0)
            {
                // text field is blank, so don't do a query
                if (!candidates.isEmpty())
                {
                    candidates.clear();
                    fireListChange();
                }
            }
            else
            {
                // clear out the old query results, and do a new query
                str = str.trim();
                candidates.clear();

                JCFinder finder = JCFinderFactory.getDefault().getGlobalFinder();

                // TODO: make case insensitive
                List<JCClass> classes = finder.findClasses(
                        null, // don't specify a package
                        str, 
                        false); // don't require an exact match

                candidates.addAll(classes);

                fireListChange();

                if (!candidates.isEmpty() && matchingList.getSelectedIndex() == -1)
                {
                    // if there's no selection at this point, select the first item
                    matchingList.setSelectedIndex(0);
                }

            }
        }

        /** each time a letter is typed, do a new query */
        public void keyReleased(KeyEvent e)
        {
            refresh();
        }
    }

    private class Renderer implements ListCellRenderer
    {
        public Component getListCellRendererComponent(
                JList list, Object value, int index,
                boolean isSelected, boolean cellHasFocus)
        {
            JCClass c = (JCClass)value;
            String str = c.getName() + " (" + c.getPackageName() + ")";
            JLabel label = new JLabel(str);
            if (isSelected)
            {
                label.setBackground(Color.BLUE);
                label.setForeground(Color.WHITE);
                label.setOpaque(true);
            }
            return label;
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton cancelButton;
    private javax.swing.JTextField classNameField;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList matchingList;
    private javax.swing.JButton okButton;
    // End of variables declaration//GEN-END:variables

}
</pre>

<p>Neat, eh?  The <a href="http://weblogs.java.net/blog/richunger/archive/classbrowser.zip/classbrowser.zip">full code is here</a>.]]>

</content>
</entry>

</feed>