<?xml version="1.0"?>
<!-- RSS generated by Radio UserLand v8.0.8 on Mon, 19 Jan 2004 20:03:43 GMT -->
<rss version="2.0">
	<channel>
		<title>Ross Judson: Java Etc.</title>
		<link>http://www.soletta.com/categories/javaEtc/</link>
		<description>Stuff about Java and programming.</description>
		<language>en</language>
		<copyright>Copyright 2004 Ross Judson</copyright>
		<lastBuildDate>Mon, 19 Jan 2004 20:03:43 GMT</lastBuildDate>
		<docs>http://backend.userland.com/rss</docs>
		<generator>Radio UserLand v8.0.8</generator>
		<managingEditor>radiouserland@soletta.com</managingEditor>
		<webMaster>radiouserland@soletta.com</webMaster>
		<category domain="http://www.weblogs.com/rssUpdates/changes.xml">rssUpdates</category> 
		<skipHours>
			<hour>3</hour>
			<hour>7</hour>
			<hour>5</hour>
			<hour>6</hour>
			<hour>2</hour>
			<hour>4</hour>
			<hour>8</hour>
			<hour>16</hour>
			</skipHours>
		<ttl>60</ttl>
		<item>
			<description>&lt;H5&gt;Protocols Plugin.&lt;/H5&gt;
&lt;P&gt;I&apos;ve begun organizing some of my source code with Sten-Erik Bergner&apos;s &lt;A href=&quot;http://www.bergner.se/protocols/&quot;&gt;Protocols Plugin&lt;/A&gt; for Eclipse.&amp;nbsp; What it does is provide a decent and clean way to organize the members of a Java class.&amp;nbsp; You declare section names and give it a sort order.&amp;nbsp; Then, in the Java Browsing perspective (&lt;EM&gt;not&lt;/EM&gt; the Java perspective), you can drag and drop from the member types window into the list of member categories (&quot;protocols&quot;).&lt;/P&gt;
&lt;P&gt;The plugin organizes your source code as you go. What you end up with are pretty nice looking source files that have all members that correspond to a given category (&quot;accessing&quot;, &quot;creation&quot;, &quot;event handling&quot;, or whatever) all bunched together, in sorted order.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;When you&apos;re working with your code, you can click on any Protocol in the Protocols view and have your list of members filtered to include only members of that category.&amp;nbsp; When you&apos;re working with larger classes or more mature systems, this is a godsend.&amp;nbsp; You can quickly zero in on public stuff, property handlers, and whatever else you want.&lt;/P&gt;
&lt;P&gt;You can make up your own protocol names...I wrote a paper a while back that describes a series of method classifications.&amp;nbsp; I&apos;ve made some protocol names that correspond to those.&amp;nbsp; &lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2004/01/19.html#a465</guid>
			<pubDate>Mon, 19 Jan 2004 20:03:43 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=465&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2004%2F01%2F19.html%23a465</comments>
			</item>
		<item>
			<description>&lt;H5&gt;The Relentless March Of Stupid Technology.&lt;/H5&gt;
&lt;P&gt;Here in the DC area there&apos;s a story getting some buzz: &lt;A href=&quot;http://www.washingtonpost.com/wp-dyn/articles/A1397-2003Nov5.html&quot;&gt;Glitches Prompt GOP Suit Over Fairfax Tabulations&lt;/A&gt;. The GOP is &lt;I&gt;absolutely&lt;/I&gt; right to protest this vote; it&apos;s not about anything other than the validity of the process.
&lt;P&gt;The machines in question are the &lt;A href=&quot;http://clients.enfocom.com/avs/products_winvote.html&quot;&gt;WinVote&lt;/A&gt; model, from Advanced Voting Systems. Just listen to their pitch: &lt;I&gt;The functionality linchpin of the WINvoteTM system is its wireless LAN (IEEE 802.11b) system - called the Wireless Information Network (WIN) -- that enables the user to communicate remotely with the major components of the voting system.&lt;/I&gt;
&lt;P&gt;Does anybody else see a problem with enabling &lt;I&gt;wireless communications&lt;/I&gt; to voting machines? This is just f&apos;ing stupid, beyond belief. Encryption can help ameliorate the situation, but what I see is the possibility of ne&apos;er-do-wells attempting to disrupt elections with laptops. All they have to do is hang around the building within a few hundred feet, and they can screw with the election machines to their heart&apos;s content. 
&lt;P&gt;Who wrote the IP stack on the machines in question? We can&apos;t tell from the web site, which means in all probability it isn&apos;t open source. That means we have no idea what stack is running in there and what its vulnerabilities are. Even encrypted stacks can be vulnerable to certain kinds of attacks.
&lt;P&gt;Voting companies have been pretty underfunded. Why are we trusting our democracy to these stupid machines? The &lt;I&gt;only&lt;/I&gt; function of a computer in the democratic process should be to help &lt;I&gt;print a legible vote&lt;/I&gt;.
&lt;P&gt;Count me, as a computer guy, concerned.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/11/09.html#a433</guid>
			<pubDate>Sun, 09 Nov 2003 05:05:24 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=433&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F11%2F09.html%23a433</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Fixing Patents.&lt;/H5&gt;
&lt;P&gt;Great reading here...the FTC is &lt;A href=&quot;http://www.ftc.gov/opa/2003/10/cpreport.htm&quot;&gt;releasing findings&lt;/A&gt; about the patent system. Reading this, it&apos;s just common sense to do so, and everything in here squares with what I&apos;ve experienced. &lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/11/09.html#a430</guid>
			<pubDate>Sun, 09 Nov 2003 05:00:40 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=430&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F11%2F09.html%23a430</comments>
			</item>
		<item>
			<description>&lt;H5&gt;On the 1.5 Java Language Extensions.&lt;/H5&gt;
&lt;P&gt;I was reading the (old) &lt;A href=&quot;http://developer.java.sun.com/developer/community/chat/JavaLive/2003/jl0729.html&quot;&gt;chat at the Javasoft site&lt;/A&gt;.&amp;nbsp; It&apos;s got some insight from the developers...here are a few comments...&lt;/P&gt;
&lt;P&gt;On Generics: Nice addition to the language, but for the love of God why aren&apos;t primitive types included?&amp;nbsp; After all this time, I still cannot make an efficient map of integers to doubles, or any other primitive type combination.&amp;nbsp; What&apos;s missing is a generic-type capable&amp;nbsp;implementation of a BTree...this will lead to some serious compaction in atomic data storage...&lt;/P&gt;
&lt;P&gt;Typesafe Enums: Nice to have, like&apos;em, but Delphi did it better 47 million years ago.&amp;nbsp; Bit mask sets were perfect for tons of different things, and they&apos;re still perfect today.&amp;nbsp; A tiny little bit of syntactic sugar is all that&apos;s necessary to make them work.&amp;nbsp; Why should I incur hundreds of bytes of overhead to store a set of enums?&amp;nbsp; It makes no sense.&amp;nbsp; And if you want to treat them like real objects, the compiler can autobox into a typesafe enum object.&amp;nbsp; Just keep the representation in the field structures as compact as possible.&amp;nbsp; Remember, there might be several millions sets.&amp;nbsp; One of the most important uses for enums are flag sets, which just aren&apos;t going to be efficient in the proposed scheme.&amp;nbsp; &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;
&lt;P&gt;&lt;!--StartFragment --&gt;&lt;SPAN class=body&gt;&lt;EM&gt;&lt;B&gt;JFarre&lt;/B&gt;: What about supporting &quot;references to references&quot;? I know it&apos;s one of the hardest things to learn in C, but it allows us to almost do magic...&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;B&gt;Neal Gafter&lt;/B&gt;: This is sometimes called &quot;hooks&quot;, and I do miss this ability in the Java language. The closest thing we have is &lt;CODE&gt;java.lang.Ref&lt;/CODE&gt;. We haven&apos;t considered adding anything like pointers-to-pointers in the Java language.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;You don&apos;t need pointers to pointers.&amp;nbsp; You need a functional type, which can be used to do pretty much the same thing, with much more flexibility.&amp;nbsp; A proper functional type doesn&apos;t need an &quot;object&quot; to call a method on -- you can just call a &quot;thing&quot;, which can be atomic, a method call, a function call, or a composition of the above, and it returns a result of that type.&amp;nbsp; Of course, you can throw exceptions and they are declared in the functional type&apos;s signature.&lt;/P&gt;
&lt;P dir=ltr&gt;With the generic system you can create containers full of functional objects, and the possibilities are quite endless.&amp;nbsp; Functional type compatibility should be automatic with the compiler -- if the call signatures are compatible, it can be used...&lt;/P&gt;
&lt;P dir=ltr&gt;This is, in my opinion, the single biggest missing thing in Java.&amp;nbsp; If we had proper functional types, our code would be so much simpler, and we&apos;d all be doing cool higher-order functional programming.&lt;/P&gt;
&lt;P dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/11/04.html#a427</guid>
			<pubDate>Tue, 04 Nov 2003 20:59:42 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=427&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F11%2F04.html%23a427</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Sandboxing Outlook&apos;s HTML Display.&lt;/H5&gt;
&lt;P&gt;One of the perfidious things out there on the web right now are the nicely formatted &quot;scam&quot; emails that purport to be from places like PayPal.&amp;nbsp; Sometimes it can be pretty hard to distinguish these from the real thing -- the problem is that the HTML displays inside of common programs, like Outlook, don&apos;t show you where they&apos;re getting their information from.&amp;nbsp; The email program cracks the email apart, extracts the HTML content, then hands it to a browser component for display.&lt;/P&gt;
&lt;P&gt;What we need to do is have the email program pass the domain of the reply-to or message-source field to the browser component, which is then instructed to not display &lt;EM&gt;anything&lt;/EM&gt; that is not from that domain.&amp;nbsp; HTTP requests for that content in that component will not be sourced from anywhere but the indicated domain.&amp;nbsp; What&apos;s more, if &lt;EM&gt;any&lt;/EM&gt; part of the page tries to hit something outside that domain, the entire message will not display.&lt;/P&gt;
&lt;P&gt;This will pretty much eliminate HTML-formatted spam email.&amp;nbsp; It won&apos;t work because the pages can&apos;t access anything other than the server that sent the email.&amp;nbsp; Forge that, and your email doesn&apos;t display.&lt;/P&gt;
&lt;P&gt;Note that we can extend this concept to include regular email as well.&amp;nbsp; If the email contains a web address that comes from anywhere other than the domain that sent the address, we can elect to not display it.&amp;nbsp; Of course, this messes up having one friend send a link to another...so it&apos;s not particularly workable as is. &lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/11/03.html#a426</guid>
			<pubDate>Mon, 03 Nov 2003 18:21:29 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=426&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F11%2F03.html%23a426</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Spam Throttle.&lt;/H5&gt;
&lt;P&gt;I&apos;ve written on this before, but it&apos;s worth repeating:&lt;/P&gt;
&lt;P&gt;My feeling is that the internet as a whole is going to evolve towards a trusted/untrusted scenario.&amp;nbsp; Big vendors like AOL and MSN will be &quot;in the club&quot;, so to speak -- their mail systems will &quot;trust&quot; each other, and accept email at full speed.&lt;/P&gt;
&lt;P&gt;Other systems, particularly those connecting for the first time, will be untrusted.&amp;nbsp; Those systems will be severly limited in the number of emails that will be accepted.&amp;nbsp; A Bayesian filter can be applied to the email coming in from any new connection.&amp;nbsp; The filter doesn&apos;t stop the email; rather, it builds an approximation of how much spam is coming in over that particular connection.&amp;nbsp; The odd false positive isn&apos;t going to hurt, that way.&lt;/P&gt;
&lt;P&gt;As the system gains trust, which can happen only by having time elapse and by having a low spam percentage, trust will gradually accrue, and email traffic will be permitted to have progressively higher volumes.&lt;/P&gt;
&lt;P&gt;The beauty of this situation is that you still accept email from just about anywhere, but you don&apos;t _trust_ that source, until that source proves itself.&lt;/P&gt;
&lt;P&gt;It doesn&apos;t take very much to implement a solution like this.&amp;nbsp; Any organization that failed to implement it or have a strong anti-spam policy would find itself being on a lot of untrusted lists, and unable to send very much email.&amp;nbsp; Simply being a transfer point for spam will also get you untrusted, which means that you&apos;ll have to pay attention.&lt;BR&gt;&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/23.html#a410</guid>
			<pubDate>Thu, 23 Oct 2003 22:38:59 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=410&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F23.html%23a410</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Eliminating NullPointerExceptions.&lt;/H5&gt;
&lt;P&gt;Every reference in Java is either null, or valid.&amp;nbsp; In the development stage of many applications, and even during production phase, we can still see a lot of null pointer exceptions being thrown.&amp;nbsp; This is usually due to failure to check a return value from a function call.&lt;/P&gt;
&lt;P&gt;The null result is often returned from a function to indicate &quot;I couldn&apos;t&quot;, or &quot;that object was not available&quot;.&amp;nbsp; It is very common to want to return this result, and exceptions shouldn&apos;t be used to signify it.&amp;nbsp; We don&apos;t want to incur the overhead of generating an exception.&lt;/P&gt;
&lt;P&gt;It would be interesting to be able to mark a method as &quot;returns null&quot;, in the same manner that we can throw an exception.&amp;nbsp; The compiler can then check to see if the value returned is &lt;EM&gt;checked&lt;/EM&gt; for null, before being used.&amp;nbsp; If the value is returned from the function, that function must be marked the same way, forcing callers of it to check, or declare to throw.&lt;/P&gt;
&lt;P&gt;Yes, we can always put the null value into a class, and there are more convolutions of this principle that could get at that...&lt;/P&gt;
&lt;P&gt;It is an interesting idea, nonetheless.&amp;nbsp; Extending it further, we can note that we might declare multiple return &lt;EM&gt;paths&lt;/EM&gt; for any function, and the calling of that function becomes like a switch statement, where the type of the result directs the path of execution, much like a type-inferring language like Haskell or ML.&lt;/P&gt;
&lt;P&gt;And maybe that is what I really want.&amp;nbsp; For now, though -- enforced null checks!&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/12.html#a399</guid>
			<pubDate>Sun, 12 Oct 2003 21:01:23 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=399&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F12.html%23a399</comments>
			</item>
		<item>
			<description>&lt;H5&gt;&lt;!--StartFragment --&gt;&amp;nbsp;Anders Hejlsberg is Wrong, Part II.&lt;/H5&gt;
&lt;P&gt;And this time it&apos;s not me saying it.&amp;nbsp; &lt;A href=&quot;http://www.artima.com/intv/solid.html&quot;&gt;James Gosling is saying it&lt;/A&gt;.&amp;nbsp; Excellent.&amp;nbsp; Bottom line is, it&apos;s fun and fast to ignore exceptions or catch them in some pointless top-level loop.&amp;nbsp; That&apos;s fabulous for, I don&apos;t know, applications that don&apos;t matter?&amp;nbsp; Now you&apos;re writing an app that has to stay up.&amp;nbsp; This is what most of us are doing now, in the Java world.&amp;nbsp; It has to stay up for months, or years.&amp;nbsp; Do you think your top-level exception loop is going to be able to handle the multiple strategies that are necessary to deal with failure in that environment?&amp;nbsp; You&apos;re going to activate retry-logic at the top level?&lt;/P&gt;
&lt;P&gt;And what the heck is the top-level in any modern Java app anyway?&amp;nbsp; It doesn&apos;t exist.&lt;/P&gt;
&lt;P&gt;Java &lt;EM&gt;helps&lt;/EM&gt; you build robust code.&amp;nbsp; That is now, and has always been, its most important feature.&amp;nbsp; It does a better job of this than any other commonly used language.&amp;nbsp; We have a couple of a million lines of Java code in our app, and it&apos;s pretty damn bulletproof.&amp;nbsp; Trying to get to that level of reliability in C could take &lt;EM&gt;decades&lt;/EM&gt;.&amp;nbsp; And no, we are not crappy programmers.&amp;nbsp; If you think &lt;EM&gt;you&lt;/EM&gt; could do it in less time, you think you&apos;re smarter than a lot of very smart people out there who have been writing system-level stuff in C for longer than you have been alive.&amp;nbsp; Here&apos;s a clue: You&apos;re not.&amp;nbsp; You need the help; you just don&apos;t know it yet.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/10.html#a392</guid>
			<pubDate>Fri, 10 Oct 2003 19:49:51 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=392&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F10.html%23a392</comments>
			</item>
		<item>
			<description>&lt;H5&gt;At Play in Piccolo.&lt;/H5&gt;
&lt;P&gt;Something unexpected...(this likes a fast machine).&lt;/P&gt;
&lt;P&gt;&lt;APPLET height=350 archive=http://www.soletta.com/applets/rose2.jar width=350 code=com.soletta.rose.Fragmented.class&gt;&lt;PARAM NAME=&quot;_cx&quot; VALUE=&quot;9260&quot;&gt;&lt;PARAM NAME=&quot;_cy&quot; VALUE=&quot;9260&quot;&gt;&lt;/APPLET&gt;&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/10.html#a389</guid>
			<pubDate>Fri, 10 Oct 2003 06:54:35 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=389&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F10.html%23a389</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Piccolo Clock Action.&lt;/H5&gt;
&lt;P&gt;This is something I played with this evening.&amp;nbsp; Note that if you are running IE and you haven&apos;t installed the Java 2 stuff, you&apos;ll need that...this uses the default APPLET tag, only the recent Javas support that on Windows.&amp;nbsp; Go to &lt;A href=&quot;http://www.java.com/en/index.jsp&quot;&gt;JavaSoft&lt;/A&gt; and pull the latest runtime and you&apos;ll be set.&lt;/P&gt;
&lt;P&gt;&lt;APPLET height=250 archive=http://www.soletta.com/clockdemo.jar width=250 code=com.soletta.piccolo.ClockDemoApplet.class&gt;&lt;PARAM NAME=&quot;_cx&quot; VALUE=&quot;6615&quot;&gt;&lt;PARAM NAME=&quot;_cy&quot; VALUE=&quot;6615&quot;&gt;&lt;/APPLET&gt;&lt;/P&gt;
&lt;P&gt;Ain&apos;t it cool? Check out &lt;A href=&quot;http://www.cs.umd.edu/hcil/jazz/&quot;&gt;Piccolo&lt;/A&gt;!&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/09.html#a385</guid>
			<pubDate>Thu, 09 Oct 2003 06:27:48 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=385&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F09.html%23a385</comments>
			</item>
		<item>
			<description>&lt;H5&gt;The Other Eclipse.&lt;/H5&gt;
&lt;P&gt;&lt;A href=&quot;http://www.haley.com&quot;&gt;The Haley Project&lt;/A&gt; is Paul Haley&apos;s commercial exploration of rule system technologies and advances.&amp;nbsp; If you haven&apos;t paid much attention to rule-based programming, you should become familiar.&amp;nbsp; I&apos;ve written on the topic before, and you didn&apos;t listen, did you?&amp;nbsp; You should check out Jess, from Sandia.&amp;nbsp; You should also check out Eclipse, The Haley Project&apos;s powerful rules engine.&amp;nbsp; One of the best things you can do for yourself once you get past the initial familiarity phase of CLIPS and rule programming is read the downloadable manual for Eclipse.&amp;nbsp; It is chock full of advice for the rule systems programmer; serious advice, on how to structure facts, information, and requests.&amp;nbsp; It was an unusual read for me -- I didn&apos;t think that anything like that existed.&amp;nbsp; I have been painfully creating my own structures for performing many of these tasks, and I would have had a huge head start if I&apos;d read the Eclipse stuff first. &lt;/P&gt;
&lt;P&gt;Eclipse also comes with a powerful debugging system that allows you to really pull apart the rule network and understand what&apos;s going on inside of it.&amp;nbsp; Being able to observe these things gives you the ability to fine-tune your rule network.&amp;nbsp; Eclipse&apos;s variant of the CLIPS language provides additional mechanisms for specifying network structure that can come in really handy for tuning.&amp;nbsp; It also provides very powerful agenda handling; this can be used to avoid a lot of the &lt;EM&gt;salience&lt;/EM&gt; games you normally play in CLIPS.&lt;/P&gt;
&lt;P&gt;Haley also has the AuthoRete product, which allows you to build rule systems from plain english statements.&amp;nbsp; And it understands quite a bit of english, if you follow some reasonable structuring guidelines.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I&apos;ll be examining this one closely over the next few days.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/08.html#a383</guid>
			<pubDate>Thu, 09 Oct 2003 01:36:28 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=383&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F08.html%23a383</comments>
			</item>
		<item>
			<description>&lt;H5 dir=ltr&gt;I Like Mozilla.&lt;/H5&gt;
&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;
&lt;P&gt;&lt;A href=&quot;http://www.cwinters.com/News/show/?news_id=1040&quot;&gt;Kicking mozilla to the curb&lt;/A&gt;. ...in a manner of speaking. The &lt;A href=&quot;http://mozilla.org/products/firebird/&quot;&gt;Firebird&lt;/A&gt; and &lt;A href=&quot;http://mozilla.org/projects/thunderbird/&quot;&gt;Thunderbird&lt;/A&gt; Mozilla projects have both been working very well for me. In particular Firebird gets rid of the vein-poppingly infuriating UI decision to put &apos;Close Tabs&apos; and &apos;Close Other Tabs&apos; right next to each other, and when looking at your &apos;Sent&apos; folder Thunderbird can actually display the recipient rather than the sender, which is always you. Thunderbird in particular seems a bit snappier when marking junk mail and deleting messages. And both seem stable on Win32 (XP) and Linux. [&lt;A href=&quot;http://www.cwinters.com/&quot;&gt;cwinters.com&lt;/A&gt;]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;You know, I&apos;ve never really understood why people keep complaining about it.&amp;nbsp; It&apos;s way cool, stable, fast, everything.&amp;nbsp; The usual complaints are too big, too bloated...what kind of machine are you running on, anyway?&amp;nbsp; On my box Moz sits in resident mode, and it&apos;s up and browing in a fraction of a second, whenever I want it.&amp;nbsp; It&apos;s a small download.&amp;nbsp; It installs painlessly, without requiring reboots.&amp;nbsp; Popups are a thing of the past.&amp;nbsp; It has comprehensive newsgroup handling, chat, and lots of other cool stuff.&amp;nbsp; You can customize the heck out of it.&lt;/P&gt;
&lt;P dir=ltr&gt;What&apos;s not to love?&amp;nbsp; Where&apos;s the love, man?&lt;/P&gt;
&lt;P dir=ltr&gt;I am anti-dissing Mozilla.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/08.html#a382</guid>
			<pubDate>Wed, 08 Oct 2003 21:11:01 GMT</pubDate>
			<source url="http://www.cwinters.com/raw/cwinters.rdf">cwinters.com</source>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=382&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F08.html%23a382</comments>
			</item>
		<item>
			<description>&lt;H5&gt;H1-B Realities.&lt;/H5&gt;
&lt;P&gt;Chiara has &lt;A href=&quot;http://www.jroller.com/page/chiara/20031003#h1b_controversy_or_are_itt&quot;&gt;recently written&lt;/A&gt; on this subject.&amp;nbsp; You should read what she said, and take the time to read &lt;A href=&quot;http://heather.cs.ucdavis.edu/Summary.pdf&quot;&gt;the report&lt;/A&gt; she refers to.&amp;nbsp; There are a number of forces at work, and they&apos;re not working in favor of us programmers here in the US...&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Cheating is rampant.&amp;nbsp; Companies abuse the H1-B process to find cheap labor.&amp;nbsp; They falsely certify that they are unable to find appropriate employees already able to work in the US. &lt;/LI&gt;
&lt;LI&gt;Corruption is&amp;nbsp;present, and &lt;EM&gt;may&lt;/EM&gt; be common.&amp;nbsp; There are people out there who &quot;broker&quot; H1-B positions; they&apos;re in a position to hire and fire, falsify certifications, and so forth.&amp;nbsp; Employees are often required to pay to get their position, or give part of their pay.&lt;/LI&gt;
&lt;LI&gt;L1 abuse is becoming more frequent.&amp;nbsp; This does an end run around the entire visa process; consulting front companies use the L1 process to import additional consultants, who are farmed out at cheap rates.&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;Fear means silence.&amp;nbsp; Current H1-B holders are often scared to complain about long work weeks, low pay, paying a &quot;toll&quot; to get their job, or giving part of their pay to some organizer.&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;What we&apos;ve got is a system with good intentions (to allow American companies to import the specific, skilled expertise they need), that&apos;s resulted in a lot of cheating and imbalances.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In the interests of full disclosure, I&apos;ll point out that I am a Canadian working in the US.&amp;nbsp; Fortunately, Canada and the US have a &lt;EM&gt;bidirectional&lt;/EM&gt; visa program, whereby Americans who work in certain professions can easily get a visa to work in Canada, and vice-versa.&amp;nbsp; Our two cultures are very comparable in just about every way, so that program has worked well for both countries, and given the citizens of each substantial additional freedom.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/05.html#a378</guid>
			<pubDate>Mon, 06 Oct 2003 01:08:39 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=378&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F05.html%23a378</comments>
			</item>
		<item>
			<description>&lt;H5&gt;My Eclipse Wish List.&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;Move member function somewhere outside its hierarchy.&lt;/LI&gt;
&lt;LI&gt;Export/import breakpoint set (I have complex ones with filters I would like to share).&lt;/LI&gt;
&lt;LI&gt;Common LISP support.&lt;/LI&gt;
&lt;LI&gt;Scheme support.&lt;/LI&gt;
&lt;LI&gt;Jess support.&lt;/LI&gt;
&lt;LI&gt;Splitting of editor windows&lt;/LI&gt;
&lt;LI&gt;Fast numbered bookmarks like JBuilder (ctrl-shift-# to set, ctrl-# to go to).&lt;/LI&gt;
&lt;LI&gt;Better decorators to show cvs modification status (they&apos;re too small).&lt;/LI&gt;
&lt;LI&gt;A &quot;reconfigure&quot; mode for large projects, where I can turn off updating until I&apos;m finished making project changes.&amp;nbsp; Then, it refreshes and rebuilds everything.&lt;/LI&gt;
&lt;LI&gt;Better compaction of the debugger view -- filter out regular, running threads.&lt;/LI&gt;
&lt;LI&gt;Hotkey-based pop-out object inspection (nice big window for complex objects).&lt;/LI&gt;
&lt;LI&gt;Less finger-painful hotkey for Quick Fix.&amp;nbsp; Control-1 is a stupid key for anything, dammit.&amp;nbsp; OK, I guess I can remap this myself, but really, man...what were you thinking?&lt;/LI&gt;
&lt;LI&gt;Never auto-open imports in outline.&lt;/LI&gt;
&lt;LI&gt;Resource History should be full window, not a tab.&lt;/LI&gt;&lt;/OL&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/10/02.html#a372</guid>
			<pubDate>Thu, 02 Oct 2003 20:19:44 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=372&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F10%2F02.html%23a372</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Overseas Job Exodus.&lt;/H5&gt;
&lt;P&gt;I was thinking about yet another call I got today from yet another offshore outsourcing company.&amp;nbsp;There has to be some way of stopping some of this flow of jobs, in the high tech industry.&amp;nbsp; Here&apos;s my thought -- drop any tax write-off for overseas services work.&amp;nbsp; That is, disallow as a business expense money given to overseas outsourcing shops.&amp;nbsp; I have no problem with a bunch of hard-working guys in India doing software.&amp;nbsp; How about they develop their own software economy, over there?&amp;nbsp; Figure out some products, design&apos;em, build&apos;em...it&apos;s not like they can&apos;t...lots of great companies.&lt;/P&gt;
&lt;P&gt;We just need to find a way to stop the blood-flow of jobs.&amp;nbsp; What&apos;s happened in the manufacturing sector could happen in high-tech.&amp;nbsp; I think it&apos;s worth mentioning that the playing field isn&apos;t really level -- American companies must provide a&amp;nbsp;lot of benefits to their workers (health care, etc)...the costs just aren&apos;t there overseas.&amp;nbsp; It&apos;s not really protectionism...&lt;/P&gt;
&lt;P&gt;Maybe I&apos;m really wrong-headed, here...&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/30.html#a371</guid>
			<pubDate>Wed, 01 Oct 2003 04:29:39 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=371&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F30.html%23a371</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Fixing Electronic Voting.&lt;/H5&gt;
&lt;P&gt;Interesting &lt;A href=&quot;http://yro.slashdot.org/article.pl?sid=03/09/23/1235245&amp;amp;mode=nested&amp;amp;tid=103&amp;amp;tid=99&quot;&gt;article on Slashdot &lt;/A&gt;about Electronic Voting...read through the links, especially &lt;A href=&quot;http://www.scoop.co.nz/mason/stories/HL0309/S00150.htm&quot;&gt;this one&lt;/A&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;It strikes me as incredible that&amp;nbsp;the &quot;technical&quot; people writing these emails are engaged in such Mickey Mouse chatter, and so interested in just cranking&amp;nbsp;out something, anything that will work.&amp;nbsp; I just don&apos;t see how electronic voting is really all that hard to engage in...as long as you have your priorities straight.&lt;/P&gt;
&lt;P&gt;There are two primary things we want&amp;nbsp;to accomplish with EVotes -- first, we want to make the voting process easier to engage in.&amp;nbsp; Second, we want to make the counting process more efficient (less costly).&amp;nbsp; We would also like to reduce the error rate, to the extent that we are able.&lt;/P&gt;
&lt;P&gt;A touch screen voting interface, big and clear and nice, is exactly what we need to help walk people through the process.&amp;nbsp; We can&apos;t, though, rely on the software in these machines.&amp;nbsp; One read through the memos above should convince you as to why -- these people just have no idea what they&apos;re doing.&amp;nbsp; Basic?&amp;nbsp; Access databases?&amp;nbsp; Windows?&amp;nbsp; My god.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;What this says to me is that we simply cannot get away from paper.&amp;nbsp; So what we want is a system that makes paper easier to use, leaves a paper trail for auditing and verification purposes, and provides ample opportunity for error checking by the voter and by election officials.&lt;/P&gt;
&lt;P&gt;We use the touch screen to answer questions.&amp;nbsp; At the end of the voting session, the system prints a &quot;vote&quot; and electronically tabulates the results.&amp;nbsp; The voter verifies that his printed vote matches what&apos;s on the tabulation screen.&amp;nbsp; The voter then folds his paper vote and deposits it with election officials in a good old fashioned ballot box.&lt;/P&gt;
&lt;P&gt;We can then use the electronic tabulation to check quickly on the results -- this is quite efficient.&amp;nbsp; We will also engage in a substantial amount of verification, by counting the paper votes by hand and verifying this against totals learned electronically.&amp;nbsp; The paper always wins, in this system.&amp;nbsp; We do not necessarily need to count all of the paper votes -- we can use random sampling.&lt;/P&gt;
&lt;P&gt;It seems like a win in both directions, for me.&amp;nbsp; Risks include unacceptable printout quality (printer wear), and insufficient random verification.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/23.html#a351</guid>
			<pubDate>Tue, 23 Sep 2003 16:14:50 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=351&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F23.html%23a351</comments>
			</item>
		<item>
			<description>&lt;H5&gt;H1-B Visa Cut.&lt;/H5&gt;
&lt;P&gt;It doesn&apos;t affect me because I&apos;m on a different visa as a Canadian, but it&apos;s interesting nonetheless.&amp;nbsp; The Washington Post is &lt;A href=&quot;http://www.washingtonpost.com/wp-dyn/articles/A47498-2003Sep22.html&quot;&gt;reporting&lt;/A&gt; that the number of H1-B visas is going to be cut from 195,000 to 65,000.&amp;nbsp; I know a fair number of people who have been out of work (although a lot of them have found jobs now), so I can certainly sympathize with this.&amp;nbsp; What I am worried about, though, is that we&apos;re just going to drive companies into overseas outsourcing.&amp;nbsp; In my position, two years ago I might have gotten one call a year asking me if I wanted to outsource.&amp;nbsp; Now I get at least two or three a month...outsourcing has become huge.&amp;nbsp; Sending those dollars overseas is the kind of thing that just might be contributing to our &quot;jobless&quot; recovery at the moment.&lt;/P&gt;
&lt;P&gt;In the long run, the only thing that has value in our business is &lt;EM&gt;change&lt;/EM&gt;.&amp;nbsp; Get used to it.&amp;nbsp; You need to be able to efficiently do those changes.&amp;nbsp; As a domestic worker, you have &lt;EM&gt;serious advantages&lt;/EM&gt; over the competition.&amp;nbsp; Your communication loop is tight.&amp;nbsp; You have a better cultural fit.&amp;nbsp; You can be a known quantity.&amp;nbsp; You can provide references.&amp;nbsp; Some of these advantages are going to fade over time, so you need to keep them up.&lt;/P&gt;
&lt;P&gt;Something that can&apos;t be outsourced, though, is raw creativity.&amp;nbsp; If &lt;EM&gt;you&lt;/EM&gt; come up with something that hasn&apos;t been done before, it&apos;s your idea.&amp;nbsp; Creativity builds markets, companies, jobs, and wealth...it&apos;s something that this country does incredibly well, and can&apos;t be outsourced.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/22.html#a350</guid>
			<pubDate>Tue, 23 Sep 2003 02:03:04 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=350&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F22.html%23a350</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Technical Notes.&lt;/H5&gt;
&lt;P&gt;Trackback is now enabled (I think) for this Radio Userland -powered blog.&amp;nbsp; I&apos;ve been playing a bit with Movable Type and may switch, but for now...we&apos;ll proceed with this.&amp;nbsp; The pictures in the previous entry might look a little better if you expand your browser window.&lt;/P&gt;
&lt;P&gt;I wrote a quick Java program to read in my 1MB+ source images (from my Canon S50 camera)...It uses the 1.4 SE imaging API.&amp;nbsp; I&apos;ve done a lot of image work in the past, and I don&apos;t mind telling you that the imaging API is, on the face of it, pretty crappy.&amp;nbsp; You simply have to do too much work to do some simple things, and there are &lt;EM&gt;way&lt;/EM&gt; too many formats and options on most of the classes.&amp;nbsp; Some of it is infrastructure that&apos;s dedicated to handling asynchronous image work and I understand the complexities of it are necessary, but for God&apos;s sake, provide simple ways to do the simple things.&lt;/P&gt;
&lt;P&gt;Resizing an image turns out to be a pain in the ass.&amp;nbsp; You can easily load your image in with ImageIO, which provides you with a BufferedImage.&amp;nbsp; BufferedImage inherits a getScaled-type call, which looks like exactly what you need, until you realize that it returns an Image.&amp;nbsp; If you check the class of the image, it&apos;s some weird AWT thing.&amp;nbsp; In order to use ImageIO&apos;s writing, you need a RenderedImage (of which BufferedImage is one).&amp;nbsp; So how do you get there?&amp;nbsp; The answer is, you can&apos;t.&lt;/P&gt;
&lt;P&gt;What I ended up doing is creating a new BufferedImage, getting a Graphics2D from it, then rendering the source image onto the target.&amp;nbsp; I set the rendering hints, but frankly the image quality absolutely sucks.&amp;nbsp; I&apos;ll need to go back and tack on the interpolation hint directly and see if that makes a difference.&lt;/P&gt;
&lt;P&gt;The main reason I ended up writing&amp;nbsp;a little program to do this is that the batch resizing program I have (Adobe Photoshop Elements) is just plumb stupid about portrait vs. landscape images.&amp;nbsp; There&apos;s no way to convince it to do the right thing.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/20.html#a348</guid>
			<pubDate>Sat, 20 Sep 2003 19:53:42 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=348&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F20.html%23a348</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Seeing-Eye Tongue.&lt;/H5&gt;
&lt;P&gt;Clive Thompson finds the &lt;A href=&quot;http://www.collisiondetection.net/mt/archives/000494.html#000494&quot;&gt;damndest things&lt;/A&gt;.&amp;nbsp; Who woulda thunk it?&amp;nbsp; I can&apos;t see any particular need for a yucky thing in your mouth, though -- why not just have a headband that divides the space around you into quadrants (or finer).&amp;nbsp; Tingle the appropriate quadrant of the with a strength roughly approximating distance (via ultrasonic bounce) from obstacles in that direction.&lt;/P&gt;
&lt;P&gt;That way we can have blind people who will have &quot;eyes&quot; in the back of their head.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/12.html#a340</guid>
			<pubDate>Fri, 12 Sep 2003 21:20:23 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=340&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F12.html%23a340</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Takedown.&lt;/H5&gt;
&lt;P&gt;One of our clients had a good chunk of their network taken down by one of the trojan emails today -- probably blaster or something like that.&amp;nbsp; Let&apos;s look at the simple equation:&lt;/P&gt;
&lt;P&gt;C + Unrestricted Access + Buffer Overflow = You Will Never Be Secure.&lt;/P&gt;
&lt;P&gt;Windows machines are fundamentally flawed, at the core.&amp;nbsp; It can never be fixed.&amp;nbsp; You either need a VM (which provides a relatively secure environment), or an operating system that uses a variety of techniques to prevent a process from doing anything it&apos;s not supposed to do.&lt;/P&gt;
&lt;P&gt;COM and ActiveX were built on the notion that by &lt;EM&gt;certifying&lt;/EM&gt; something, you assure that it is secure.&amp;nbsp; Today&apos;s additional DCOM patch, and the worms that are out there, show us otherwise.&amp;nbsp; This isn&apos;t the last one.&amp;nbsp; There will never be a &quot;last one&quot;, because new code keeps landing on machines, and it&apos;s all vulnerable.&lt;/P&gt;
&lt;P&gt;It&apos;s time for a do-over, people.&lt;/P&gt;
&lt;P&gt;My weekend reading: Bruce Schneier&apos;s &lt;EM&gt;Beyond Fear&lt;/EM&gt;.&amp;nbsp; I hope to come out educated.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/12.html#a339</guid>
			<pubDate>Fri, 12 Sep 2003 05:08:14 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=339&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F12.html%23a339</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Chapter 1.&lt;/H5&gt;
&lt;P&gt;I have been writing (and there&apos;s a lot to do):&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;This is not a book of answers.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;It&amp;#146;s a book full of questions &amp;#150; hard-won observations about enterprise-class software and its implementation.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;My intent is to put some new thinking in front of you, the reader.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;I would never claim to have invented many of the techniques that you will read about, but I do hope that this book is bringing some of them together for the first time.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;The set of keywords I used professionally used to include &lt;I&gt;reliability&lt;/I&gt;, &lt;I&gt;encapsulation, normalization&lt;/I&gt;&amp;#184; and so forth.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;These are still great words!&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We need what they imply.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;But there are more words that are important &amp;#150; &lt;I&gt;resilience, partial information, self-repair, aspects, deployment&amp;#133;&lt;/I&gt;enterprise-class software needs these.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;I&amp;#146;ve spent 20 years following the winding evolution of programming.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Like most programmers my age, I began my learning process playing with early microcomputers like the Apple II and the Atari 800.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We have come a long way since POKE 101, 25.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Computer languages have sparked and grown in an ecosphere full of needs.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Assembly language still has its place today, but for most usages, there are easier and more appropriate dialects to work in.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We&amp;#146;ve seen evolution from assembly to procedural languages, structural to object-oriented, and a myriad of functional and logical languages.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Each has its place, its strengths and weaknesses.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;As of 2003, most applications are constructed with an object-oriented basis.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A number of mature methodologies exist for creating object models; they have produced some excellent results.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;One of the noted strengths of good object-oriented design is the ease with which change can be accommodated by altering the model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Change is at the heart of almost every software enterprise.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Any software that is actually &lt;I&gt;used&lt;/I&gt; has constantly evolving requirements.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;We also find a growing trend towards special purposes interfaces.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Rarely is software constructed in a vacuum: We code to the reality of the internet, to the sharing of data, and to many users.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;With such a myriad of information available, we often wish to focus the information available to a particular class of user.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Specialized interfaces meet this need, deployed against particular platforms such as web browsers, Java, or a traditional client.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We also see hybrid user interfaces gaining in popularity, where the best of traditional user interfaces design is coupled with web capabilities.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;The only constant in all of this is change.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;New methodologies, generally referred to as Agile Development, have arisen to help manage change within the development process.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Object-orientation in general is capable of doing a good job of handling change at the design level.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We can refactor a design to handle new tasks, achieve better organization, expand on capabilities, and so forth.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This represents a significant evolution from the early days of programming, where applications were excessively brittle and hard to evolve once written.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Modern object-oriented programming environments make it easier to &lt;I&gt;deploy&lt;/I&gt; these applications.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The various incarnations of the Java platform and of Microsoft&amp;#146;s .NET architecture are prime examples.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;These systems come with vast libraries of functionality, and many tools to effect the sophisticated deployment of applications.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Java achieves a high level of portability as well.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;For all this coding and development flexibility, we have made little progress in creating applications that are flexible &lt;I&gt;at runtime&lt;/I&gt;.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We need applications that can evolve, adapt, and even reason.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We need to structure our information in a way that allows this complex processing to take place.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;At the same time, we don&amp;#146;t want to lose the structuring capability that a traditional object model provides.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Object models still give us a good mechanism for dealing with some of the real world things we want to model, and achieving comprehension of the result.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;What we want to create is a blend of conventional application design and techniques from the worlds of knowledge management and artificial intelligence.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We want a common way of expressing this information, of transforming it, of querying it, and displaying it.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Aha! You may think at this point&amp;#133;this sounds like XML!&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;XML is an interesting way of expressing information, but is difficult to work with and not really appropriate for the kinds of applications we want to construct.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;XML has problems with scale and querying, as the specifications stand &amp;#150; very few tools can really deal with large amounts of XML (say, gigabytes worth).&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;There&amp;#146;s something more fundamental than XML&amp;#146;s tree of information.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Instead, we want to break things down to the basics.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;I&gt;Statements&lt;/I&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt; (or facts) are at the base of the information pyramid in computer science.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We can construct complex entities by binding together statements.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Consider the following:&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;&lt;I style=&quot;mso-bidi-font-style: normal&quot;&gt;Ross has a last name of Judson&lt;/I&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Here we indicate that a person named Ross has a certain last name.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;If we decide to be a little more &amp;#147;computery&amp;#148; about this, we might rephrase as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;Ross has_last_name Judson.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;There are three symbols involved here: Ross, has_last_name, and Judson.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Symbols are extremely useful; we&amp;#146;ll be delving into them extensively later on, and talking about efficient ways to implement them and work with them.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Our symbol-based example doesn&amp;#146;t quite express what we want, though.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Let&amp;#146;s add the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;Ross is_a Person.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;Now we know that Ross has a last name of Judson, and Ross is a person.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The examples given so far are in a &lt;/SPAN&gt;&lt;I style=&quot;mso-bidi-font-style: normal&quot;&gt;triple form&lt;/I&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Triples are very useful things; they form the basis of RDF, an important standard we will discuss later.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A triple is a special form of a tuple. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;These atomic statements can be used to construct just about anything.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Consider:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;Employee subclass_of Person.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Here we have declared that employee is a subclass of person.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;In a conventional object language, we might do something like the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;class Person {&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;Lucida Console&quot;&gt;&lt;SPAN style=&quot;mso-tab-count: 1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;String name;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;class Employee extends Person {&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;Lucida Console&quot;&gt;&lt;SPAN style=&quot;mso-tab-count: 1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;String department;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;FONT face=&quot;Lucida Console&quot; size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;What I am trying to convey here is that for any given object-oriented program, we can encode both the data and metadata of that program in simple statements.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;There can be any number of such encodings; RDFS is one example that we will discuss at length later.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Symbols and other identifiers can be used to &lt;/SPAN&gt;&lt;I style=&quot;mso-bidi-font-style: normal&quot;&gt;join&lt;/I&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt; the statements together into a complex model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Concepts such as generalization, aggregation, and association can easily be mapped into statements.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Once we have done this, we have created a fully fluid meta-model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A fluid meta-model easily copes with change &lt;/SPAN&gt;&lt;I style=&quot;mso-bidi-font-style: normal&quot;&gt;at runtime&lt;/I&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt; by altering the statements that control the metamodel.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This characteristic is key to the flexible applications we seek to develop.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Conventional object-oriented languages execute a compilation phase that creates a runtime version of the application&amp;#146;s metamodel.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This information is sometimes available, at least in part, to programs written in the language.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A Java program can, for example, elicit a good deal of information about itself from the runtime system.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Most C++ programs cannot, though &amp;#150; the C++ runtime type standard is primitive at best.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A C++ program is not privy to the information the compiler has about it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Instead of creating an object model, we create a knowledge base.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We structure the knowledge base with statements that correspond to object-oriented concepts.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Knowledge bases are highly amenable to logic processing with systems such as Prolog (for backward chaining) and CLIPS (for forward chaining).&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Using these tools we can easily react to change in our knowledge base (run rules), and also perform a significant level of ad-hoc querying.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Because we are expressing our data and metamodel in the same way, we can easily react to changes in our metamodel, as well as changes in the data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;As important as a flexible metamodel is, it is equally important to be able to distribute that knowledge and work with it in applications that span large areas, geographically or otherwise.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;When we condense our metamodel and model down into statements, we only need to develop mechanisms that can distribute the statement information.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Once we have successfully done that, all our knowledge and metamodels are easily transferred.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Distributed propagation of a complex object model is very difficult and error prone.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Numerous point mechanisms are usually constructed and the &amp;#147;hidden corners&amp;#148; are what bites back in the deployment of such a system.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We choose instead to propagate our statements, and the edits to those statements.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This is a substantially easier problem, as a quick recitation of Linda tuplespace history will show (covered later).&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Finally, straightforward mappings of knowledge to XML are available (RDF is one such mapping).&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Once the knowledge base has been queried and transformed into XML, a whole host of capabilities become available for generating pages and other kinds of displays that can be presented to a user (in XUL, HTML or XHTML form).&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;We do not need to transform into XML before presenting to a user, though &amp;#150; we can create widgets that are able, through adapters, to interoperate directly with the knowledge base the application contains.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;When a user works with the application, we make appropriate changes to the knowledge base.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Our rules engines and other user interfaces react appropriately.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-style: italic&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;Ted Nelson (of hypertext fame) said this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;``Intertwingularity is not generally acknowledged -- people keep pretending they can make things deeply hierarchical, categorizable and sequential when they can&apos;t. Everything is deeply intertwingled.&apos;&apos;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 6pt&quot;&gt;&lt;FONT face=&quot;Palatino Linotype&quot;&gt;I can&amp;#146;t vouch for the presence of the word &lt;I&gt;intertwingularity&lt;/I&gt; in a dictionary, but it should be there!&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;What I am trying to do in this book is describe are some of the ways of creating this intertwingularity and working with it to create real applications.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;At the least, I hope to change the way you view object models, and open your mind to the simpler and more powerful techniques that pure knowledge representations offer.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &apos;Palatino Linotype&apos;; mso-fareast-font-family: &apos;Times New Roman&apos;; mso-bidi-font-family: &apos;Times New Roman&apos;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;In other words, everything you know is wrong.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Well, not everything, but enough of it that I hope you will have at least a few lightning bolts strike in your mind as you engage it on what follows&amp;#133;I know that as I learned of these ideas for the first time a few brain cells were singed.&lt;/SPAN&gt;&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/11.html#a337</guid>
			<pubDate>Thu, 11 Sep 2003 07:13:08 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=337&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F11.html%23a337</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Interdependency vs. Reuse.&lt;/H5&gt;
&lt;P&gt;The proliferation of pseudo-standard Java libraries, such as the various &lt;EM&gt;commons&lt;/EM&gt; libraries, has me a bit nervous.&amp;nbsp; On one hand we&apos;ve got some extraordinarily useful stuff out there -- byte code engineering libraries, XML handling, mathematics, you name it.&amp;nbsp; We Java programmers have riches that no other environment has, right now.&amp;nbsp; We even have handy tools like &lt;EM&gt;maven&lt;/EM&gt;, which are designed to have a look at what&apos;s being built and automatically download dependent libraries.&amp;nbsp; I&apos;ve never personally used Maven other than to build someone else&apos;s project; I&apos;m not really a command line kind of guy, on a day-to-day basis.&amp;nbsp; In my day job, we use an &lt;EM&gt;ant&lt;/EM&gt; build system for the baseline and release builds, but nobody uses it incrementally (we all use Eclipse, except for this one guy who insists on using JEdit, and we all laugh at him but he&apos;s really good so we don&apos;t laugh too much).&lt;/P&gt;
&lt;P&gt;It&apos;s just way too easy to pluck one or two bits of functionality out of a huge library, and drag a huge mess of dependencies and the accompanying work into the VM.&amp;nbsp; Most of the time those .class files are going to sit there out of reach and you won&apos;t have to worry about them -- the VM isn&apos;t going to be doing much extra work.&amp;nbsp; But are you sure?&amp;nbsp; Have you watched the classloader to see what it is doing?&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The internal dependencies of libraries are a funny thing.&amp;nbsp; You never really know what you&apos;re going to be bringing in, when you touch something that you think it quite simple and quite isolated.&amp;nbsp; Back in the Day, we used to have these funny things called linkers.&amp;nbsp; You old guys know what I mean.&amp;nbsp; You&apos;d compile your stuff down into object files, link with library files, and voila, you&apos;d have your nice tight executable.&amp;nbsp; All is well.&amp;nbsp; The thing is, the main function of a linker is the throw away the things you don&apos;t need (well, there are other things too, but it&apos;s still a main point).&amp;nbsp; When the compiler and linker know what&apos;s being used, there&apos;s a lot of optimization that can take place.&lt;/P&gt;
&lt;P&gt;Java, with its dynamic linking capability, is another story.&amp;nbsp; You never really know what&apos;s going to be used.&amp;nbsp; We have optimizers (like yGuard) that can do some of this optimization for us, throwing away some of what we need.&amp;nbsp; Still, it&apos;s an uncomfortable thing.&amp;nbsp; Too much gets dragged in; things just get too complicated.&lt;/P&gt;
&lt;P&gt;The bottom line is, you&apos;ve got a &lt;EM&gt;huge&lt;/EM&gt; library of base functionality sitting there in J2SE.&amp;nbsp; Consider using it as much as you can.&amp;nbsp; Logging?&amp;nbsp; Unless you have some pretty specific requirements, just use what&apos;s&amp;nbsp;in there.&amp;nbsp; Same goes for XML, regular expressions, collections, and so forth.&amp;nbsp; Come up with a &lt;EM&gt;damn&lt;/EM&gt; good reason before going outside the base kit.&lt;/P&gt;
&lt;P&gt;Second, before pulling in something huge, evaluate your level of usage.&amp;nbsp; Do you really need the whole thing?&amp;nbsp; Can you just pull out a small part of it and use that?&amp;nbsp; &lt;EM&gt;Seriously&lt;/EM&gt; consider a little cut-and-paste reuse.&amp;nbsp; You might just be able to get by quickly and easily, and not create additional dependency problems.&lt;/P&gt;
&lt;P&gt;Third, be sparse in your use of code from another library.&amp;nbsp; Restrict yourself to the smallest set of interfaces, and the smallest set of methods that you possibly can.&amp;nbsp; Cutting these dependencies will pay dividends later, when that library morphs in a way you didn&apos;t expect, which happens with distressing frequency.&amp;nbsp; I don&apos;t begrudge library authors their right to change; they can and should.&amp;nbsp; It&apos;s simply a matter of balancing the cost of the various methods of adapting, copying, or reusing library code.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Keep in mind all three methods, and make conscious decisions.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/09.html#a333</guid>
			<pubDate>Wed, 10 Sep 2003 02:52:29 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=333&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F09.html%23a333</comments>
			</item>
		<item>
			<description>&lt;H5&gt;On Checked Exceptions.&lt;/H5&gt;
&lt;P&gt;Significant disagreement in the blogosphere -- what a surprise! I&apos;ve read a &lt;A href=&quot;http://www.hutteman.com/weblog/2003/08/31-118.html&quot;&gt;number&lt;/A&gt; of &lt;A href=&quot;http://www.dehora.net/journal/archives/000360.html#000360&quot;&gt;entries&lt;/A&gt; disagreeing with my approach to checked exceptions. Let&apos;s look at a few of the objections:&lt;/P&gt;
&lt;P&gt;1. An exception subclass doesn&apos;t tell you what&apos;s wrong. Last time I checked, every exception supports the getMessage() call. There&apos;s nothing stopping people from implementing that and ensuring that good, accurate messages are present in string form. In fact, it&apos;s pretty much a requirement that they be there. So if you have a subclass you&apos;re able to divert control based on being a subclass, but also able to simply deal with a more general case of having a string-based error message.&lt;/P&gt;
&lt;P&gt;2. It&apos;s all just a goto. I don&apos;t think it is. Exceptions do a whole bunch of things that goto simply doesn&apos;t do. Yes, we could simulate them. No, we shouldn&apos;t do that. The whole point behind checked exceptions is to ensure that things are cleaned up correctly when something goes wrong.&lt;/P&gt;
&lt;P&gt;The main point is this: It is very rare that we actually care what has gone wrong. We just know that something has. What we really care about are the categories of responses we can make to a given kind of error. I think there is a significant case to be made for throwing separate exception families for a given response category. For example -- if you are iterating through a loop that is performing remote calls and you encounter a remote communications error, you probably want to exit the loop. You&apos;re not going to be getting anywhere further, and more calls aren&apos;t necessary. You need to engage a certain logic pathway to deal with that. If your iteration call encounters some kind of localized, &quot;I can&apos;t deal with this object&quot; error, then you might want to skip over that specific object and move on to the next one.&lt;/P&gt;
&lt;P&gt;There are various forms of error response, each divided by category. One size does NOT fit all. And in many cases, we want to ensure that the appropriate handling has take place. Checked exceptions are really the only static way to get at this problem. On projects of any significant size, static methods are the only way to succeed. Putting an app into production and then hoping you have all your RuntimeExceptions caught is a guaranteed way to fail.&lt;/P&gt;
&lt;P&gt;I use RuntimeExceptions for one thing -- a problem that should NEVER happen in a production run. Sometimes we will choose to ignore the problem and move on, but it signifies a bug in the software.&lt;/P&gt;
&lt;P&gt;Checked exceptions are for everything else -- a RARE event, something that the developer acknowledges COULD happen in a normal production run. These are preferably categorized (via subclassing or some other mechanism) by essential response characteristic.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/09/07.html#a331</guid>
			<pubDate>Sun, 07 Sep 2003 08:28:08 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=331&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F09%2F07.html%23a331</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Public Commentary on Patents.&lt;/H5&gt;
&lt;P&gt;Yeesh.&amp;nbsp; These guys, bless their hearts, are out there attempting to patent LISP! Well, not exactly -- they&apos;re trying to patent the use of XML as a LISP machine.&amp;nbsp; Essentially what they&apos;ve done is dumb down s-expressions into an XML form.&amp;nbsp; It&apos;s amazing sometimes that when you navigate your way through a problem you end up right back where you started.&amp;nbsp; At each step of the game you found something new, something incredible -- an excellent new thought or path.&amp;nbsp; And then it all led back to the beginning.&lt;/P&gt;
&lt;P&gt;Thus it is with LISP.&amp;nbsp; Now there are things I don&apos;t like about LISP.&amp;nbsp; It&apos;s syntax, while incredibly clean, simply doesn&apos;t excite too many pattern recognizers in the brain.&amp;nbsp; Everything is a parenthesis, and that&apos;s tough when you&apos;re reading.&amp;nbsp; I wrote a while back on cognitive signposts in computer languages, and boy could LISP ever stand to have a few more of them.&amp;nbsp; A sort of &quot;pretty LISP&quot; if you will.&lt;/P&gt;
&lt;P&gt;There&apos;s another way to solve that, of course -- instead of doing our editing with fixed column width editors that just colorize what we&apos;re looking at, do actually desktop-publishing style layout, on the fly, on the LISP code.&amp;nbsp; That would be cool.&amp;nbsp; It would be a kind of literate programming...more like art programming.&amp;nbsp; But I digress.&lt;/P&gt;
&lt;P&gt;The point of the patent post is this: The patent office has already managed to put pretty much everything online, so the public can at least &lt;EM&gt;view&lt;/EM&gt; these stupid patents.&amp;nbsp; Why not go the extra step and allow the public to &lt;EM&gt;comment&lt;/EM&gt; on what they see?&amp;nbsp; Why shouldn&apos;t the public be able to point out prior art, make commentary on the patent, and basically try to thoroughly invalidate these things early in the process?&lt;/P&gt;
&lt;P&gt;We should be able to get involved.&amp;nbsp; Companies &lt;EM&gt;lie&lt;/EM&gt; about their patents all the time, during the application process.&amp;nbsp; The patent process presumes the honesty of the applicant, and that is simply not the case, much of the time.&amp;nbsp; A company will deliberately hide the origin of the patent, fail to point out prior art to the examiner, and other such shenanigans.&amp;nbsp; We&apos;ve got to start using the internet to put things back in balance.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/08/27.html#a325</guid>
			<pubDate>Thu, 28 Aug 2003 02:07:44 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=325&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F08%2F27.html%23a325</comments>
			</item>
		<item>
			<description>&lt;H5&gt;Anders Hejlsberg is Wrong on Checked Exceptions.&lt;/H5&gt;
&lt;P&gt;Boy, I can&apos;t believe I just wrote that. He&apos;s got the quote of the day on Cafe au Lait, from something called &quot;The Trouble with Checked Exceptions&quot;. He gives two arguments on why checked exceptions are a bad idea. Versioning is first -- he says that if you need to throw a new exception from your library, it has to go into the signature, making it incompatible. Second, when combining together multiple libraries, you end up with a kind of cross-product situation for catching exceptions. If your librarty calls another, you need to add the other library&apos;s exceptions to your own throws list.&lt;/P&gt;
&lt;P&gt;He&apos;s wrong on both points. First, most libraries will declare a general exception class, like LibraryException, and build all their more specific exceptions using subclassing. Most methods will throw a LibraryException, and specialize from there if necessary. Problem solved. You can pay attention to the messages and concrete subclasses if you want to, but you don&apos;t have to.&lt;/P&gt;
&lt;P&gt;Second, chained exceptions are an effective way of dealing with the library combination issue. You capture a sub-library&apos;s exception, then wrap it with one of your own. As a library, your use of a sub-library is something that should be transparent to the calling system. Chained exceptions allow you to convey the right information back in a general form.&lt;/P&gt;
&lt;P&gt;Java provides good tools for handling exceptions. Languages that don&apos;t check them (which is basically everything else out there) just kind of scare me right now. How do you know you&apos;ve got everything handled? The answer is...you don&apos;t. &lt;/P&gt;
&lt;P&gt;And centralized error handling in a server-based application isn&apos;t necessarily practical.&lt;/P&gt;</description>
			<guid>http://www.soletta.com/categories/javaEtc/2003/08/27.html#a324</guid>
			<pubDate>Thu, 28 Aug 2003 01:58:58 GMT</pubDate>
			<comments>http://radiocomments.userland.com/comments?u=116262&amp;amp;p=324&amp;amp;link=http%3A%2F%2Fwww.soletta.com%2F2003%2F08%2F27.html%23a324</comments>
			</item>
		</channel>
	</rss>
