<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11811481</id><updated>2012-01-06T11:09:21.204-06:00</updated><category term='script'/><category term='quote'/><category term='joke'/><category term='idea'/><category term='xsl'/><category term='cvs'/><category term='code'/><category term='security'/><title type='text'>JamesJava</title><subtitle type='html'>My thoughts as an enterprise Java developer.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default?start-index=101&amp;max-results=100'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11811481.post-2936336600913040869</id><published>2012-01-06T11:09:00.000-06:00</published><updated>2012-01-06T11:09:21.213-06:00</updated><title type='text'>How Trello is different - Joel on Software</title><content type='html'>&lt;a href="http://www.joelonsoftware.com/items/2012/01/06.html"&gt;How Trello is different - Joel on Software&lt;/a&gt;: 'A feature that you built and tested, but didn’t deliver yet because you’re waiting for the next major release, becomes inventory. Inventory is dead weight: money you spent that’s just wasting away without earning you anything.'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2936336600913040869?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2936336600913040869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2936336600913040869&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2936336600913040869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2936336600913040869'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2012/01/how-trello-is-different-joel-on.html' title='How Trello is different - Joel on Software'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-3293177066592019506</id><published>2011-07-19T08:45:00.000-05:00</published><updated>2011-07-19T08:45:34.713-05:00</updated><title type='text'>Are older people better programmers? | Javalobby</title><content type='html'>&lt;a href="http://java.dzone.com/articles/are-older-people-better?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+javalobby%2Ffrontpage+%28Javalobby+%2F+Java+Zone%29"&gt;Are older people better programmers? | Javalobby&lt;/a&gt;: "Fast programmers who produce disorganized code rely on their superior short term memory to get things done. These programmers get worse with age as their short-term memory weakens. They tend to drop out of the field.&lt;br /&gt;Slow programmers who produce well-organized and readable code avoid relying on short-term memory. They tend to get faster and better with age as they accumulate in their long-term memory an ever increasing portfolio of strategies, patterns and techniques."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-3293177066592019506?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.dzone.com/articles/are-older-people-better?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+javalobby%2Ffrontpage+%28Javalobby+%2F+Java+Zone%29' title='Are older people better programmers? | Javalobby'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/3293177066592019506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=3293177066592019506&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3293177066592019506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3293177066592019506'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2011/07/are-older-people-better-programmers.html' title='Are older people better programmers? | Javalobby'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8197771225455375434</id><published>2011-04-13T15:53:00.000-05:00</published><updated>2011-04-13T15:53:24.802-05:00</updated><title type='text'>Ignore the customer experience, lose a billion dollars (Walmart case study) - Good Experience</title><content type='html'>&lt;a href="http://goodexperience.com/2011/04/ignore-the-customer-e.php"&gt;Ignore the customer experience, lose a billion dollars (Walmart case study) - Good Experience&lt;/a&gt;: "The mistake was a lack of customer focus. I know, I know: 'They ran a survey! Customers loved the idea!' But that's exactly the problem. Walmart didn't pursue the question of what customers wanted. Instead, Walmart came up with the answer first, then asked customers to agree to it. That's exactly the wrong thing to do, because it ignores customers while attempting to fool stakeholders into thinking that the strategy is customer-centered.&lt;br /&gt;&lt;br /&gt;Put another way, Walmart based this incredibly expensive misadventure on what customers said, rather than what they did. And the customer experience is all about what customers do. In real life. No hypotheticals. Walmart acted without considering the customer experience, and that was a big mistake."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8197771225455375434?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://goodexperience.com/2011/04/ignore-the-customer-e.php' title='Ignore the customer experience, lose a billion dollars (Walmart case study) - Good Experience'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8197771225455375434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8197771225455375434&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8197771225455375434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8197771225455375434'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2011/04/ignore-customer-experience-lose-billion.html' title='Ignore the customer experience, lose a billion dollars (Walmart case study) - Good Experience'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-353377041759739987</id><published>2011-04-08T10:05:00.000-05:00</published><updated>2011-04-08T10:05:41.957-05:00</updated><title type='text'>France Outlaws Hashed Passwords - Slashdot</title><content type='html'>&lt;a href="http://yro.slashdot.org/story/11/04/07/0212222/France-Outlaws-Hashed-Passwords?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29"&gt;France Outlaws Hashed Passwords - Slashdot&lt;/a&gt;: "'Storing passwords as hashes instead of plain text is now illegal in France, according to a draconian new data retention law. According to the BBC, '[t]he law obliges a range of e-commerce sites, video and music services and webmail providers to keep a host of data on customers. This includes users' full names, postal addresses, telephone numbers and passwords. The data must be handed over to the authorities if demanded.'"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-353377041759739987?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://yro.slashdot.org/story/11/04/07/0212222/France-Outlaws-Hashed-Passwords?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29' title='France Outlaws Hashed Passwords - Slashdot'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/353377041759739987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=353377041759739987&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/353377041759739987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/353377041759739987'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2011/04/france-outlaws-hashed-passwords.html' title='France Outlaws Hashed Passwords - Slashdot'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6740729435181184290</id><published>2010-12-29T10:33:00.003-06:00</published><updated>2010-12-29T10:44:17.523-06:00</updated><title type='text'>Can java.util.concurrent.lock.Lock detect deadlocks caused by two threads acquiring the same locks in a different order</title><content type='html'>Could java.util.concurrent.lock.Lock detect deadlocks caused by two threads acquiring the same locks in a different order?&lt;br /&gt;&lt;br /&gt;Could it use a static list of all threads that have locks and ThreadLocal locks lists to know about all in use locks and then check for incorrect order when lock() is called.&lt;br /&gt;&lt;br /&gt;In lock:&lt;br /&gt;Check the ThreadLocal list and if there are no other locks then proceed.&lt;br /&gt;Else if there are other locks then look through other threads to determine if any have any of the same locks in a different order.&lt;br /&gt;Add current lock to ThreadLocal list.&lt;br /&gt;&lt;br /&gt;In unlock:&lt;br /&gt;Remove current lock from ThreadLocal list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6740729435181184290?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6740729435181184290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6740729435181184290&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6740729435181184290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6740729435181184290'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/12/can-javautilconcurrentlocklock-detect.html' title='Can java.util.concurrent.lock.Lock detect deadlocks caused by two threads acquiring the same locks in a different order'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5100041398415243771</id><published>2010-10-21T09:48:00.002-05:00</published><updated>2010-10-21T09:54:30.453-05:00</updated><title type='text'>Format for design and requirements</title><content type='html'>Do a "requirements document" and "design document" use an outdated format?  Is one monolithic document the right way to handle that information?  Are there better ways to handle that information?&lt;br /&gt;&lt;br /&gt;Consider this idea:&lt;br /&gt;Keep requirements/design info in a tree structure.&lt;br /&gt;Support viewing the whole tree to a specific depth so that people can ignore undesired detail.&lt;br /&gt;Allow ownership to be set by branch.&lt;br /&gt;Allow editing each node separately so there is less chance for conflict.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5100041398415243771?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5100041398415243771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5100041398415243771&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5100041398415243771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5100041398415243771'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/10/format-for-design-and-requirements.html' title='Format for design and requirements'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1472583346123849612</id><published>2010-08-13T12:14:00.000-05:00</published><updated>2010-08-13T12:14:53.249-05:00</updated><title type='text'>Stephen Colebourne's: Oracle, Google and the politics of money</title><content type='html'>&lt;a href="http://www.jroller.com/scolebourne/entry/power_corrupts_absolute_power_corrupts"&gt;Stephen Colebourne&amp;#39;s Weblog&lt;/a&gt;: "On the specifics of the lawsuit I have little to say. Google undoubtably have sailed close to the wind. But did they cross the line? Well, thats for lawyers now. The problem I have is not that there was something to discuss, but that Oracle thinks that this approach will improve their position. For me it shows how out of touch they are with how community and sentiment works outside CxO level politics.&lt;br /&gt;&lt;br /&gt;The lawsuit is likely to shine a bright light on the OpenJDK too. Anyone who has contributed to the project known as 'OpenJDK 7' should now be concerned about whether their work will ever be freely available as open source."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1472583346123849612?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/scolebourne/entry/power_corrupts_absolute_power_corrupts' title='Stephen Colebourne&apos;s: Oracle, Google and the politics of money'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1472583346123849612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1472583346123849612&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1472583346123849612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1472583346123849612'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/08/stephen-colebournes-oracle-google-and.html' title='Stephen Colebourne&apos;s: Oracle, Google and the politics of money'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-3473636018391814593</id><published>2010-03-05T21:31:00.000-06:00</published><updated>2010-03-05T21:31:20.790-06:00</updated><title type='text'>BatchGeo - Make google maps using many addresses / coordinates</title><content type='html'>&lt;a href="http://www.batchgeocode.com/"&gt;BatchGeo - Make google maps using many addresses / coordinates&lt;/a&gt;: "Is your data is in a spreadsheet? Well try this free and unique tool to...&lt;br /&gt;Map it using Google Maps"&lt;br /&gt;&lt;br /&gt;Looks quite useful!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-3473636018391814593?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.batchgeocode.com/' title='BatchGeo - Make google maps using many addresses / coordinates'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/3473636018391814593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=3473636018391814593&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3473636018391814593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3473636018391814593'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/03/batchgeo-make-google-maps-using-many.html' title='BatchGeo - Make google maps using many addresses / coordinates'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8702294387083874940</id><published>2010-03-02T08:10:00.000-06:00</published><updated>2010-03-02T08:10:47.483-06:00</updated><title type='text'>IBM rethinks industry-standard servers | Business Tech - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-1001_3-10462084-92.html?part=rss&amp;amp;amp;subj=news&amp;amp;amp;tag=2547-1_3-0-20"&gt;IBM rethinks industry-standard servers | Business Tech - CNET News&lt;/a&gt;: "Big Blue's new family of servers, dubbed the eX5 portfolio, features architecture tweaks that allow the customer to add more memory without buying an entirely new server."&lt;br /&gt;&lt;br /&gt;Am I misunderstanding, or is IBM just now adding a feature that PC's have had for decades?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8702294387083874940?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-1001_3-10462084-92.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20' title='IBM rethinks industry-standard servers | Business Tech - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8702294387083874940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8702294387083874940&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8702294387083874940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8702294387083874940'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/03/ibm-rethinks-industry-standard-servers.html' title='IBM rethinks industry-standard servers | Business Tech - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6108395705501387314</id><published>2010-01-22T15:32:00.000-06:00</published><updated>2010-01-22T15:32:09.759-06:00</updated><title type='text'>A Little Less Conversation</title><content type='html'>&lt;a href="http://www.inc.com/magazine/20100201/a-little-less-conversation.html"&gt;A Little Less Conversation&lt;/a&gt;: "In 2006, Moishe Lettvin, a former programmer at Microsoft, wrote a blog post describing the year he spent coordinating the list of items that would be featured on one menu in Windows Vista -- the menu you use to turn off your computer. (See The Windows Shutdown Crapfest.) Lettvin figured that 43 people all had a voice in designing this one menu. Forty-three! By Brooks's formula, that means managing 903 connections. Lettvin says he spent so much time on coordination tasks that, in 12 months, he produced fewer than 200 lines of code."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6108395705501387314?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.inc.com/magazine/20100201/a-little-less-conversation.html' title='A Little Less Conversation'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6108395705501387314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6108395705501387314&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6108395705501387314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6108395705501387314'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2010/01/little-less-conversation.html' title='A Little Less Conversation'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2614735668813231768</id><published>2009-12-31T13:18:00.000-06:00</published><updated>2009-12-31T13:18:12.692-06:00</updated><title type='text'>Official Google Blog: Browser Size: a tool to see how others view your website</title><content type='html'>&lt;a href="http://googleblog.blogspot.com/2009/12/browser-size-tool-to-see-how-others.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+blogspot%2FMKuf+%28Official+Google+Blog%29"&gt;Official Google Blog: Browser Size: a tool to see how others view your website&lt;/a&gt;: "Browser Size is based on a sample of data from visitors to google.com. Special code collects data on the height and width of the browser for a sample of users. For a given point in the browser, the tool will tell you what percentage of users can see it. For example, if an important button is in the 80% region it means that 20% of users have to scroll in order to see it. If you're a web designer, you can use Browser Size to redesign your page to minimize scrolling and make sure that the important parts of the page are always prominent to your audience."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2614735668813231768?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://googleblog.blogspot.com/2009/12/browser-size-tool-to-see-how-others.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+blogspot%2F' title='Official Google Blog: Browser Size: a tool to see how others view your website'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2614735668813231768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2614735668813231768&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2614735668813231768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2614735668813231768'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/12/official-google-blog-browser-size-tool.html' title='Official Google Blog: Browser Size: a tool to see how others view your website'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7953674614199913579</id><published>2009-11-05T11:42:00.000-06:00</published><updated>2009-11-05T11:42:37.747-06:00</updated><title type='text'>TLS (SSL) compromised!</title><content type='html'>&lt;a href="http://extendedsubset.com/?p=8"&gt;extendedsubset.com&lt;/a&gt;: "There are three general attacks against HTTPS discussed here, each with slightly different characteristics, all of which yield the same result: the attacker is able to execute an HTTP transaction of his choice, authenticated by a legitimate user (the victim of the MITM attack). Some attacks result in the attacker-supplied request generating a response document which is then presented to the client without any certificate warning or other indication to the user. Other techniques allow the attacker to forward or re-purpose client certificate authentication credentials."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7953674614199913579?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://extendedsubset.com/?p=8' title='TLS (SSL) compromised!'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7953674614199913579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7953674614199913579&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7953674614199913579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7953674614199913579'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/11/tls-ssl-compromised.html' title='TLS (SSL) compromised!'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-9149562534914071670</id><published>2009-11-02T13:35:00.000-06:00</published><updated>2009-11-02T13:35:33.721-06:00</updated><title type='text'>Open source as an antitrust strategy | The Open Road - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-13505_3-10388408-16.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;Open source as an antitrust strategy | The Open Road - CNET News&lt;/a&gt;: "IBM, Intel, Red Hat, and others aren't investing in Linux because they're all chums at the country club together, but rather because they're looking for ways to reduce Microsoft's hold on their own businesses through its control of personal computer and server operating systems.&lt;br /&gt;As an added benefit, it's a great way for companies to collaborate without running afoul of antitrust laws. It's collusion without the collusion."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-9149562534914071670?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-13505_3-10388408-16.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='Open source as an antitrust strategy | The Open Road - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/9149562534914071670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=9149562534914071670&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/9149562534914071670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/9149562534914071670'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/11/open-source-as-antitrust-strategy-open.html' title='Open source as an antitrust strategy | The Open Road - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5603379804627562023</id><published>2009-10-21T10:39:00.000-05:00</published><updated>2009-10-21T10:39:19.176-05:00</updated><title type='text'>Google Public Policy Blog: Vint Cerf on the importance of keeping the Internet open</title><content type='html'>&lt;a href="http://googlepublicpolicy.blogspot.com/2009/10/vint-cerf-on-importance-of-keeping.html"&gt;Google Public Policy Blog: Vint Cerf on the importance of keeping the Internet open&lt;/a&gt;: "Earlier this week, Vint Cerf, one of the original architects of the Internet and our Chief Internet Evangelist, joined other pioneers in a letter to the FCC expressing support for the Commission's consideration of safeguards that would preserve the open Internet."&lt;br /&gt;&lt;br /&gt;Government regulation will mean that it isn't open!  Once the government takes control it will only increase its control and the regulation will limit good experimentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5603379804627562023?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://googlepublicpolicy.blogspot.com/2009/10/vint-cerf-on-importance-of-keeping.html' title='Google Public Policy Blog: Vint Cerf on the importance of keeping the Internet open'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5603379804627562023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5603379804627562023&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5603379804627562023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5603379804627562023'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/10/google-public-policy-blog-vint-cerf-on.html' title='Google Public Policy Blog: Vint Cerf on the importance of keeping the Internet open'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2138830752817835047</id><published>2009-10-13T06:58:00.000-05:00</published><updated>2009-10-13T06:58:22.905-05:00</updated><title type='text'>[JavaSpecialists 177] - Logging Part 3 of 3</title><content type='html'>&lt;a href="http://www.javaspecialists.eu/archive/Issue177.html"&gt;[JavaSpecialists 177] - Logging Part 3 of 3&lt;/a&gt;: "For example, here is a Layout for Log4J that can be used to collapse lines with '|&amp;gt;&amp;gt;' instead of a newline character. For readability, it is trivial to then replace those characters with \n again."&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; "&gt;&lt;pre style="font-family: 'Lucida Console', 'Bitstream Vera Sans Mono', 'Courier New', monospace; font-size: 12px; font-weight: normal; "&gt;&lt;b&gt;&lt;span style="color:#000080;"&gt;import&lt;/span&gt;&lt;/b&gt; org.apache.log4j.*; &lt;b&gt;&lt;span style="color:#000080;"&gt;import&lt;/span&gt;&lt;/b&gt; org.apache.log4j.spi.*;  &lt;b&gt;&lt;span style="color:#000080;"&gt;import&lt;/span&gt;&lt;/b&gt; java.io.*;  &lt;b&gt;&lt;span style="color:#000080;"&gt;public class&lt;/span&gt;&lt;/b&gt; MultipleLineLayout &lt;b&gt;&lt;span style="color:#000080;"&gt;extends&lt;/span&gt;&lt;/b&gt; Layout {   &lt;b&gt;&lt;span style="color:#000080;"&gt;public&lt;/span&gt;&lt;/b&gt; String format(LoggingEvent event) {     Object o = event.getMessage();     &lt;b&gt;&lt;span style="color:#000080;"&gt;if&lt;/span&gt;&lt;/b&gt; (o &lt;b&gt;&lt;span style="color:#000080;"&gt;instanceof&lt;/span&gt;&lt;/b&gt; Throwable) {       &lt;b&gt;&lt;span style="color:#000080;"&gt;return&lt;/span&gt;&lt;/b&gt; format((Throwable) o);     }     &lt;b&gt;&lt;span style="color:#000080;"&gt;return&lt;/span&gt;&lt;/b&gt; format(String.valueOf(event.getMessage()));   }    &lt;b&gt;&lt;span style="color:#000080;"&gt;private&lt;/span&gt;&lt;/b&gt; String format(Throwable t) {     StringWriter out = &lt;b&gt;&lt;span style="color:#000080;"&gt;new&lt;/span&gt;&lt;/b&gt; StringWriter();     PrintWriter pw = &lt;b&gt;&lt;span style="color:#000080;"&gt;new&lt;/span&gt;&lt;/b&gt; PrintWriter(out);     t.printStackTrace(pw);     pw.close();     &lt;b&gt;&lt;span style="color:#000080;"&gt;return&lt;/span&gt;&lt;/b&gt; format(out.toString());   }    &lt;b&gt;&lt;span style="color:#000080;"&gt;private&lt;/span&gt;&lt;/b&gt; String format(String s) {     &lt;b&gt;&lt;span style="color:#000080;"&gt;return&lt;/span&gt;&lt;/b&gt; s.         replaceAll(&lt;b&gt;&lt;span style="color:#E1691A;"&gt;"\r"&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color:#E1691A;"&gt;""&lt;/span&gt;&lt;/b&gt;). &lt;i&gt;&lt;span style="color:808080;"&gt;// remove Windows carriage returns&lt;/span&gt;&lt;/i&gt;         replaceAll(&lt;b&gt;&lt;span style="color:#E1691A;"&gt;"\n*$"&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color:#E1691A;"&gt;""&lt;/span&gt;&lt;/b&gt;). &lt;i&gt;&lt;span style="color:808080;"&gt;// remove trailing newline chars&lt;/span&gt;&lt;/i&gt;         replaceAll(&lt;b&gt;&lt;span style="color:#E1691A;"&gt;"\n"&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color:#E1691A;"&gt;" |&gt;&gt; "&lt;/span&gt;&lt;/b&gt;) &lt;i&gt;&lt;span style="color:808080;"&gt;// replace newline with |&gt;&gt;&lt;/span&gt;&lt;/i&gt;         + &lt;b&gt;&lt;span style="color:#E1691A;"&gt;"\n"&lt;/span&gt;&lt;/b&gt;;   }    &lt;b&gt;&lt;span style="color:#000080;"&gt;public boolean&lt;/span&gt;&lt;/b&gt; ignoresThrowable() {     &lt;b&gt;&lt;span style="color:#000080;"&gt;return false&lt;/span&gt;&lt;/b&gt;;   }    &lt;b&gt;&lt;span style="color:#000080;"&gt;public void&lt;/span&gt;&lt;/b&gt; activateOptions() {     &lt;i&gt;&lt;span style="color:808080;"&gt;// not necessary&lt;/span&gt;&lt;/i&gt;   } }&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2138830752817835047?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.javaspecialists.eu/archive/Issue177.html' title='[JavaSpecialists 177] - Logging Part 3 of 3'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2138830752817835047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2138830752817835047&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2138830752817835047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2138830752817835047'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/10/javaspecialists-177-logging-part-3-of-3.html' title='[JavaSpecialists 177] - Logging Part 3 of 3'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7193071494427302225</id><published>2009-09-24T14:23:00.000-05:00</published><updated>2009-09-24T14:23:44.363-05:00</updated><title type='text'>Microsoft bashes Google's Chrome-in-IE plan | Beyond Binary - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-13860_3-10360850-56.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;Microsoft bashes Google&amp;#39;s Chrome-in-IE plan | Beyond Binary - CNET News&lt;/a&gt;: "'Given the security issues with plug-ins in general and Google Chrome in particular, Google Chrome Frame running as a plug-in has doubled the attach area for malware and malicious scripts. This is not a risk we would recommend our friends and families take.'&lt;br /&gt;However, some took Microsoft to task for criticizing plug-ins, noting that Redmond itself has more than a few.&lt;br /&gt;'Microsoft scared of security of plug-ins. Uninstall Silverlight now,' Mozilla's Dion Almaer wrote in a Twitter posting."&lt;br /&gt;&lt;br /&gt;It's not like MS or IE has a stellar security record.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7193071494427302225?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-13860_3-10360850-56.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='Microsoft bashes Google&apos;s Chrome-in-IE plan | Beyond Binary - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7193071494427302225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7193071494427302225&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7193071494427302225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7193071494427302225'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/09/microsoft-bashes-googles-chrome-in-ie.html' title='Microsoft bashes Google&apos;s Chrome-in-IE plan | Beyond Binary - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4728130717505236594</id><published>2009-09-08T08:23:00.000-05:00</published><updated>2009-09-08T08:25:32.068-05:00</updated><title type='text'>Distributed Relational Database Architecture</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;p style="text-align: center; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Arial Black'; "&gt;&lt;b&gt;&lt;span style="font-size:180%;"&gt;Distributed Relational Database Architecture&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;James Stauffer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;August 1, 2009&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Prepared for CS425 Summer 2009&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Table of Contents&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt; &lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;        I. Introduction&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                A.  Focus&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                B.  Implementation&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;        II.  Relevent Features &lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                A.  Availability&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                B.  Failover&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                C.  Replication&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                D.  Partitioning&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                E.  Single Point of Failure&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                F.  Shared Storage&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;                G.  Inter-node Communication&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;        III.  &lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Shared Everything&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;: O&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;racl&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;e RAC&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Real Application Cluster&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 A. Maintenance availability&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 B.  Inter-node communication&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 C.  Permanent Storage&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 D.  Client interaction&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 E.  Further information &lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;        IV:  Shared Nothing:  My SQL Cluster&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;  &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 A. Maintenance availability&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 B.  Inter-node communication&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 C.  Permanent Storage&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 D.  Client interaction&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 E.  Further information                &lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;        V.  Sharding      &lt;/p&gt;&lt;/span&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;/p&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 A. Maintenance availability&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 B.  Inter-node communication&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 C.  Permanent Storage&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 D.  Client interaction&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;                 E.  Further information                 &lt;/p&gt;&lt;/span&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;         &lt;/b&gt;VI.  Conclusion&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="I" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Introduction&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Focus&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;This paper will cover distributed relational database architecture&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; primarily as it affects availability to the client.  Features that allow the database to run more complex queries or handle larger data sets (scalability) will not be covered.  All discussion will focus on systems with multiple servers (call nodes) involved.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Implementations&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;This paper will cover three basic types of implementations: Shared Everything, Shared Nothing, and Sharding.  Shared Everything implementations don't actually share everything but just share the data storage between nodes, while shared nothing systems have nodes that are completely independent (including storage) and self-sufficient.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;  Systems that present the nodes as one or as interchangeable are generally called clusters and include shared everything and shared nothing.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Sharding is similar to shared nothing in that nothing in the nodes &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;is shared, and the nodes &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;are independent.  However, sharding nodes are seen as &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;completely &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;separate &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;and independent (but related) &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;by the client.  Shared everything systems need to synchronize data access and can do it either through a shared storage device or with direct communication.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Oracle RAC will be the example reviewed for shared everything, and MySQL will be the example reviewed for shared nothing.  Sharding doesn’t have specific support in any major database, so it will be generically reviewed with no example.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;  For each type of architecture, the following will be addressed: maintenance availability, inter-node communication, permanent storage, and client interaction.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="I" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Relevant Features&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Some &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;major aspects relevant to highly available distributed relational database architecture include: availability, failover, replication, partitioning, single point of failure, shared storage, and inter-node communication.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Availability&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Availability refers to the percent of time that a service is responsive and working correctly&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; (synonymous with uptime)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;.  It is &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;usually&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; expressed in a percent with 99.999% (5 nines) considered a very high level of availability.  Downtime refers to the time that a service is not available&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; (i.e. the opposite of availability)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;.  Both planned and unplanned events can affect availability, therefor both &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;need to be addressed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;.  All types of database systems try to minimize unplanned downtime to some extent, but vary in how much maintenance can be done without downtime.  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Techniques to minimize u&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;nplanned downtime &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;include:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; automatic transferring of connections from failed to working nodes, automatic restart of failed nodes/services, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;and &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;optimal checkpointing to minimize restart time.  Techniques to minimize planned downtime include supporting maintenance operations while the service running is one of the following:&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; allowing patches, updates, reconfiguration, adding or removing nodes, adding or removing databases.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Failover&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Failover refers to what happens when one node fails, and how another node (or nodes) starts handling the service that had been provided by the failed node.  Failover may be mostly transparent to the client, or can require the client to connect to another node.  The client can have a front-end, such as a JDBC driver, that can handle some of the cluster activity (i.e. connecting to another node if the cluster doesn't handle that automatically).  Whether or not the client is automatically redirected to another node, any transactions open on the failed node will also fail.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Replication&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Replication refers to the copying of data to another system or node – especially so that when a node fails, no data is lost and the data is immediately available.  Asynchronous replication happens in the background so that the client receives the result of its request much quicker, and does have the risk that the node will fail before all data is replicated.  Synchronous replication happens before the result is sent back to the client, but makes each client request take longer.  There can also be multiple levels of replication. Replication can be done to the memory of two nodes synchronously to provide fast response (and minimilize the chance of data loss): and asynchronous replication can be made to permanent storage.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Partitioning&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Partitioning refers to splitting the data into parts, and distributing each part to a separate node.  This allows each node to have less data to handle. One problem,  however, is that it can cause the need for requests to contact many nodes in which to access all needed data.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Therefore, partitioning may not be appropriate for all types of databases.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  When a node has less data to handle, it can more effectively cache data in memory&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;, it can have more efficient indexes,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; and therefore it can increase performance.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Single point of failure&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;A single point of failure is a single component of the system that is used by the whole system, and if that component fails, the whole system will fail.  A system with a single point of failure is much more at risk for failure, therefor a single point of failure should be avoided.  In a highly available system, as &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;many components&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; as possible&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;are&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; duplicated to help avoid as many single points of failure as possible.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Even when nodes are duplicates, components on each node are often duplicate&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; to reduce the chance of failure on an individual node (i.e. network interface, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;storage interface, power supply, etc).  The single point of failure assessment is done on many levels – from the storage system (drives, connectors, controllers&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;, power), all the way up to datacenter power and network connection.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="6" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="6" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Shared storage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Shared storage is permanent database storage that is shared between all or many nodes.  Like anything else shared, shared storage can be a risk as a single point of failure.  Shared storage can also be used as a communication channel.  Types of shared storage include a database (however, using a database for shared sto&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;rage of a database isn't used),&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;NAS(Network attached storage), SAN(Storage Area Network), external SCSI disk, cloud storage (such as Amazon S3), etc.  The connection to the shared storage is generally duplicated (i.e. two network cards, SCSI controllers, etc).  The single point of failure risk can be addressed by duplicating the data into two identical shared storage systems through a process called mirroring.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="7" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="7" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Inter-node communication&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Inter-node communication refers to how the nodes communicate with each other.  Nodes can communicate through shared storage, or over a network.  When co&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;mmunication is over a network, it&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; is generally a fast network&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; (gigabit or faster), a network&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; that is private to the nodes &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;(accessed only by the nodes), &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;and a network that is called an intercon&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;nect.  Each node generally has two&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; network interfaces for improved fault tolerance. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Because the network is slower than memory, the inter-node communication of a cluster can make each action slower in a cluster, as opposed to communication on a single database.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="I" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Shared Everything&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;: O&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;racl&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;e RAC&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Real Application Cluster&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Maintenance Availability&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Adding a new node to the cluster doesn't involve cluster downtime, however clients may not completely use the new node until they are told about it. Some actions, like parallel queries, will immediately take advantage of the new node. All cluster nodes can be managed as one, or managed separately, as deemed necessary. Some code upgrades&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;(patches) to the DBMS&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; (database management system)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; can be applied to the cluster.  This is done one node at a time, in a rolling fashion, so that all nodes can be upgraded without service downtime.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Inter-node Communication&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;The nodes communicate updates (for cache), locking, etc. between each other over an interconnect (older versions communicated over the file system).  When a node needs to write to a data block, it first sends a request across the cluster to transfer ownership of the data block to itself. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;It appears that each cluster has a master that tracks which node owns each block, therefor this design doesn't slow a single update as nodes are added to the cluster because ownership transfer only involves &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;three&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;nodes: requester, master, and current owner.  Since on&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;ly one node can own a block at one&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; time&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; blocks that are updated often can cause ownership to jump around between nodes, often&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; degrading performance&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Permanent Storage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Oracle RAC uses shared storage.  The shared storage can be NAS, SAN, or SCSI disk.  ASM (Automatic Storage Management) can address the storage single point of failure risk by mirroring data across different failure groups (a set of disks sharing something in common, such as a controller).  Since the file system is shared, all volume management must be designed to work with the cluster.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Client Interaction&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Clients connect to the nodes with Virtual IP&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;(VIP) addresses so that if a node fails, the VIP can be redirected to another node. The client needs to know the VIP for all nodes. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Clients can use Fast Application Notification (FAN), Fast Connection Failover (FCF), and Transparent Application Failover (TAF) to detect and&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;/or&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; handle node failure.  However, it may require the client to re-do some work, and it may be hard to determine which &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;option&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;s are current, and which options will work best.  It can be a huge code change to change a program to detect and redo actions every place that the&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; database is used.  Load balancing&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; is supported by the client having the list of all nodes, and randomly choosing a node for a connection (so that connections are spread across nodes).  Alternatively, the client can get load information from the&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; listener running on the chosen&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; node.  This is done so &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;that the listener can direct the client to another node that has more resources available (which all&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; depends on the connection option chosen&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Further Information&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://en.wikipedia.org/wiki/Oracle_RAC"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://en.wikipedia.org/wiki/Oracle_RAC&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://www.oracle.com/technology/products/database/clustering/index.html"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://www.oracle.com/technology/products/database/clustering/index.html&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol type="I" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Shared Nothing&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;: M&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;ySQL Cluster&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; MySQL&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; cluster has 3 node types: data nodes to store the data, SQL nodes to run a MySQL server, and management n&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;odes.  Therefore a minimum of five&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; nodes is generally needed for &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;high availability&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; (1 management, 2 SQL, and 2 data each with 1 replica of the data).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Maintenance Availability&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Adding and dropping data nodes requires that the cluster be restarted.  One exception is that data nodes for new partitions can be added while the cluster is running.  If one node fails, failover automatically happens to another node, and any transaction information on the failed node is lost.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  The failover only takes sub-second time to happen.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Adding space to an existing database by adding a data node, requires that the data be repartition&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;ed to include the new node (so that the data is spread out over the new set of nodes). Therefore, adding and repartitioning&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; causes downtime and uses a lot of resources. Rolling software updates are supported.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Inter-node Communication&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Nodes communicate on a private interconnect.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;  Because there is only one primary owner of each block (the primary replica), ownership of the block doesn’t need to be transferred, and updates only have to involve 2 nodes (the SQL node processing the request, and the master data node that owns the block).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Permanent Storage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;The data is partitioned across the data nodes.  Each piece of data can have multiple replicas&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; (with one node being the master, and the others being slaves)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; so that the data exists on multiple nodes, and so that there is no single point of failure.  When a node needs to write a block, it can replicate the data either asynch&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;ronously or synchronously. If the node&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; is configured to replicate asynchronously, it first replicates the data to all other data nodes that have a replica, and then asks them if they can commit the change.  If all reply affirmatively,the node then sends another message to tell all other nodes to commit the change (two phase commit).  Since the data is replicated to other nodes, each node can replicate to &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;permanent &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;storage asynchronously.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Client Interaction&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Clients can connect to the cluster through a load balancer, or through a proxy, so that they don't have to be aware of the &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;individual SQL &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;nodes.  Client reads can be done on the replicated nodes to provide better performance because&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; the access can be spread out over more data nodes.  R&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;ead and write lock&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; conflicts can also be reduced if&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; the masters&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; are setup to&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; only &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;handle&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt; writes, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;and the slaves only handle reads. The reduced contention also increases performance.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Further Information&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://en.wikipedia.org/wiki/MySQL_Cluster"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://en.wikipedia.org/wiki/MySQL_Cluster&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/replication.html"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://dev.mysql.com/doc/refman/5.1/en/replication.html&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol type="I" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Sharding&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;ol type="A" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Maintenance Availability&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Since each shard is independent, all maintenance on one shard has no affect on the rest of the shards.  The only exception is if the data needs to be repartitioned across the shards, then all shards can be affected.  However, repartitioning can be done without affecting availability.  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Adding a shard can also require repartitioning.  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Sharding takes more work to manage&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; because of the work involved in repartitioning to keep the load balanced, or when adding or removing a shard&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;.  Each shard could have many of the techniques for normal clusters used, but they are used independently, so any bottlenecks are for a smaller data set.  Balancing the load between servers &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;can be difficult&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;.  For example, some users may use more resources, thus using some shards much more than others.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="2" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Inter-node Communication&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;There is no inter-node communication with sharding, and&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;problems on one server can't affect other servers.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="3" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Permanent Storage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;Sharding&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;splits the data into partitions/shards (i.e. by groups of users) and puts each portion on a completely separate DB system.  This removes write bottlenecks&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; across shards&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt; without the potential for data inconsistency.  There is no specific storage architecture since each shared can use any storage architecture.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="4" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Client Interaction&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;span style="font-size:100%;"&gt;The client either has to know the sharding algorithm (so that the client knows which shard to contact), or there must be a shard lookup service that the client uses.  The shard lookup service will have the potential to be both a single point of failure, and a bottleneck (however, it should be used much less so that it isn't a bottleneck).  Determining the correct shard to contact can increase the complexity of the client code.  Also, queries across groups are more difficult, therefore, systems that require a lot of queries across shards may not work well with a sharding system.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ol type="A" start="5" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 0); "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Further Information&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;a href="http://highscalability.com/unorthodox-approach-database-design-coming-shard"&gt;&lt;span style="font-family: 'Times New Roman'; color: rgb(0, 0, 128); "&gt;&lt;u&gt;&lt;span style="font-size:100%;"&gt;http://highscalability.com/unorthodox-approach-database-design-coming-shard&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol type="I" style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; direction: inherit; "&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Sharding has the highest maintenance availability, MySQL cluster has the lowest maintenance availability.  Sharding has the lowest inter-node communication, Oracle cluster has the highest inter-node communication.  MySQL cluster has the most fault-tolerant permanent storage, sharding has the least fault-tolerant.  MySQL cluster has the least complex client interaction, Oracle RAC has the most complex.  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'; "&gt;&lt;span style="font-size:100%;"&gt;Depending on the exact features needed, and the type of data used, each could be the best solution  However, for this focused comparison, MySQL cluster provides the best combination.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4728130717505236594?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4728130717505236594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4728130717505236594&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4728130717505236594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4728130717505236594'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/09/distributed-relational-database.html' title='Distributed Relational Database Architecture'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2512129921382553109</id><published>2009-08-28T10:50:00.000-05:00</published><updated>2009-08-28T10:50:08.138-05:00</updated><title type='text'>Bill would give president emergency control of Internet | Politics and Law - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-13578_3-10320096-38.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;Bill would give president emergency control of Internet | Politics and Law - CNET News&lt;/a&gt;: "The new version would allow the president to 'declare a cybersecurity emergency' relating to 'non-governmental' computer networks and do what's necessary to respond to the threat. Other sections of the proposal include a federal certification program for 'cybersecurity professionals,' and a requirement that certain computer systems and networks in the private sector be managed by people who have been awarded that license."&lt;br /&gt;&lt;br /&gt;Why should we expect the executive branch to have the expertise and information to know how to best use that control?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2512129921382553109?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-13578_3-10320096-38.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='Bill would give president emergency control of Internet | Politics and Law - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2512129921382553109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2512129921382553109&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2512129921382553109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2512129921382553109'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/08/bill-would-give-president-emergency.html' title='Bill would give president emergency control of Internet | Politics and Law - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2107392969344419044</id><published>2009-08-04T23:02:00.000-05:00</published><updated>2009-08-04T23:03:26.275-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Defeating Character Frequency Analysis of Substitution Ciphertext</title><content type='html'>&lt;i&gt;(This is a paper I wrote in the fall of 2008 for CS461: Computer Security I at UIUC.  If you are interest in the code leave a comment and contact info.)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Introduction&lt;/h3&gt;&lt;br /&gt;Character frequency analysis is a common way to crack substitution ciphertext because of the uneven distribution of letters in languages. In order to defeat that analysis, the techniques considered were: synonyms, dropping letters or words, adding extra letters or words, alternate spelling (Leet, spam, etc), and Two cipher letters per plaintext letter. Most of these techniques would be applied before a standard substitution cipher encryption. To evaluate the techniques, test data was obtained from Project Gutenberg(&lt;a href="http://www.gutenberg.org/"&gt;http://www.gutenberg.org/&lt;/a&gt;) and consisted of the texts of Psalms (Ps), Pride and Prejudice (P&amp;P), Alice in Wonderland (AiW), and Sherlock Holmes (SH). After applying the technique, the output character frequency was compared to the standard character frequency (&lt;a href="http://en.wikipedia.org/wiki/Letter_frequencies"&gt;http://en.wikipedia.org/wiki/Letter_frequencies&lt;/a&gt; and &lt;a href="http://www.data- compression.com/english.html"&gt;http://www.data-&lt;br /&gt;compression.com/english.html&lt;/a&gt;) and then the standard deviation of the proportion of the changed frequency for each letter compared to the standard character frequency. i.e. If the letter "e" occurred 10% of the time in the changed text then the proportion for "e" is .787 (.10/.12702). That gives an overall measure of how close the changed text character frequency is to the standard character frequency. A standard deviation of 0% would mean that it exactly matches the standard frequency. Initial standard deviations are: Ps: 25%, P&amp;P: 28%, AiW: 25%, SH: 14%. For comparison, an equal distribution produces a standard deviation of 1,439%. In LetterFrequencies.zip there are programs for most of these options and for computing the standard deviation.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Synonyms&lt;/h3&gt;&lt;br /&gt;Replacing words with synonyms that have a higher standard deviation can help defeat character frequency analysis. The thesaurus used has synonyms in categories, so when a word was looked up, the first category was arbitrarily used. Within the first category, the word that had the largest standard deviation from the normal character frequency was chosen. The chosen work often didn't fit grammatically, so the results are skewed, but this is somewhat offset by only looking in the first category. To make this usable, grammar checking would have to be used. It would probably need a UI that would suggest alternatives (based on grammar rules and the standard deviation). Attacks against this technique could include creating a list of the best synonyms, creating a new standard character frequency distribution for those words, and therefore largely defeat the benefit of this technique. Final standard deviation achieved: Ps: 182%, P&amp;P: 180%, AiW: 135%, SH: 149%. The increase in standard deviation was very significant, but not enough to make a large impact on frequency analysis.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Dropping letters or words&lt;/h3&gt;&lt;br /&gt;Randomly dropping letters or words could easily hide the meaning from the intended recipient so it would be hard to keep the meaning while still randomly dropping enough to make an impact. An attempt to always drop vowels and rare letters (a,e,i,o,u,x,q) and words (I, the, is, was, of, a, &amp; an) made an insignificant difference (Drop Words Ps: 8%, P&amp;P: 6%, AiW: 8%, SH: 8%; Drop Letters: Ps: 73%, P&amp;P: 91%, AiW: 69%, SH: 70%). Also, some of each letter would need to be dropped to prevent the non-dropped letters from serving as landmarks.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Adding extra letters or words&lt;/h3&gt;&lt;br /&gt;To be effective, extra letters and words must be randomly placed. They could be chosen based on the inverse of distribution. However, additions that have a significant impact on the standard deviation may garble the message too much. Add letters results(based on inverse of distribution): P&amp;P: 2,154%, SH: 2,795%. The result is readable but takes significantly more work to understand the message.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Alternate spelling (Leet, spam, etc)&lt;/h3&gt;&lt;br /&gt;Alternate spelling includes l33t (&lt;a href="http://en.wikipedia.org/wiki/Leet"&gt;http://en.wikipedia.org/wiki/Leet&lt;/a&gt;) and spam spelling (&lt;a href="http://en.wikipedia.org/wiki/E-mail_spam#Obfuscating_message_content"&gt;http://en.wikipedia.org/wiki/E-mail_spam#Obfuscating_message_content&lt;/a&gt;) and is similar to synonyms, in that the possibility of a new new standard character frequency has to be taken into account. This technique was not implemented or programatically evaluated because it was non-obvious what to use as the standard distribution.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Two cipher letters per plaintext letter&lt;/h3&gt;&lt;br /&gt;Using two letters in the cipher text for each letter in the plaintext can be a good way to create a flat character distribution. The algorithm is to partition the 676 2-letter combinations based on the standard character frequency. i.e. if the standard frequency for a letter is 5% then it will get 5% of the 2-letter combinations (randomly selected). This doubles the size of the data, could include spaces &amp; punctuation, and makes a much larger key. Note that some letters may get dropped because they occur less than 1/676 (0.15%) of the time. Both 1-gram and 2-gram frequency analysis produce a nearly uniform histogram (variation appears to only be caused by rounding). Two-gram results: P&amp;P=5,117%; SH=5,013%. Therefore this technique was extremely effective with no obvious weaknesses.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;Changing the plaintext proved problematic because of inadvertent changes to the meaning, but it did make a significant impact on standard deviation even though it probably wasn't significant enough. Applying all of the plaintext changes to a short message while using safeguards to protect the meaning would probably be effective. Two cipher letters per plaintext letter appears to be the easiest way to defeat character frequency analysis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2107392969344419044?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2107392969344419044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2107392969344419044&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2107392969344419044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2107392969344419044'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/08/defeating-character-frequency-analysis.html' title='Defeating Character Frequency Analysis of Substitution Ciphertext'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8550277768780162479</id><published>2009-07-31T14:06:00.000-05:00</published><updated>2009-07-31T14:06:10.846-05:00</updated><title type='text'>Sample chapter from Don't Make Me Think</title><content type='html'>&lt;a href="http://sensible.com/chapter.html"&gt;Sample chapter from Don&amp;#39;t Make Me Think&lt;/a&gt;: "Why are things always in the last place you look for them?&lt;br /&gt;Because you stop looking when you find them.&lt;br /&gt;—Children’s riddle"&lt;br /&gt;&lt;br /&gt;Great info on usability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8550277768780162479?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://sensible.com/chapter.html' title='Sample chapter from Don&apos;t Make Me Think'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8550277768780162479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8550277768780162479&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8550277768780162479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8550277768780162479'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/07/sample-chapter-from-dont-make-me-think.html' title='Sample chapter from Don&apos;t Make Me Think'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5352299815395544734</id><published>2009-07-30T09:43:00.002-05:00</published><updated>2009-07-30T09:47:32.861-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Pressure sensitive keyboard for repeat rate</title><content type='html'>Would it be helpful to have a pressure sensitive keyboard where the pressure determines the repeat rate (harder=faster, etc)?  It seems that it would be especially useful for navigation keys (arrow, page up/down) and keys commonly repeated (enter, backspace, delete, space, tab).  Does such a thing exist?  Was it tried and how well did it work?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5352299815395544734?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5352299815395544734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5352299815395544734&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5352299815395544734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5352299815395544734'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/07/pressure-sensitive-keyboard-for-repeat.html' title='Pressure sensitive keyboard for repeat rate'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-438606579330542629</id><published>2009-07-29T20:46:00.000-05:00</published><updated>2009-07-29T20:46:28.410-05:00</updated><title type='text'>Ex-Google CIO breaks his own security rules | InSecurity Complex - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-27080_3-10299251-245.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;Ex-Google CIO breaks his own security rules | InSecurity Complex - CNET News&lt;/a&gt;: "But 'it's not security's responsibility to go out there and say 'Users want to use Gmail. Let them use it,'' Johnson added. 'If we decide to use Gmail we need to have a project and treat it in a formal way and pay money to do it right.'"&lt;br /&gt;&lt;br /&gt;So are you going to have a project for every website that users might find useful?  There is no way that you will keep up and the barrier to using useful websites will significantly hurt productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-438606579330542629?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-27080_3-10299251-245.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='Ex-Google CIO breaks his own security rules | InSecurity Complex - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/438606579330542629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=438606579330542629&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/438606579330542629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/438606579330542629'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/07/ex-google-cio-breaks-his-own-security.html' title='Ex-Google CIO breaks his own security rules | InSecurity Complex - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-3082457552358343407</id><published>2009-07-29T16:37:00.000-05:00</published><updated>2009-07-29T16:37:23.396-05:00</updated><title type='text'>Beyond the hype: Where open source actually saves you money | The Open Road - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-13505_3-10295530-16.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;Beyond the hype: Where open source actually saves you money | The Open Road - CNET News&lt;/a&gt;: "One way, as Urlocker points out on his blog, is that open source allows enterprise IT projects to succeed or fail with little risk. You know before you pay anything--if you pay anything--that open-source software is going to work, or not."&lt;br /&gt;&lt;br /&gt;"Open source tends to offer best-of-breed solutions that aim to do a limited range of functions well, rather than to be all things to all people."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-3082457552358343407?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-13505_3-10295530-16.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='Beyond the hype: Where open source actually saves you money | The Open Road - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/3082457552358343407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=3082457552358343407&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3082457552358343407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3082457552358343407'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/07/beyond-hype-where-open-source-actually.html' title='Beyond the hype: Where open source actually saves you money | The Open Road - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6149343061644300385</id><published>2009-07-25T22:38:00.000-05:00</published><updated>2009-07-25T22:38:50.336-05:00</updated><title type='text'>MIT OpenCourseWare |      Electrical Engineering and Computer Science | 6.854J Advanced Algorithms, Fall 2008 | Home</title><content type='html'>&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-854JFall-2008/CourseHome/index.htm"&gt;MIT OpenCourseWare |&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Electrical Engineering and Computer Science | 6.854J Advanced Algorithms, Fall 2008 | Home&lt;/a&gt;: "This is a graduate course on the design and analysis of algorithms, covering several advanced topics not studied in typical introductory courses on algorithms. It is especially designed for doctoral students interested in theoretical computer science."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6149343061644300385?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-854JFall-2008/CourseHome/index.htm' title='MIT OpenCourseWare |      Electrical Engineering and Computer Science | 6.854J Advanced Algorithms, Fall 2008 | Home'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6149343061644300385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6149343061644300385&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6149343061644300385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6149343061644300385'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/07/mit-opencourseware-electrical.html' title='MIT OpenCourseWare |      Electrical Engineering and Computer Science | 6.854J Advanced Algorithms, Fall 2008 | Home'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5256507108015116477</id><published>2009-06-22T12:53:00.000-05:00</published><updated>2009-06-22T12:53:19.468-05:00</updated><title type='text'>Pattern Formatter for java.util.logging</title><content type='html'>&lt;a href="http://docs.google.com/Doc?id=dchx3v9x_6g2q5xb"&gt;Pattern Formatter for java.util.logging&lt;/a&gt;: "The Log Formatter will use the following formatting tokens:&lt;br /&gt;&lt;br /&gt; * LoggerName %LOGGER%&lt;br /&gt; * Level %LEVEL%&lt;br /&gt; * Time %TIME%&lt;br /&gt; * Message %MESSAGE%&lt;br /&gt; * SourceClassName %SOURCECLASS%&lt;br /&gt; * SourceMethodName %SOURCEMETHOD%&lt;br /&gt; * Exception Message %EXCEPTION%"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5256507108015116477?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://docs.google.com/Doc?id=dchx3v9x_6g2q5xb' title='Pattern Formatter for java.util.logging'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5256507108015116477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5256507108015116477&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5256507108015116477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5256507108015116477'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/06/pattern-formatter-for-javautillogging.html' title='Pattern Formatter for java.util.logging'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7397457506437870558</id><published>2009-05-07T12:10:00.002-05:00</published><updated>2009-05-07T12:15:26.617-05:00</updated><title type='text'>Save Icon</title><content type='html'>The most common save icon is a picture of a floppy disk.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://web.mit.edu/abiword_v2.4.5/Tutorials/jmp/images/save_as-icon.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 331px; height: 372px;" src="http://web.mit.edu/abiword_v2.4.5/Tutorials/jmp/images/save_as-icon.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;But with floppy disks not being used anymore will most programs change the picture?  In 1-2 decades what picture will be used for save icons?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7397457506437870558?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7397457506437870558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7397457506437870558&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7397457506437870558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7397457506437870558'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/05/save-icon.html' title='Save Icon'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5970936253959868051</id><published>2009-04-16T13:08:00.000-05:00</published><updated>2009-04-16T13:08:32.187-05:00</updated><title type='text'>FBI seizures highlight law as cloud impediment | The Wisdom of Clouds - CNET News</title><content type='html'>&lt;a href="http://news.cnet.com/8301-19413_3-10220786-240.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20"&gt;FBI seizures highlight law as cloud impediment | The Wisdom of Clouds - CNET News&lt;/a&gt;: "The articles report that the FBI raided at least two Texas data centers last week, serving search and seizure warrants for computing equipment, including servers, routers, and storage. The FBI was seeking equipment that may have been involved in fraudulent business practices by a handful of small VoIP vendors.&lt;br /&gt;The problem is that they didn't just grab the systems belonging to the VoIP vendors, but grabbed hundreds of servers serving a wide variety of businesses, the vast majority of which had never dealt with or even heard of the companies under investigation, according to Threat Level. Company officials interviewed complained of losing millions of dollars in lost revenue and equipment with no warning whatsoever."&lt;br /&gt;&lt;br /&gt;"If the court upholds that servers can be seized despite no direct warrants being served on the owners of those servers (or the owners of the software and data housed on those servers), then imagine what that means for hosting your business in a cloud shared by thousands or millions of other users."&lt;br /&gt;&lt;br /&gt;"Here is what I argue must happen:&lt;br /&gt;The law must respect digital assets in the same way that it respects physical assets. This means that search and seizure rules should apply to data and software run on third party infrastructure (or wholly owned infrastructure run in third party facilities) in the same way that they protect my home and personal property if I rent an apartment in a building housing hundreds of tenants. The fact that one tenant commits a crime is not enough for the civil liberties of all of the other tenants to be null and void. I argue the same goes for digital assets "renting" space in the cloud.&lt;br /&gt;The federal government should adopt a cloud computing bill of rights. (Here is a rudimentary example.) Each state should as well. Declare loud and clear that you suffer little or no loss of rights if you choose to run your business in the cloud over running it within your own facilities. Repeal or revise the laws that make it impossible for foreign businesses and governments to allow communications and data to pass within U.S. borders (including relevant elements of the Patriot Act).&lt;br /&gt;It is time for our policy makers to step up and really understand the influence that the Internet and cloud computing will have on the future growth of this country. It is scary how little technical understanding most congressional and senate members have. However, that alone is not an excuse for not grasping the policy gaps that are brought about as our commerce and society rely increasingly upon Internet-based services."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5970936253959868051?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.cnet.com/8301-19413_3-10220786-240.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-20' title='FBI seizures highlight law as cloud impediment | The Wisdom of Clouds - CNET News'/><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5970936253959868051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5970936253959868051&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5970936253959868051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5970936253959868051'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/04/fbi-seizures-highlight-law-as-cloud.html' title='FBI seizures highlight law as cloud impediment | The Wisdom of Clouds - CNET News'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7275044278438907793</id><published>2009-03-30T17:53:00.001-05:00</published><updated>2009-03-30T17:54:45.675-05:00</updated><title type='text'>Performance tuning technique number 91: Do not allocate memory during the main game loop</title><content type='html'>&lt;a href="http://www.fasterj.com/cartoon/cartoon091.shtml"&gt;Performance tuning technique number 91: Do not allocate memory during the main game loop&lt;/a&gt;&lt;br /&gt;&lt;img src="http://www.fasterj.com/cartoon/cartoon091.PNG"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7275044278438907793?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7275044278438907793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7275044278438907793&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7275044278438907793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7275044278438907793'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/03/performance-tuning-technique-number-91.html' title='Performance tuning technique number 91: Do not allocate memory during the main game loop'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8911668557826059809</id><published>2009-01-28T12:07:00.000-06:00</published><updated>2009-01-28T12:08:08.645-06:00</updated><title type='text'>Caching strategy</title><content type='html'>Generally Least Recently Used (LRU) is considered a good strategy for removing items from the cache. Instead it might be useful to measure the cost (i.e. time) to produce a cache item, and how many hits that item gets and then remove the item that has the lowest value of hits * cost.&lt;br /&gt;&lt;br /&gt;A quick Google search didn't find anything like this.  Comments?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8911668557826059809?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8911668557826059809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8911668557826059809&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8911668557826059809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8911668557826059809'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2009/01/caching-strategy.html' title='Caching strategy'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2801585593521532305</id><published>2008-11-01T09:51:00.002-05:00</published><updated>2008-11-01T10:00:20.446-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Lego Mindstorm NXT program</title><content type='html'>I temporarily had a Lego Mindstorm NXT and wrote the following program for it using LeJOS.  Enjoy:&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;import java.util.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;import lejos.nxt.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;import lejos.util.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public class Dingbot {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public static void main (String[] aArg) throws Exception {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;new ButtonWatcherThread(new TimerListener() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public void timedOut() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;running = !running;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}).start();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorRight.smoothAcceleration(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorLeft.smoothAcceleration(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;final float circumference = 17.5f;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;final int distanceBuffer = 50;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;final int rotateDistance = 80;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;UltrasonicSensor distSensor = new UltrasonicSensor(SensorPort.S4);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LightSensor litSensor = new LightSensor(SensorPort.S2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;litSensor.setFloodlight(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawString("Hi",1,1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int startTime = (int)System.currentTimeMillis();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;boolean blinkLight = true;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Random random = new Random();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;while(startTime + 60*1000 &gt; (int)System.currentTimeMillis()) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if(running) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int cmDist = distSensor.getDistance();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;while(running &amp;amp;&amp;amp; cmDist &gt; distanceBuffer) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawString("   ",1,2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawInt(cmDist,1,2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int distance = cmDist - distanceBuffer;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if(distance &gt; 5) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;distance = 3;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int degrees = (int)(360 * distance / circumference);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;setSpeed();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorRight.rotate(degrees, true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorLeft.rotate(degrees, true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;cmDist = distSensor.getDistance();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;litSensor.setFloodlight(blinkLight);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;blinkLight = !blinkLight;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawInt(litSensor.readNormalizedValue(),1,4);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;boolean turnPositive = random.nextBoolean();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;while(running &amp;amp;&amp;amp; cmDist &lt;&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawString("   ",1,2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawInt(cmDist,1,2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;setSpeed();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if(turnPositive) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorRight.rotate(180);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorRight.rotate(-180);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;cmDist = distSensor.getDistance();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Thread.sleep(500);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;} catch(InterruptedException ie) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Ignore&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public static void setSpeed() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int soundLevel = sound.readValue();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawString("   ",1,3);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;LCD.drawInt(soundLevel,1,3);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;int speed = (100 - soundLevel) * 9;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorRight.setSpeed(speed);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;motorLeft.setSpeed(speed);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;static Motor motorRight = Motor.B;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;static Motor motorLeft = Motor.C;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;private static SoundSensor sound = new SoundSensor(SensorPort.S1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;private static boolean running = false;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;class ButtonWatcherThread extends Thread {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public ButtonWatcherThread(TimerListener tl) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;this.tl = tl;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;this.setDaemon(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;public void run() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;wasPressedLast = touchSensor.isPressed();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;while(true) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;boolean isPressed = touchSensor.isPressed();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if(wasPressedLast != isPressed) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;if(isPressed) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;tl.timedOut();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;wasPressedLast = isPressed;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;try {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Thread.sleep(100);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;} catch(InterruptedException ie) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Ignore&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;private TimerListener tl;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;private boolean wasPressedLast;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;private TouchSensor touchSensor = new TouchSensor(SensorPort.S3);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2801585593521532305?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2801585593521532305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2801585593521532305&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2801585593521532305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2801585593521532305'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/11/lego-mindstorm-nxt-program.html' title='Lego Mindstorm NXT program'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4590040155748514244</id><published>2008-10-31T16:44:00.001-05:00</published><updated>2008-10-31T16:44:57.175-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joke'/><title type='text'>Why do geeks celebrate Christmas on Halloween?</title><content type='html'>Because Oct. 31 = Dec. 25&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4590040155748514244?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4590040155748514244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4590040155748514244&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4590040155748514244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4590040155748514244'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/10/why-do-geeks-celebrate-christmas-on.html' title='Why do geeks celebrate Christmas on Halloween?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1410323968083873086</id><published>2008-10-02T11:33:00.004-05:00</published><updated>2008-10-02T12:14:48.872-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Digital money</title><content type='html'>I think digital money should have these features:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hard to counterfit&lt;/li&gt;&lt;li&gt;Hard to duplicate (and use twice)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Easy to transfer to another person with minimal involvement of a 3rd party&lt;/li&gt;&lt;li&gt;Easy to use, track, store, verify, etc&lt;/li&gt;&lt;li&gt;Transaction fees must be very, very low.&lt;/li&gt;&lt;li&gt;Minimal Big Brother tracking.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Here is one idea for how to accomplish that:&lt;br /&gt;A user would go to a website and enter payment info and the website would send the user an image file.  The file would be a picture of the amount of money that it represents (for ease of use) and would have comments in it that record the originating website, amount and any other needed info.  The website would generate the image so that is unique (i.e. the bits are unique)  and would store the image bits and amount in a database.  The file would have to be large enough so that a brute force attempt to generate random files would be too expensive.&lt;br /&gt;When the user needs to split an amount (make change), they would send it to the website and request the new amounts.  The website would verify that it was valid (in their DB), send new image files to the user, and delete the record for the old file.&lt;br /&gt;When the user needs to send money to another person they would just get the correct amount (using splitting or multiple files) and send those files to the other person.  The other person would send them to the website to get their own files so that the old file is invalid and they have a valid file.  Once the other person saw that they were valid they would complete the transaction with the first person.&lt;br /&gt;Verification consists of sending to the website to get an new file.  If the file was invalid the webiste would just give an error message.  Anytime a user receives money from another user they must verify it (get a new file) to make sure that it is valid.&lt;br /&gt;The user could cash out the file by going to the website and requesting payment.&lt;br /&gt;Transaction fees would be limited to the initial payment and requesting payment.&lt;br /&gt;&lt;br /&gt;The user could have requested multiple files with various amounts to make it easier.&lt;br /&gt;If someone tries to make a copy of the file in order to use it twice only the first copy would be validated.&lt;br /&gt;&lt;br /&gt;The user would need to remember to not make any changes to the image (i.e. rotation) because that would invalidate the file.  Therefore the image formats that Windows Explorer can rotate should be avoided or the files always marked as read-only.&lt;br /&gt;&lt;br /&gt;This idea could work for trading anything (different currencies, stocks, etc).  Each website would have its own file type but websites or users could translate between the different file types.&lt;br /&gt;&lt;br /&gt;Comments?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1410323968083873086?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1410323968083873086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1410323968083873086&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1410323968083873086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1410323968083873086'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/10/digital-money.html' title='Digital money'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5626435587520081670</id><published>2008-08-06T15:21:00.002-05:00</published><updated>2008-08-06T15:24:09.731-05:00</updated><title type='text'>Spell check what others write</title><content type='html'>I think programs should spell and grammer check what others wrote.  i.e. If I am reading a webpage it should have some way of marking bad spelling or grammer with a way to see suggested improvements.  That would allow me to understand the intent better when the grammer or spelling is poor.&lt;br /&gt;&lt;br /&gt;Do you agree that adding this feature to browers, IM clients, etc would be useful?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5626435587520081670?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5626435587520081670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5626435587520081670&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5626435587520081670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5626435587520081670'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/08/spell-check-what-others-write.html' title='Spell check what others write'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6303362732356412698</id><published>2008-06-16T11:51:00.002-05:00</published><updated>2008-06-16T11:57:35.389-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xsl'/><title type='text'>XSL: Preserving line feeds, tabs, and spaces in data while still wrapping text</title><content type='html'>&lt;div&gt;&lt;span class="765063815-25072007"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:85%;" &gt;I had data in XML  that had line feeds, spaces, and tabs that I wanted to preserve (so I couldn't  use &lt;p&gt;) but I also wanted the lines to wrap when the side of the screen  was reached (so I couldn't use &lt;/p&gt;&lt;pre&gt;).&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="765063815-25072007"&gt;&lt;span style="color: rgb(128, 0, 0);font-size:85%;" &gt;After some  research and help from a co-worker (Patricia Eromosele) I made the XSL template below that achieves that.   An example  of how to call it follows:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                    &amp;lt;xsl:call-template name="prewrap"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                      &amp;lt;xsl:with-param name="text" select="text"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                    &amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;xsl:template name="prewrap"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;xsl:param name="text" select="."/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;xsl:variable name="spaceIndex" select="string-length(substring-before($text, '  '))"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;xsl:variable name="tabIndex" select="string-length(substring-before($text, '&amp;amp;#x09;'))"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;xsl:variable name="lineFeedIndex" select="string-length(substring-before($text, '&amp;amp;#xA;'))"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;xsl:choose&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;xsl:when test="$spaceIndex = 0 and $tabIndex = 0 and $lineFeedIndex = 0"&amp;gt;&amp;lt;!-- no special characters left --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           &amp;lt;xsl:value-of select="$text"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;/xsl:when&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;xsl:when test="$spaceIndex &amp;gt; $tabIndex and $lineFeedIndex &amp;gt; $tabIndex"&amp;gt;&amp;lt;!-- tab --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:value-of select="substring-before($text, '&amp;amp;#x09;')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:call-template name="prewrap"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           &amp;lt;xsl:with-param name="text" select="substring-after($text,'&amp;amp;#x09;')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;/xsl:when&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;xsl:when test="$spaceIndex &amp;gt; $lineFeedIndex and $tabIndex &amp;gt; $lineFeedIndex"&amp;gt;&amp;lt;!-- line feed --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:value-of select="substring-before($text, '&amp;amp;#xA;')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:call-template name="prewrap"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           &amp;lt;xsl:with-param name="text" select="substring-after($text,'&amp;amp;#xA;')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;/xsl:when&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;xsl:when test="$lineFeedIndex &amp;gt; $spaceIndex and $tabIndex &amp;gt; $spaceIndex"&amp;gt;&amp;lt;!-- two spaces --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:value-of select="substring-before($text, '  ')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:text disable-output-escaping="yes"&amp;gt;&amp;amp;amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;xsl:call-template name="prewrap"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           &amp;lt;xsl:with-param name="text" select="substring-after($text,'  ')"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         &amp;lt;/xsl:call-template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;/xsl:when&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;xsl:otherwise&amp;gt;&amp;lt;!-- should never happen --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           &amp;lt;xsl:value-of select="$text"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       &amp;lt;/xsl:otherwise&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &amp;lt;/xsl:choose&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;/xsl:template&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6303362732356412698?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6303362732356412698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6303362732356412698&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6303362732356412698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6303362732356412698'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/06/xsl-preserving-line-feeds-tabs-and.html' title='XSL: Preserving line feeds, tabs, and spaces in data while still wrapping text'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4824690885181151785</id><published>2008-06-16T11:50:00.000-05:00</published><updated>2008-06-16T11:51:22.557-05:00</updated><title type='text'>Tip: Java thread dumps on linux</title><content type='html'>To get a thread dump in Java on linux run "&lt;span style="font-size:85%;"&gt;pkill -3 java&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4824690885181151785?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4824690885181151785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4824690885181151785&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4824690885181151785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4824690885181151785'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/06/tip-java-thread-dumps-on-linux.html' title='Tip: Java thread dumps on linux'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2154047380516345519</id><published>2008-06-16T11:48:00.001-05:00</published><updated>2008-06-16T11:50:11.031-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>Ethical programming</title><content type='html'>&lt;blockquote&gt;It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure. Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter. &lt;/blockquote&gt;&lt;div style="text-align: right;"&gt;-- Nathaniel Borenstein&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-style: italic;"&gt;(Passed on by Reid Nimz.)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2154047380516345519?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2154047380516345519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2154047380516345519&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2154047380516345519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2154047380516345519'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/06/ethical-programming.html' title='Ethical programming'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4836856555180788626</id><published>2008-02-15T15:32:00.002-06:00</published><updated>2008-02-15T15:39:35.724-06:00</updated><title type='text'>Rename multiple files</title><content type='html'>Options for renaming multiple files on Windows&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Windows explorer: It only renames them to &lt;code&gt;xxxx (&lt;i&gt;y&lt;/i&gt;).ext&lt;/code&gt; where &lt;a href="http://support.microsoft.com/kb/320167"&gt;the only thing that varies is &lt;i&gt;y&lt;/i&gt;&lt;/a&gt; (an incrementing number).&lt;/li&gt;&lt;li&gt;Various utilities available for download: I don't like to risk running some unknown program for something that seems so simple.&lt;/li&gt;&lt;li&gt;Command line &lt;code&gt;for in do&lt;/code&gt; command.  To prepend "3-" to every directory that starts with "60-" run: &lt;code&gt;for /d %i in (60-*) do ren %i 3-%i&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4836856555180788626?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4836856555180788626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4836856555180788626&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4836856555180788626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4836856555180788626'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/02/rename-multiple-files.html' title='Rename multiple files'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-580797766219565568</id><published>2008-02-11T14:00:00.000-06:00</published><updated>2008-02-11T14:01:41.335-06:00</updated><title type='text'>Geek Status</title><content type='html'>In my IM client I set my status to the following.  I admin that I'm a geek but it's fun!&lt;br /&gt;echo "JANS" | sed "s/A//" | sed "s/J/Ava/" | sed "s/N/il/" | sed "s/S/able/"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-580797766219565568?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/580797766219565568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=580797766219565568&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/580797766219565568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/580797766219565568'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/02/geek-status.html' title='Geek Status'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2858907102127624409</id><published>2008-02-04T10:18:00.000-06:00</published><updated>2008-02-04T10:22:00.905-06:00</updated><title type='text'>3 paychecks in February</title><content type='html'>I get paid bi-weekly on Fridays and this year I get 3 paychecks in February.  I was wondering how often that happens and with Excel's help I found that it happens every 56 years.  I also found that a month with 3 paychecks will be 5-7 months later than the last month with 3 paychecks.  In 2010 there will be 3 months with 3 paychecks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2858907102127624409?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2858907102127624409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2858907102127624409&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2858907102127624409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2858907102127624409'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/02/3-paychecks-in-february.html' title='3 paychecks in February'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8155103659240891560</id><published>2008-01-29T10:55:00.000-06:00</published><updated>2008-01-29T10:57:31.488-06:00</updated><title type='text'>Explaing zero-based arrays</title><content type='html'>Sometimes people have a hard time understand zero-based arrays but I just realized that ages are zero-based.&lt;br /&gt;&lt;br /&gt;The first year of life someone is 0 years old.&lt;br /&gt;The 2nd year of life someone is 1 year old.&lt;br /&gt;Etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8155103659240891560?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8155103659240891560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8155103659240891560&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8155103659240891560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8155103659240891560'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/01/explaing-zero-based-arrays.html' title='Explaing zero-based arrays'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7677408018650437233</id><published>2008-01-25T11:06:00.000-06:00</published><updated>2008-01-25T11:38:53.276-06:00</updated><title type='text'>Genome assembler</title><content type='html'>I have been listening to "&lt;a href="http://www.amazon.com/Genome-War-Craig-Venter-Capture/dp/0375406298"&gt;The Genome War&lt;/a&gt;" and it seems like the the difficulty of assembling the pieces from the Shotgun sequencing isn't has hard as described in the book.&lt;br /&gt;&lt;br /&gt;Data points:&lt;br /&gt;Base pairs in the Human Genome: 3 billion.&lt;br /&gt;Different types of base pairs: 4&lt;br /&gt;Sequence length: 2,000&lt;br /&gt;Maximum number of sequences per whole genome: 1,500,000&lt;br /&gt;Number of reads to get coverage: 12&lt;br /&gt;Total number of sequences to assemble: 18,000,000&lt;br /&gt;Total ends to match: 36,000,000&lt;br /&gt;Length of an end: 50 base pairs (13 bytes can store 52 base pairs)&lt;br /&gt;&lt;br /&gt;Technique:&lt;br /&gt;So if you made a database table with a column to store the end code (from the outside) and a sequence column to store the sequence that for that end, you would have 2 rows per sequence for a total of 36,000,000 rows.  Each row would have 513 bytes of info for a total of 17 GB of data.  &lt;br /&gt;Then make a table called End48 with a Key48 column for 48 base pairs (12 bytes) and a Value52 for 52 base pairs (13 bytes).&lt;br /&gt;Fill that table so that each end in the main table is put in the Value52 column and and the first 48 base pairs of that end are put in the Key48 column.&lt;br /&gt;Continue stripping down the end base pairs into tables End44, End40, End36, ..., End8, End4. (You actually only have to go as far down as the DB can easily sort the key column -- I think current DBs wouldn't need any End tables).  &lt;br /&gt;Then you can start by sorting the key column of the smallest End table and continue until all of the sequences are sorted by their end pieces.  Finally go through the sorted results and join any sequences that have the same end value.  A lot of this processing could occur as the data comes in so you wouldn't have to wait until the end to do all of the computing.&lt;br /&gt;&lt;br /&gt;This assumes that sequences always end at the same point which I am not sure is true.  If that isn't true then you might end up with multiple copies of the genome in the final assembly stage but that would not be a problem.&lt;br /&gt;&lt;br /&gt;That technique could be easily done with a few thousand dollars of hardware today and I assume it would not have taken a super-computer in 1999-2000.  &lt;br /&gt;&lt;br /&gt;So what am I missing because apparently the problem was much more difficult to solve?&lt;br /&gt;&lt;br /&gt;Reference: &lt;a href="http://en.wikipedia.org/wiki/Human_genome_project"&gt;http://en.wikipedia.org/wiki/Human_genome_project&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7677408018650437233?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7677408018650437233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7677408018650437233&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7677408018650437233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7677408018650437233'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/01/genome-assembler.html' title='Genome assembler'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5442699991780158316</id><published>2008-01-22T07:47:00.000-06:00</published><updated>2008-01-22T07:50:46.638-06:00</updated><title type='text'>What kind of programming work do you like best?</title><content type='html'>When interviewing candidates I would ask them the following question:&lt;br /&gt;What kind of programming work do you like best?&lt;br /&gt;&lt;br /&gt;They always (3-4 interviews) gave then same answer: Creating new software.&lt;br /&gt;Since that isn't the answer that I would give I asked my co-workers and between 4 of us we had 3 different answers:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Creating something new&lt;/li&gt;&lt;li&gt;Debugging problems.&lt;/li&gt;&lt;li&gt;Improving (adding features, improving performance, etc).&lt;/li&gt;&lt;/ol&gt;Would you give one of those answers?  Do you have a different answer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5442699991780158316?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5442699991780158316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5442699991780158316&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5442699991780158316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5442699991780158316'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/01/what-kind-of-programming-work-do-you.html' title='What kind of programming work do you like best?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5071804072855677726</id><published>2008-01-02T12:57:00.000-06:00</published><updated>2008-01-02T13:03:24.073-06:00</updated><title type='text'>Zooming to better use desktop space</title><content type='html'>On a real-life desktop I will often move toward an object to work with it.  i.e. When I want to work with the calendar I will move closer to it.  That allows better use of my desktop because some objects are "zoomed out" and therefore take less space (in my field of view).&lt;br /&gt;&lt;br /&gt;Has anyone ever tried to incorporate a similar idea into a GUI.  Icons, minimize/maximize, and resizing are somewhat like that but not quite enough.  It would be nice to resize something to a "zoomed out size".  i.e. I could set a size for my email program when it isn't in use and it would be shrunk to fit in that space when desired.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5071804072855677726?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5071804072855677726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5071804072855677726&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5071804072855677726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5071804072855677726'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2008/01/zooming-to-better-use-desktop-space.html' title='Zooming to better use desktop space'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8159545455393717240</id><published>2007-12-17T12:43:00.000-06:00</published><updated>2007-12-17T12:56:02.252-06:00</updated><title type='text'>Telecommuting</title><content type='html'>I telecommute one day per week and used to telecommute 2 days per week.  I would like to telecommute more but my employer isn't very open to doing that (except short-term for a specific project).  I don't know of any Java enterprise developers that do major telcommuting (4 days per week or more).  I have also not seen very many telecommuting jobs for enterprise Java developers.  Why don't more exist?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technorati.com/claim/8ckg69aknx" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8159545455393717240?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8159545455393717240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8159545455393717240&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8159545455393717240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8159545455393717240'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/12/telecommuting.html' title='Telecommuting'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-70646059505735121</id><published>2007-12-12T11:06:00.000-06:00</published><updated>2007-12-12T11:21:38.464-06:00</updated><title type='text'>Subversion: Moving tags</title><content type='html'>I wish Subversion had a better way of moving tags.  The only way that I know to move a tag is to remove the file from the tag and then copy it again.  Revision tree browsers don't seem to handle that very well.  This also requires keeping the directory structure under the trunk and tag in sync.&lt;br /&gt;&lt;br /&gt;Use case:  We have thousands of "maps" and we want to tag which version of each map is the "production" version.  We need to be able to easily get the production version of all maps.&lt;br /&gt;&lt;br /&gt;Can anyone suggest a better way to address our use case?&lt;br /&gt;I have considered properties also but then we can't get the prod version of all files easily.  Merging to the tag doesn't appear to be very easy either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-70646059505735121?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/70646059505735121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=70646059505735121&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/70646059505735121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/70646059505735121'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/12/subversion-moving-tags.html' title='Subversion: Moving tags'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-562527800177872886</id><published>2007-11-26T11:20:00.001-06:00</published><updated>2007-11-26T11:27:06.495-06:00</updated><title type='text'>IntelliJ default class javadoc comment</title><content type='html'>Why does the default IntelliJ default class javadoc comment use non-standard syntax?  Instead of creating a line with "&lt;code&gt;User: jstauffer&lt;/code&gt;" it could create a line with "&lt;code&gt;@author jstauffer&lt;/code&gt;".  The other lines that it creates (Date and Time) probably don't have javadoc syntax to use but why not use the javadoc syntax when available?&lt;br /&gt;&lt;br /&gt;For reference here is an example:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/**&lt;br /&gt; * Created by IntelliJ IDEA.&lt;br /&gt; * User: jstauffer&lt;br /&gt; * Date: Nov 13, 2007&lt;br /&gt; * Time: 11:15:10 AM&lt;br /&gt; * To change this template use File | Settings | File Templates.&lt;br /&gt; */&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-562527800177872886?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/562527800177872886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=562527800177872886&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/562527800177872886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/562527800177872886'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/11/intellij-default-class-javadoc-comment.html' title='IntelliJ default class javadoc comment'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-49320424215800616</id><published>2007-11-26T11:12:00.000-06:00</published><updated>2007-11-26T11:19:57.611-06:00</updated><title type='text'>Naming abstract classes</title><content type='html'>&lt;p&gt;Normally I see abstract classes named as &lt;code&gt;Abstract&lt;/code&gt;&lt;i&gt;Class&lt;/i&gt;.  But when there are many abstract classes that leads to needing to type at least &lt;code&gt;Abstract&lt;/code&gt;&lt;i&gt;C&lt;/i&gt; when using code completion.  Therefore I suggest that abstract classes be named &lt;i&gt;Class&lt;/i&gt;&lt;code&gt;Abstract&lt;/code&gt; so that code completion is more usable.  "Abstract" is a modifier on the class name anyway and it doesn't need to be in the primary position.  What do you think?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;I know this isn't a huge deal -- I am just suggesting it as a minor improvement.&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-49320424215800616?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/49320424215800616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=49320424215800616&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/49320424215800616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/49320424215800616'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/11/naming-abstract-classes.html' title='Naming abstract classes'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4738276238153204619</id><published>2007-11-21T14:16:00.001-06:00</published><updated>2007-11-21T14:17:52.108-06:00</updated><title type='text'>Defaults have consequences: Microsoft Word margins</title><content type='html'>How much paper would be saved each year it Microsoft changed the default margins in Word to 1" on each side (or even 1/2")?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4738276238153204619?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4738276238153204619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4738276238153204619&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4738276238153204619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4738276238153204619'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/11/defaults-have-consequences-microsoft.html' title='Defaults have consequences: Microsoft Word margins'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4067381289413691308</id><published>2007-10-19T20:18:00.000-05:00</published><updated>2007-10-19T20:21:48.277-05:00</updated><title type='text'>Autoboxing quiz</title><content type='html'>Does widening or autoboxing happen first? Which &lt;code&gt;param&lt;/code&gt; method will be called from the &lt;code&gt;autoboxing&lt;/code&gt; method?  If one &lt;code&gt;param&lt;/code&gt; method is commented out then it will have no problem calling the other.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;private static void autoboxing() {&lt;br /&gt;    Integer integer = new Integer(2);&lt;br /&gt;    param(integer);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static void param(int param) {&lt;br /&gt;    System.out.println("param(int " + param + ")");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static void param(Object param) {&lt;br /&gt;    System.out.println("param(Object " + param + ")");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4067381289413691308?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4067381289413691308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4067381289413691308&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4067381289413691308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4067381289413691308'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/autoboxing-quiz.html' title='Autoboxing quiz'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7377494782696985985</id><published>2007-10-18T11:20:00.000-05:00</published><updated>2007-10-18T11:49:44.814-05:00</updated><title type='text'>Website idea</title><content type='html'>If you make your fortune with this idea, send me a few bucks.&lt;br /&gt;Make a website where the user can keep a list of things that they need/want to buy.&lt;br /&gt;Allow easy management of that list (through web, WAP, SMS, etc).&lt;br /&gt;&lt;br /&gt;Then....&lt;br /&gt;Work with stores so they the user can get a list of all of the items in the list that the given store has.  The store could even allow printing the list from a kiosk in the store (registry computers) and would include the location, price, etc.  The stores would benefit because people would probably buy more if they remembered what they wanted to buy and they would buy items that they didn't know the given store had.  You could then charge the store a small fee so that you wouldn't need ads on the website or user fees.&lt;br /&gt;&lt;br /&gt;For stores that don't support that use GPS to determine the store and try to send a list of items that the store has (scrape website?).&lt;br /&gt;&lt;br /&gt;Does a website like this exist?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7377494782696985985?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7377494782696985985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7377494782696985985&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7377494782696985985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7377494782696985985'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/website-idea.html' title='Website idea'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2376008882004622967</id><published>2007-10-17T11:05:00.001-05:00</published><updated>2007-10-17T11:05:29.647-05:00</updated><title type='text'>Haiku</title><content type='html'>One connection good.&lt;br /&gt;Then two connections better.&lt;br /&gt;Or maybe not so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2376008882004622967?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2376008882004622967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2376008882004622967&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2376008882004622967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2376008882004622967'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/haiku.html' title='Haiku'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1414924138807236364</id><published>2007-10-09T13:49:00.000-05:00</published><updated>2007-10-09T13:53:20.253-05:00</updated><title type='text'>Form post with URL paramters (after question mark)</title><content type='html'>I had a URL that I wanted to POST with JavaScript so a made a &lt;pre&gt;&lt;br /&gt;        &amp;lt;form name="doForm" action="" method="post"&amp;gt;&lt;br /&gt;        &amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt; and used JavaScript to set the action and call submit.  But Tomcat showed the request as a GET.  I found that adding a dummy form input fixed the problem:&lt;pre&gt;&lt;br /&gt;        &amp;lt;form name="doForm" action="" method="post"&amp;gt;&lt;br /&gt;            &amp;lt;input type="hidden" name="blah" value="blah"/&amp;gt;&amp;lt;!-- need at least 1 input or the form uses method="get" even when "post" is specified. --&amp;gt;&lt;br /&gt;        &amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1414924138807236364?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1414924138807236364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1414924138807236364&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1414924138807236364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1414924138807236364'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/form-post-with-url-paramters-after.html' title='Form post with URL paramters (after question mark)'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4178897072350907833</id><published>2007-10-09T13:47:00.001-05:00</published><updated>2007-12-12T11:06:05.845-06:00</updated><title type='text'>Exception plan</title><content type='html'>In projects on which I have worked I find that a few common Exceptions are used over and over again and tend to lose their meaning.  Does anyone have good resources for exception patterns?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4178897072350907833?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4178897072350907833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4178897072350907833&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4178897072350907833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4178897072350907833'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/exception-plan.html' title='Exception plan'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1106219611290785675</id><published>2007-10-04T10:44:00.000-05:00</published><updated>2007-12-12T11:05:03.650-06:00</updated><title type='text'>Subversion notes</title><content type='html'>We recently converted from cvs to Subversion and overall I like it much better than cvs but:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I wish cvs2svn converted .cvsignore files to svn:ignore properties.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I wish it handled tags and branches natively instead of using the copy method.  Tags and branches are core parts of version control and I think something is lost by implementing them non-natively.&lt;/li&gt;&lt;li&gt;I hope svn:externals will be able to point to a specific file soon.&lt;/li&gt;&lt;li&gt;I wish update and status didn't print so much extra info about the externals.  For status I have to run &lt;code&gt;svn status --ignore-externals --show-updates %* | grep -v "^[XI]" | grep -v "^Status against revision"&lt;/code&gt; just to get what I want.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1106219611290785675?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1106219611290785675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1106219611290785675&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1106219611290785675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1106219611290785675'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/subversion-notes.html' title='Subversion notes'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7602839042699101856</id><published>2007-10-02T07:37:00.000-05:00</published><updated>2007-10-02T07:39:45.881-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Converting .cvsignore file to Subversion svn:ignore property</title><content type='html'>If you have converted a cvs repository to a Subversion repository and need to convert .cvsignore files to subversion svn:ignore properties then the following script should be useful to you.  Note that it probably doesn't handle spaces in filenames.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;find . -name ".cvsignore" -print | sed "s/\/.cvsignore//" | tee ignoredirs.txt&lt;br /&gt;&lt;br /&gt;for i in `cat ignoredirs.txt`&lt;br /&gt;do&lt;br /&gt;    echo Processing $i/.cvsignore&lt;br /&gt;    svn propset svn:ignore -F "$i/.cvsignore" "$i"&lt;br /&gt;    svn remove "$i/.cvsignore"&lt;br /&gt;&lt;br /&gt;done&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7602839042699101856?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7602839042699101856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7602839042699101856&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7602839042699101856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7602839042699101856'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/10/converting-cvsignore-file-to-subversion.html' title='Converting .cvsignore file to Subversion svn:ignore property'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6191636207655992968</id><published>2007-09-28T09:10:00.000-05:00</published><updated>2007-09-28T09:22:32.573-05:00</updated><title type='text'>Garbage collecting file system</title><content type='html'>Why don't current file systems implement garbage collection so that deleting a directory takes constant time (regardless of how many descendants it has)?&lt;br /&gt;&lt;br /&gt;Google has done that See section 4.4 (page 8) of &lt;a href="http://209.85.163.132/papers/gfs-sosp2003.pdf"&gt;http://209.85.163.132/papers/gfs-sosp2003.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6191636207655992968?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6191636207655992968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6191636207655992968&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6191636207655992968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6191636207655992968'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/09/garbage-collecting-file-system.html' title='Garbage collecting file system'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1709400491507207622</id><published>2007-09-28T07:20:00.000-05:00</published><updated>2007-09-28T08:38:15.857-05:00</updated><title type='text'>Subversion: Setting svn:keywords property</title><content type='html'>If you converted from cvs and need to set the svn:keywords property you can use the following script (doesn't handle spaces).  I wrote this before I realized that cvs2svn already set the property and I therefore didn't need it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;echo Seaching...&lt;br /&gt;# Put Keywords up one directory so the 2nd-last greps don't search it.&lt;br /&gt;grep -R -H "\$Date:" * | grep "\$Date:" &gt; ../Keywords.txt&lt;br /&gt;grep -R -H "\$Revision:" * | grep "\$Revision:" &gt;&gt; ../Keywords.txt&lt;br /&gt;grep -R -H "\$Author:" * | grep "\$Author:" &gt;&gt; ../Keywords.txt&lt;br /&gt;grep -R -H "\$Id:" * | grep "\$Id:" &gt;&gt; ../Keywords.txt&lt;br /&gt;&lt;br /&gt;echo Setting Properties...&lt;br /&gt;cat ../Keywords.txt | sed "s/:.*$//" | sed "s/^/\"/" | sed "s/$/\"/" | xargs -L 1 svn propset svn:keywords "Date Revision Author Id"&lt;br /&gt;echo Results:&lt;br /&gt;svn status&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1709400491507207622?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1709400491507207622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1709400491507207622&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1709400491507207622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1709400491507207622'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/09/subversion-setting-svnkeywords-property.html' title='Subversion: Setting svn:keywords property'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1212555842442718559</id><published>2007-09-25T12:52:00.000-05:00</published><updated>2007-09-28T07:19:30.792-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Remove empty Subversion directories</title><content type='html'>I couldn't find any scripts that would prune empty Subversion controlled directories so I wrote the following.  Enjoy!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/bash&lt;br /&gt;&lt;br /&gt;for i in `find . -type d -print -name ".svn" | grep -v "/\.svn"`&lt;br /&gt;do&lt;br /&gt;    if [ -z "`ls -A $i | grep -v '\.svn' `" ]&lt;br /&gt;    then&lt;br /&gt;        echo Removing $i&lt;br /&gt;        ls -A $i&lt;br /&gt;        svn remove $i&lt;br /&gt;    fi&lt;br /&gt;done&lt;br /&gt;echo Results:&lt;br /&gt;svn status&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;The script above doesn't handle spaces in the filename so use the following two scripts if you have spaces in any filename:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;svnPrune.sh&lt;/b&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;echo Searching...&lt;br /&gt;find . -type d ! -path "*\.svn*" ! -name "\." ! -name "tags" ! -name "branches" -exec /svn/svnPruneDirectory.sh {} \;&lt;br /&gt;&lt;br /&gt;echo Results:&lt;br /&gt;svn status&lt;br /&gt;&lt;br /&gt;&lt;b&gt;svnPruneDirectory.sh&lt;/b&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;directory="$*"&lt;br /&gt;#echo Processing $directory ------------------------------------------------------&lt;br /&gt;&lt;br /&gt;files=`ls -A "$directory" | grep -v '\.svn'`&lt;br /&gt;#echo files=$files&lt;br /&gt;childrenCount=`ls -A "$directory" | grep -v '\.svn' | wc -l`&lt;br /&gt;#echo $directory: $childrenCount&lt;br /&gt;if [ "$childrenCount" -eq "0" ]&lt;br /&gt;then&lt;br /&gt;    echo Removing $directory&lt;br /&gt;#    echo $files&lt;br /&gt;    svn remove "$directory"&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1212555842442718559?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1212555842442718559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1212555842442718559&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1212555842442718559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1212555842442718559'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/09/remove-empty-subversion-directories.html' title='Remove empty Subversion directories'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-2121264464556292645</id><published>2007-09-24T11:32:00.000-05:00</published><updated>2007-09-28T09:33:56.787-05:00</updated><title type='text'>Terminal window with 3 frames</title><content type='html'>I think it would be useful to have a terminal window with 3 frames.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Output frame (At the top): Shows all program ouput and input/commands that the have been processed.&lt;/li&gt;&lt;li&gt;Input frame (in the middle): Allows the user to enter standard input.  Only show when a program is waiting for standard input.&lt;/li&gt;&lt;li&gt;Command frame (at the bottom): Allows the user to enter commands.&lt;/li&gt;&lt;/ol&gt;Benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It would be obvious when I wrote a command that is waiting for user input.&lt;/li&gt;&lt;li&gt;It could allow you to provide standard input via a command after running another command.&lt;/li&gt;&lt;/ul&gt;This could probably also be done in one frame with coloring to show the different parts.  The prompt would change color when waiting for standard input (as opposed to waiting for the process to finish).&lt;br /&gt;&lt;br /&gt;What do you think?  Does something like this exist?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-2121264464556292645?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/2121264464556292645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=2121264464556292645&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2121264464556292645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/2121264464556292645'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/09/terminal-window-with-3-frames.html' title='Terminal window with 3 frames'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1870688355608609061</id><published>2007-09-07T14:57:00.000-05:00</published><updated>2007-09-07T15:04:20.650-05:00</updated><title type='text'>Java applet to check Java version</title><content type='html'>Out product only requires Java 1.4 (or higher) but we want to require Java 1.5.  About 10% of applet requests used Java 1.4 so we want a way to notify the users who use Java 1.4 that they should upgrade.  Searching with Google I couldn't find any such applet so here is my version.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JavaVersionCheck.class:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import javax.swing.*;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Prints the &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; if the java version doesn't match&lt;br /&gt;* &amp;lt;code&amp;gt;javaVersionPattern&amp;lt;/code&amp;gt;.&lt;br /&gt;* @author James Stauffer&lt;br /&gt;*/&lt;br /&gt;public class JavaVersionCheck extends JApplet {&lt;br /&gt;   public void init() {&lt;br /&gt;       try {&lt;br /&gt;           String javaVersionPattern = getParameter("javaVersionPattern");&lt;br /&gt;           String message = getParameter("message");&lt;br /&gt;           if(VersionMatches(javaVersionPattern)) {&lt;br /&gt;               add(new JLabel(message));&lt;br /&gt;           }&lt;br /&gt;       } catch (Exception e) {&lt;br /&gt;           e.printStackTrace();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static boolean VersionMatches(String javaVersionPattern) {&lt;br /&gt;       String javaVersion = System.getProperty("java.version");&lt;br /&gt;       return javaVersion.matches(javaVersionPattern);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void main(String args[]) {&lt;br /&gt;       if(args.length &gt; 0) {&lt;br /&gt;           String javaVersionPattern = args[0];&lt;br /&gt;           if(VersionMatches(javaVersionPattern)) {&lt;br /&gt;               if(args.length &gt; 1) {&lt;br /&gt;                   System.out.println(args[1]);&lt;br /&gt;               } else {&lt;br /&gt;                   System.out.println("Matches " + javaVersionPattern);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HTML:&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;applet height="30" width="300" code="JavaVersionCheck.class"&amp;gt;&lt;br /&gt;   &amp;lt;param name="javaVersionPattern" value="^1\.4.*"&amp;gt;&lt;br /&gt;   &amp;lt;param name="message" value="Java 1.4 is not supported.  Please upgrade to 1.5."&amp;gt;&lt;br /&gt;&amp;lt;/applet&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1870688355608609061?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1870688355608609061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1870688355608609061&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1870688355608609061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1870688355608609061'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/09/java-applet-to-check-java-version.html' title='Java applet to check Java version'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-996277339194386017</id><published>2007-08-10T10:41:00.001-05:00</published><updated>2007-08-10T10:41:28.972-05:00</updated><title type='text'>toString() cost</title><content type='html'>Do you assume that toString() on any given object has a low cost? I do. Is that assumption valid? If it has a high cost should that normally be changed? What are valid reasons to make a toString() method with a high cost?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-996277339194386017?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/996277339194386017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=996277339194386017&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/996277339194386017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/996277339194386017'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/08/tostring-cost.html' title='toString() cost'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-5720180596380019021</id><published>2007-08-02T10:43:00.000-05:00</published><updated>2007-08-02T10:45:45.149-05:00</updated><title type='text'>Dynamic/static language</title><content type='html'>What if a language allow both static and dynamic types.  That might allow the best of both worlds.  i.e.:&lt;br /&gt;String str = "Hello";&lt;br /&gt;var temp = str;&lt;br /&gt;temp = 10;&lt;br /&gt;&lt;br /&gt;1. Would that be possible?&lt;br /&gt;2. Would that be beneficial?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-5720180596380019021?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/5720180596380019021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=5720180596380019021&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5720180596380019021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/5720180596380019021'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/08/dynamicstatic-language.html' title='Dynamic/static language'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8901670132202546738</id><published>2007-06-27T11:33:00.000-05:00</published><updated>2007-06-27T11:35:48.914-05:00</updated><title type='text'>Debugger for *nix pipe commands</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Times New Roman;font-size:85%;color:maroon;"&gt;&lt;span style="font-size: 10pt; color: maroon;"&gt;As I build *nix piped commands I find that I  want to see the output of one stage to verify correctness before building the  next stage but I don't want to re-run each stage.  Does anyone know of a program  that will help with that?  It would keep the output of the last stage  automatically to use for any new stages.  I  usually do this by sending the result of each command to a temporary file but  it would be nice for a program to handle this. &lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8901670132202546738?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8901670132202546738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8901670132202546738&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8901670132202546738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8901670132202546738'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/06/debugger-for-nix-pipe-commands.html' title='Debugger for *nix pipe commands'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-3703358900055230723</id><published>2007-06-25T13:26:00.000-05:00</published><updated>2007-06-25T13:27:09.151-05:00</updated><title type='text'>10 things to do today</title><content type='html'>&lt;div&gt;&lt;span class="400282518-25062007"&gt;&lt;span style="font-size:85%;color:#800000;"&gt;Here is my list  of 10 things to do today:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;ul&gt;&lt;li&gt;&lt;span class="400282518-25062007"&gt;&lt;span style="font-size:85%;color:#800000;"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="400282518-25062007"&gt;&lt;span style="font-size:85%;color:#800000;"&gt;Goto  #1&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-3703358900055230723?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/3703358900055230723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=3703358900055230723&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3703358900055230723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3703358900055230723'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/06/10-things-to-do-today.html' title='10 things to do today'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8817980669667458189</id><published>2007-05-22T16:16:00.000-05:00</published><updated>2007-05-23T10:34:14.074-05:00</updated><title type='text'>Programming Trends</title><content type='html'>&lt;a href="http://www.google.com/trends?q=Java+-indonesia%2C+PHP%2C+C%23%2C+ruby%2C+perl&amp;ctab=0&amp;amp;amp;geo=all&amp;date=all&amp;amp;sort=0"&gt;Java vs. other languanges&lt;br /&gt;http://www.google.com/trends?q=Java+-indonesia%2C+PHP%2C+C%23%2C+ruby%2C+perl&amp;ctab=0&amp;amp;amp;geo=all&amp;date=all&amp;amp;sort=0&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/trends?q=Java+1.2%2C+Java+1.3%2C+Java+1.4%2C+Java+1.5%2C+Java+1.6%2C+Java+1.1&amp;ctab=0&amp;amp;amp;geo=all&amp;date=all&amp;amp;sort=4"&gt;Java versions:&lt;br /&gt;http://www.google.com/trends?q=Java+1.2%2C+Java+1.3%2C+Java+1.4%2C+Java+1.5%2C+Java+1.6%2C+Java+1.1&amp;ctab=0&amp;amp;amp;geo=all&amp;date=all&amp;amp;sort=4&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8817980669667458189?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8817980669667458189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8817980669667458189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8817980669667458189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8817980669667458189'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/05/programming-trends.html' title='Programming Trends'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6492695714101987810</id><published>2007-05-18T13:59:00.000-05:00</published><updated>2007-05-23T10:32:32.328-05:00</updated><title type='text'>Telecommuting tips</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;I have been telecommutting 1-2 days/week for a few years so I present the following tips to those who want to telecommute:&lt;/span&gt;&lt;br /&gt;&lt;ol style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;&lt;span class="931205919-28032007"&gt;&lt;span style="font-size:85%;"&gt;Practice  communicating by email (especially when it is easier to talk in person about something) so  you get better at writing emails that are complete and easy to understand.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="931205919-28032007"&gt;&lt;span style="font-size:85%;"&gt;Practice doing  as many normal activities on your telecommuting days as possible.  Minimize  "waiting until you get back to the office".&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="931205919-28032007"&gt;&lt;span style="font-size:85%;"&gt;Practice  minimizing&lt;/span&gt;&lt;/span&gt;&lt;span class="931205919-28032007"&gt;&lt;span style="font-size:85%;"&gt; differences between your telecommuting and in-office days so that your  telecommuting doesn't negatively affect the company.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;    &lt;div style="color: rgb(0, 0, 0);"&gt;&lt;span class="931205919-28032007"&gt;&lt;span style="font-size:85%;"&gt;For me #1 was the  hardest to learn.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6492695714101987810?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6492695714101987810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6492695714101987810'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/05/telecommuting-tips.html' title='Telecommuting tips'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-8974289028736216540</id><published>2007-05-07T13:51:00.000-05:00</published><updated>2007-05-07T13:55:59.264-05:00</updated><title type='text'>Method return values for null objects</title><content type='html'>Would it be useful to be able to provide method return value for null objects?&lt;br /&gt;For a List the null return values might be:&lt;br /&gt;get(int) : null&lt;br /&gt;size() : 0&lt;br /&gt;iterator() would be an empty iterator&lt;br /&gt;&lt;br /&gt;That would allow the following code that has less null checks.&lt;br /&gt;&lt;br /&gt;List items = null;&lt;br /&gt;&lt;br /&gt;if(something) {&lt;br /&gt;    items = ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for(int index = 0; index &lt; items.size(); index++) {&lt;br /&gt;    Object obj = items.get(index);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-8974289028736216540?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/8974289028736216540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=8974289028736216540&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8974289028736216540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/8974289028736216540'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/05/method-return-values-for-null-objects.html' title='Method return values for null objects'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-4686997753827085404</id><published>2007-03-30T09:10:00.000-05:00</published><updated>2007-03-30T09:14:44.235-05:00</updated><title type='text'>Automatic casts</title><content type='html'>Why can't the compiler automatically insert casts?&lt;br /&gt;List list = new ArrayList();&lt;br /&gt;list.add("one");&lt;br /&gt;list.add("two");&lt;br /&gt;for(Iterator i = list.iterator(); i.hasNext(); ) {&lt;br /&gt;    String item = i.next();//Automatic casts&lt;br /&gt;    System.out.println(item);&lt;br /&gt;}&lt;br /&gt;//Or using the new for construct:&lt;br /&gt;for(String item : list) {&lt;br /&gt;    System.out.println(item);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.java.net/blog/emcmanus/archive/2007/03/getting_rid_of.html"&gt;http://weblogs.java.net/blog/emcmanus/archive/2007/03/getting_rid_of.html&lt;/a&gt; shows that the compiler can get really close.  Why can't it go the rest of the way?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-4686997753827085404?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/4686997753827085404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=4686997753827085404&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4686997753827085404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/4686997753827085404'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/03/automatic-casts.html' title='Automatic casts'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-1225456535680814801</id><published>2007-03-16T09:50:00.000-05:00</published><updated>2007-03-16T09:55:33.014-05:00</updated><title type='text'>IDE freedom</title><content type='html'>One way that I evaluate a new IDE is by opening a file in a fresh install and determining how much I can do with that file.  Obivously features that need to know about the other files in the project won't work.  I recently tried to use NetBeans and JDeveloper to generate getters and setters.  Neither would allow me to do that and one of them allowed me to choose that menu item but it just did nothing at all.  Maybe creating a project would have helped but that should be needless.  When an IDE "gets in the way" with what I want to do like that then it feels more like a straightjacket than a tool.  I know that is a simplistic evaluation but when that test fails I wonder how constraining the rest of the IDE is.&lt;br /&gt;Do you think that is a fair way to evaluate?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-1225456535680814801?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/1225456535680814801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=1225456535680814801&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1225456535680814801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/1225456535680814801'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/03/ide-freedom.html' title='IDE freedom'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-7991719544953450357</id><published>2007-02-23T15:02:00.000-06:00</published><updated>2007-02-23T15:10:24.376-06:00</updated><title type='text'>Cygwin ssh and key files</title><content type='html'>I tried to use key files with &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; ssh (so I don't have to provide my password each time) but kept running into the following error:&lt;br /&gt;&lt;pre&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @&lt;br /&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;Permissions 0644 for '//turfclub/users/jstauffe/.ssh/id_rsa' are too open.&lt;br /&gt;It is recommended that your private key files are NOT accessible by others.&lt;br /&gt;This private key will be ignored.&lt;br /&gt;bad permissions: ignore key: //turfclub/users/jstauffe/.ssh/id_rsa&lt;/pre&gt;The problem is that chmod wouldn't actually change the permissions so I couldn't get past this problem.  When I searched on this I found refernces to turning StrictMode off but that didn't work for me can caused errors.&lt;br /&gt;&lt;br /&gt;To fix this I did the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Started my bash shell&lt;/li&gt;&lt;li&gt;mkdir /home&lt;/li&gt;&lt;li&gt;mkdir /home/.ssh&lt;/li&gt;&lt;li&gt;cp ~/.ssh/* /home/.ssh&lt;/li&gt;&lt;li&gt;chmod 600 /home/.ssh/*&lt;/li&gt;&lt;li&gt;mv ~/.ssh ~/.ssh.bak&lt;/li&gt;&lt;li&gt;cd ~&lt;/li&gt;&lt;li&gt;ln -s /home/.ssh&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;It now works great (even in the normal Windows shell)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-7991719544953450357?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/7991719544953450357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=7991719544953450357&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7991719544953450357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/7991719544953450357'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/02/cygwin-ssh-and-key-files.html' title='Cygwin ssh and key files'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-6485287241040445043</id><published>2007-01-17T14:48:00.000-06:00</published><updated>2007-01-17T14:55:37.510-06:00</updated><title type='text'>Automatic casting</title><content type='html'>Is there any downside or problem potential to change the Java compiler to automatically cast?  In the example below the result of &lt;code&gt;list.get(0)&lt;/code&gt; would automatically be casted to the type of the variable &lt;code&gt;hi&lt;/code&gt;.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;List list = new ArrayList();&lt;br /&gt;list.add("hi");&lt;br /&gt;String hi = list.get(0);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I know that generics allow you to reduce casting but they do so at the expense of making declaration more difficult.  To me, the benefit of generics is that they allow you to have the complier enforce more rules -- not they they reduce casting (but I haven't used them much so I am somewhat uninformed).  This proposal would only reduce the amount of code to type, not move it to another place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-6485287241040445043?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/6485287241040445043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=6485287241040445043&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6485287241040445043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/6485287241040445043'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/01/automatic-casting.html' title='Automatic casting'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-3456273417108352684</id><published>2007-01-16T20:00:00.000-06:00</published><updated>2007-01-16T20:05:01.764-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cvs'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Who has changed the most lines in cvs?</title><content type='html'>The following was done on a Windows machine with &lt;a href="http://sourceforge.net/projects/unxutils/"&gt;UnxUtils&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cvs annotate &gt; annotate.txt&lt;br /&gt;rem remove the portion before the name&lt;br /&gt;sed "s/^[0-9. (]*//" annotate.txt &gt; annotate2.txt&lt;br /&gt;rem remove the portion after the name&lt;br /&gt;sed "s/[ ].*$//" annotate2.txt &gt; annotate3.txt&lt;br /&gt;sort annotate3.txt &gt; annotate4.txt&lt;br /&gt;uniq -c annotate4.txt &gt; annotate5.txt&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-3456273417108352684?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/3456273417108352684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=3456273417108352684&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3456273417108352684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/3456273417108352684'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/01/who-has-changed-most-lines-in-cvs.html' title='Who has changed the most lines in cvs?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-116887444834268207</id><published>2007-01-15T09:08:00.000-06:00</published><updated>2007-01-15T09:20:48.366-06:00</updated><title type='text'>Tip: Need to communicate between anonymous inner classes?</title><content type='html'>Here is a quick tip:&lt;br /&gt;Do you have two anonymous inner classes that need to communicate?  I had two anonymous inner  classes that implemented Runnable and needed to communicate with a boolean value.  Therefore I decided to make a boolean variable in the declaring method but in order for the inner class to access the variable it needs to be declared final.  But that would prevent me from changing the variable!  I needed a mutable Boolean.  Instead of creating a MutableBoolean class I declared the variable as "&lt;code&gt;final boolean[] done = new boolean[]{false};&lt;/code&gt;" so that one thread could call "&lt;code&gt;done[0] = true;&lt;/code&gt;" and the other thread could check "&lt;code&gt;if(!done[0])&lt;/code&gt;".  If there is a better pattern for this please tell me.&lt;br /&gt;&lt;br /&gt;Background of why I needed this:&lt;br /&gt;In an applet, I was saving data back to the server.  In order to keep the UI responsive I of course do that in a separate Thread from the Event Distpatch Thread.  When I save the data I first send then data and then read the response so the user only really needs to wait for the data to be sent.  Therefore I have a timer that tells the user that they don't need to continue waiting after they have waited 30 seconds.  But I don't need to pop that if the response is already read so I needed a way for the reader thread to tell the timer message Runnable that it was already done.  I actually found a better solution: The reader thread can call stop on the Timer so that it is never run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-116887444834268207?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/116887444834268207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=116887444834268207&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116887444834268207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116887444834268207'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2007/01/tip-need-to-communicate-between.html' title='Tip: Need to communicate between anonymous inner classes?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-116412938124222179</id><published>2006-11-21T11:13:00.000-06:00</published><updated>2006-11-21T11:16:21.253-06:00</updated><title type='text'>Google Desktop had to be removed</title><content type='html'>Since my last post on Google Desktop I had 3 problems with it:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/Google-Desktop_Something-Broken/browse_thread/thread/ef0a5da1ed85ff9d/27656520266849d5#27656520266849d5"&gt;&lt;span class="fontsize5"&gt;Paused indexing prevents rename of directories&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/Google-Desktop_Something-Broken/browse_thread/thread/3fedd6b893472e98/c29793fc8a9d498d#c29793fc8a9d498d"&gt;&lt;span class="fontsize5"&gt;Google Desktop appears to hang computer then using Remote Desktop (Terminal services)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fontsize5"&gt;IT required that I remove it because of security issues.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;:-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-116412938124222179?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/116412938124222179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=116412938124222179&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116412938124222179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116412938124222179'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/11/google-desktop-had-to-be-removed.html' title='Google Desktop had to be removed'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-116249136754111281</id><published>2006-11-02T12:01:00.000-06:00</published><updated>2006-11-02T12:16:07.596-06:00</updated><title type='text'>Search and replace across files</title><content type='html'>Some of my co-workers had their cvs login name changed so we had the problem where every directory checked out from cvs had a CVS subdirectory with a Root file in it that had the old username.  The easy way was to delete all checkouts and checkout again but if that would cause the loss of data we needed a different solution.&lt;br /&gt;&lt;br /&gt;I handled my machine by doing a Windows search for all Root files, adding them to a new project in&lt;a href="http://sourceinsight.com/"&gt; Source Insight&lt;/a&gt;, then doing a search and replace but others don't have nice editors like that.  My machine had over 10,000 Root files so manual processes were out of the question.&lt;br /&gt;&lt;br /&gt;For those without a nice editor that can do a replace across files I came up with the following solution:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install &lt;a href="http://unxutils.sourceforge.net/"&gt;UnxUtils&lt;/a&gt; and add the main directory to the path.&lt;/li&gt;&lt;li&gt;Run: &lt;p&gt;&lt;code&gt;find . -name Root -print | sed "s/.*/copy &amp; &amp;amp;.new \&amp;\&amp;amp; sed  \"s\/jstauffer\/jstauffe\/\" &amp;.new &gt; &amp;amp; \&amp;\&amp;amp;amp;amp;amp;amp; del &amp;.new/"  &gt; Root.bat&lt;/code&gt;&lt;/p&gt; Windows has find so I had to make sure that it used the correct find.  Basically it finds all Root files, creates a command to copy that file, use sed to do the replace back to the original file, and delete the copy of the file.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run &lt;code&gt;Root.bat&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;I know the same could have been achieved in Perl or even Java but is there anything else that would be as quick and easy (granted it isn't easy to understand)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-116249136754111281?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/116249136754111281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=116249136754111281&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116249136754111281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116249136754111281'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/11/search-and-replace-across-files.html' title='Search and replace across files'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-116109925596871530</id><published>2006-10-17T10:18:00.000-05:00</published><updated>2006-10-17T10:34:16.056-05:00</updated><title type='text'>Dragging in UI and finishing with a quick movement</title><content type='html'>When the user drags an item to a location, slows movement, and then makes a quick movement right before finishing the drag, the user probably wanted the ending location to be the mouse location right before the quick movement.  The user should be prompted for which target they want if the quick movement changed the target.  With normal mice there probably isn't often a quick movement but I use a pen (an old version of the &lt;span class="mainHdr"&gt;&lt;a href="http://www.wacom.com/productinfo/6x8.cfm"&gt;Intuos 6x8&lt;/a&gt;)&lt;/span&gt; for ergonomic reasons and I often have a quick movement as I let go of the button on the pen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-116109925596871530?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/116109925596871530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=116109925596871530&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116109925596871530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116109925596871530'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/10/dragging-in-ui-and-finishing-with.html' title='Dragging in UI and finishing with a quick movement'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-116015172708349768</id><published>2006-10-06T11:03:00.000-05:00</published><updated>2006-10-06T11:22:07.136-05:00</updated><title type='text'>Google Desktop Rocks!</title><content type='html'>I was developing a new feature and needed to add a new column to the database.  I didn't remember the exact syntax so I went to look for a sample on my computer.  A few weeks ago I had installed &lt;a href="http://desktop.google.com/"&gt;Google Desktop&lt;/a&gt; (because I had done some searching using Windows search that took an hour!) so I thought I would give that a try.  I knew the command started with &lt;code&gt;alter table&lt;/code&gt; so I first typed that into the search.  In less than a second it gave 6 results but the first result wasn't useful.  So I added quotes around the search words and an instant later it showed 6 results and the first result was exactly what I wanted!  I was quite surprised by how fast and easy that was!  I even had to show it to my co-worker LaMoine.&lt;br /&gt;Just for comparison we went through the steps of doing it the old way.  I knew there was probably an example in a specific directory (5 levels deep) so I clicked on the button for Windows Explorer in the task bar and did 5 clicks to get to that directory.  I then did  a search for the same term (without the quotes) and it gave the same file as the first result.&lt;br /&gt;It took over 25 seconds compared to under 10 seconds for Google Desktop!  That savings in time would be significant in keeping me "in the zone" except that I was so surprised by how good it was that I had to show LaMoine and write this blog entry.  Anyway the next time I have to search for something on my computer (when not in an editor) I will be using Google Desktop! (I have no ties to Google -- I am just a satisfied customer).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-116015172708349768?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/116015172708349768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=116015172708349768&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116015172708349768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/116015172708349768'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/10/google-desktop-rocks.html' title='Google Desktop Rocks!'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-115773222692364143</id><published>2006-09-08T11:02:00.000-05:00</published><updated>2006-09-08T11:23:32.933-05:00</updated><title type='text'>Why I like my job</title><content type='html'>Here are a few reasons (off of the top of my head) why I like my job:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Telecommuting one day per week (I wish I could do that more.)&lt;/li&gt;&lt;li&gt;Being a  "guru" on a product.&lt;/li&gt;&lt;li&gt;Good team that  is smart and willing to do any task to help.&lt;/li&gt;&lt;li&gt;Good compensation&lt;/li&gt;&lt;li&gt;5 weeks of vacation&lt;/li&gt;&lt;li&gt;Minimal office politics&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.spscommerce.com/"&gt;The company&lt;/a&gt; is profitable and growing quickly&lt;/li&gt;&lt;li&gt;The company is the biggest company in our area (or so they tell us :-) ).&lt;/li&gt;&lt;li&gt;We use a language that I like (Java if you couldn't guess :-) )&lt;/li&gt;&lt;li&gt;We use 3rd party libraries where appropriate.&lt;/li&gt;&lt;li&gt;Few meetings and very few useless meetings&lt;/li&gt;&lt;li&gt;We attempt to use best practices and improve things as much as possible while still balancing business needs (like creating new features for users).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For reference my title is Sr. Software Engineer and the products on which I work are web-based using J2EE.&lt;br /&gt;&lt;br /&gt;My employer: "SPS Commerce is the &lt;a href="http://www.spscommerce.com/n_co/about_us.shtml"&gt;leader in hosted Electronic Data Interchange (EDI) &lt;/a&gt;software. We offer a rapid, turn-key service to connect suppliers with their retail and distributor customers using tested and proven EDI connections and integration services."&lt;br /&gt;&lt;br /&gt;I like my job so well that pretty much the only reason that I would be willing to switch would be if I could telecommute more and still have most of the things above.&lt;br /&gt;&lt;br /&gt;What do you like about your job and what would it take for you to move to another job?  The harder it be for another company to lure you the better you probably like your job!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-115773222692364143?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/115773222692364143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=115773222692364143&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115773222692364143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115773222692364143'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/09/why-i-like-my-job.html' title='Why I like my job'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-115695782190109460</id><published>2006-08-30T11:58:00.000-05:00</published><updated>2006-08-30T12:10:21.996-05:00</updated><title type='text'>How do you make money with open-source software?</title><content type='html'>&lt;span style="font-size:130%;"&gt;You don't, you save money!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Some companies do make money but many more companies could save money).  More companies are concerned with using software than selling software.  If users of software fund the open-source development of software then it will make economic sense for the software to be developed open-source.&lt;br /&gt;If 50% of companies that buy commerical database systems instead used an open-source database and spent 25% of the savings promoting and advancing that open-source database then it would all work out well.&lt;br /&gt;The one difficulty is getting the software customers organized to do this.  It really helps if someone can jump start the project so that other companies can see the value.&lt;br /&gt;&lt;br /&gt;Would you rather spend $100 for for Windows XP or get &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; and spend $25 supporting it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-115695782190109460?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/115695782190109460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=115695782190109460&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115695782190109460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115695782190109460'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/08/how-do-you-make-money-with-open-source.html' title='How do you make money with open-source software?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-115383147365332792</id><published>2006-07-25T07:41:00.000-05:00</published><updated>2006-07-25T07:44:33.680-05:00</updated><title type='text'>Definitions: Always and Never</title><content type='html'>&lt;p&gt;Definitions:&lt;/p&gt;&lt;p&gt;Always – At least 10% of the time.&lt;/p&gt;&lt;p&gt;Never – Less than 90% of the time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-115383147365332792?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/115383147365332792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=115383147365332792&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115383147365332792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/115383147365332792'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/07/definitions-always-and-never.html' title='Definitions: Always and Never'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-114443933626524858</id><published>2006-04-07T14:42:00.000-05:00</published><updated>2006-04-07T14:48:56.283-05:00</updated><title type='text'>Iterating</title><content type='html'>I often see code like:&lt;br /&gt;&lt;pre&gt;Iterator i = list.iterator();&lt;br /&gt;while(i.hasNext()) {&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;but I write that (when Java 1.5 isn't available) as:&lt;br /&gt;&lt;pre&gt;for(Iterator i = list.iterator();i.hasNext();) {&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;because&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It shorter&lt;br /&gt;&lt;li&gt;It keeps &lt;i&gt;i&lt;/i&gt; in a smaller scope&lt;br /&gt;&lt;li&gt;It reduces the chance of confusion. (Is &lt;i&gt;i&lt;/i&gt; used outside the while?  Where is &lt;i&gt;i&lt;/i&gt; declared?)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I think code should be as simple to understand as possible so that I only have to make complex code to do complex things.  What do you think?  Which is better?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-114443933626524858?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/114443933626524858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=114443933626524858&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114443933626524858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114443933626524858'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/04/iterating.html' title='Iterating'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-114193226729074052</id><published>2006-03-09T13:13:00.000-06:00</published><updated>2006-03-09T13:24:27.303-06:00</updated><title type='text'>Sorting algorithms</title><content type='html'>&lt;a href="http://www.cs.rit.edu/~atk/Java/Sorting/sorting.html"&gt;&lt;br /&gt;http://www.cs.rit.edu/~atk/Java/Sorting/sorting.html&lt;/a&gt; shows four sorting algorithms and animations for each.  It shows Bubble, Quick, Odd-Even Transposition, and Shear sorts.  The last two are multi-processor sorts so I have 2 questions:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Could Bubble and Quick sort be changed to multi-processor sorts?  It seems that Quick Sort could be.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;How would they compare in time to the other multi-processor sorts?  It would be especially interesting how Quick Sort would compare.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-114193226729074052?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/114193226729074052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=114193226729074052&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114193226729074052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114193226729074052'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/03/sorting-algorithms.html' title='Sorting algorithms'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-114123166700163694</id><published>2006-03-01T10:34:00.000-06:00</published><updated>2006-03-01T10:47:47.016-06:00</updated><title type='text'>Don't return in a finally clause</title><content type='html'>The code below actually prints "yikes!"&lt;br /&gt;If you return in a finally block then any Throwables that aren't caught (in a catch block that is part of the same try statement as the finally block) will be completely lost.  The really bad part about this is that it looks so innocent.  I can think of no reason to return in a finally clause.  If nothing else, catch Throwable and return in that so it is obvious what is happening.  Note this also applies to other things that transfer control (continue, throw, etc).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    try {&lt;br /&gt;      doSomething();&lt;br /&gt;      System.out.println("yikes! don't program like this!");&lt;br /&gt;    } catch (RuntimeException e) {&lt;br /&gt;      System.out.println("got it.");&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public static void doSomething() {&lt;br /&gt;    try {&lt;br /&gt;      //Normally you would have code that doesn't explicitly appear &lt;br /&gt;      //to throw exceptions so it would be harder to see the problem.&lt;br /&gt;      throw new RuntimeException();&lt;br /&gt;    } finally {&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-114123166700163694?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/114123166700163694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=114123166700163694&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114123166700163694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/114123166700163694'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html' title='Don&apos;t return in a finally clause'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-113137450176056967</id><published>2005-11-07T07:34:00.000-06:00</published><updated>2005-11-07T08:41:41.780-06:00</updated><title type='text'>Strong vs. weak typing</title><content type='html'>I like strong typing but don't like weak typing because I would rather that the compiler find my bugs.  A point in the middle is type inference.&lt;br /&gt;&lt;a href="http://beust.com/weblog/archives/000333.html"&gt;&lt;br /&gt;http://beust.com/weblog/archives/000333.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A co-worker pointed out that some languages allow a variable to be declared as strong or weak and that sounds like it would be the best of both worlds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-113137450176056967?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/113137450176056967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=113137450176056967&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113137450176056967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113137450176056967'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/11/strong-vs-weak-typing.html' title='Strong vs. weak typing'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-113078270231904024</id><published>2005-10-31T12:15:00.000-06:00</published><updated>2005-10-31T12:18:22.336-06:00</updated><title type='text'>Synergy: Share keyboard and mouse between computers</title><content type='html'>I just learned about Synergy which is a software KVM (without the "V") and it looks pretty slick.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://synergy2.sourceforge.net/about.html"&gt;http://synergy2.sourceforge.net/about.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-113078270231904024?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/113078270231904024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=113078270231904024&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113078270231904024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113078270231904024'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/10/synergy-share-keyboard-and-mouse.html' title='Synergy: Share keyboard and mouse between computers'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-113044263245371866</id><published>2005-10-27T14:49:00.000-05:00</published><updated>2005-10-27T14:50:32.463-05:00</updated><title type='text'>Good programmer vs. knowing a programming language</title><content type='html'>From &lt;a href="http://weblogs.java.net/blog/flozano/archive/2005/10/what_makes_prog.html"&gt;http://weblogs.java.net/blog/flozano/archive/2005/10/what_makes_prog.html&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;It's just like giving a good programmer a course of drawing software. He may learn all about using the software, but he won't be able to create nice, pleasant figures. You need a different skill set to create graphics than to create software. &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-113044263245371866?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/113044263245371866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=113044263245371866&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113044263245371866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/113044263245371866'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/10/good-programmer-vs-knowing-programming.html' title='Good programmer vs. knowing a programming language'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-112852501953451371</id><published>2005-10-05T09:38:00.000-05:00</published><updated>2005-10-05T10:10:19.553-05:00</updated><title type='text'>Declaring variables</title><content type='html'>A pet peeve of mine is when a variable is declared way before it is needed.  It is much easier to understand a piece of code if a variable is declared just before it is needed.  That immediately tells me that it isn't used anywhere before that or in any wider scope.&lt;br /&gt;&lt;br /&gt;I also find it annoying when a variable is declared with a null value and them immediately assigned a value.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;String value = null;&lt;br /&gt;value = "hi";&lt;/code&gt;&lt;br /&gt;should be:&lt;br /&gt;&lt;code&gt;String value = "hi";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Not that one reason to do that the first way is if the second way would create a line that is too long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-112852501953451371?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/112852501953451371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=112852501953451371&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112852501953451371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112852501953451371'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/10/declaring-variables.html' title='Declaring variables'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-112440367652079763</id><published>2005-08-18T17:17:00.000-05:00</published><updated>2005-08-18T17:21:16.526-05:00</updated><title type='text'>IncompatibleClassChangeError</title><content type='html'>I just delivered a patch to SQA and got a IncompatibleClassChangeError.  The javadoc description doesn't help much.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Thrown when an incompatible class change has occurred to some class definition. The definition of some class, on which the currently executing method depends, has since changed.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I looked at the line of code that had the error and went on a hunch.  In my case a class used a variable in a super-class and I had changed that variable from static to instance.  Therefore the class file in the patch was trying to access it as an instance variable but the old super-class still had it as a static variable.  I changed the patch class to not use that variable and sent it back to SQA.  Hopefully that fixes it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-112440367652079763?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/112440367652079763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=112440367652079763&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112440367652079763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112440367652079763'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/08/incompatibleclasschangeerror.html' title='IncompatibleClassChangeError'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-112385116280045721</id><published>2005-08-12T07:51:00.000-05:00</published><updated>2005-08-12T07:52:42.806-05:00</updated><title type='text'>Finding the file for a class</title><content type='html'>From &lt;a href="http://java.sys-con.com/read/117751_2.htm"&gt;http://java.sys-con.com/read/117751_2.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Classpath Problems&lt;br /&gt;Another class of problems are classpath issues. There are times when you are not sure if there is another version of a class in the classpath that is getting picked up before yours, usually a result of a bad environment setup. To eliminate this possibility, a simple check is to add a print statement to see if your new code gets picked up. If it isn't getting picked up, you need to locate the other class that is getting picked up. One neat API in Java that allows you to locate where a class is being picked up is: &lt;br /&gt;&lt;br /&gt;Class.getProtectionDomain().getCodeSource().getLocation() &lt;br /&gt;&lt;br /&gt;In most cases, depending on the class loader being used, you'll get the location of the class that is being executed and you can correct your environment setup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-112385116280045721?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/112385116280045721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=112385116280045721&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112385116280045721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112385116280045721'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/08/finding-file-for-class.html' title='Finding the file for a class'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-112238261389379632</id><published>2005-07-26T07:56:00.000-05:00</published><updated>2005-07-26T07:56:53.896-05:00</updated><title type='text'>"Java" article?</title><content type='html'>Does this article/press release make any sense for a "Java" magazine?&lt;br /&gt;&lt;a href="http://java.sys-con.com/read/112734.htm"&gt;http://java.sys-con.com/read/112734.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-112238261389379632?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/112238261389379632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=112238261389379632&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112238261389379632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/112238261389379632'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/07/java-article.html' title='&quot;Java&quot; article?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111660747899203722</id><published>2005-05-20T11:39:00.000-05:00</published><updated>2005-05-20T11:44:38.996-05:00</updated><title type='text'>GUI designers take note: Selecting by first letter should show as many as possible that start with that letter</title><content type='html'>When I am in a list and I press a letter to jump to the first entry that starts with that letter why does it leave that entry on the bottom of the visible entries?  It should make the entry the top visable entry so that many entries that start with that letter can be seen.&lt;br /&gt;&lt;br /&gt;In more concrete terms if I am selecting a state from a drop-down list and press "w" it should make "Washington" visible at the top instead of the bottom so that I can see Wisconsin without scrolling.&lt;br /&gt;&lt;br /&gt;This is just my little pet peeve of the day. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111660747899203722?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111660747899203722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111660747899203722&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111660747899203722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111660747899203722'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/05/gui-designers-take-note-selecting-by.html' title='GUI designers take note: Selecting by first letter should show as many as possible that start with that letter'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111660524276218245</id><published>2005-05-20T10:53:00.000-05:00</published><updated>2005-05-20T11:07:38.290-05:00</updated><title type='text'>Sometimes old solutions work best</title><content type='html'>I have a 4.8 MB file where I needed to do a replace that would happen about 850,000 times.  I tried it in a few different editors:&lt;UL&gt;&lt;br /&gt;&lt;li&gt;Notepad: It looked like it was taking 3 seconds per replace so I killed that.  I don't have the time to wait a month!&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.sourceinsight.com/"&gt;Source Insight&lt;/a&gt; (My preferred code editor): It partially suceeded in a few minutes but it ended up corrupting the output since it "ran out of undo space".  Time to ask my co-workers...&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt;: After running for at least 15 minutes I killed it.&lt;br /&gt;&lt;li&gt;&lt;a href="http://textpad.com/"&gt;TextPad&lt;/a&gt;: After running for at least 10 minutes I killed it.&lt;br /&gt;&lt;li&gt;&lt;a href="http://sed.sourceforge.net/sedfaq3.html#s3.2"&gt;sed&lt;/a&gt;: 10 seconds!&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;BTW my machine is a hyperthreaded P4 3.06 GHz with 1 GB of RAM with a serial HD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111660524276218245?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111660524276218245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111660524276218245&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111660524276218245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111660524276218245'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/05/sometimes-old-solutions-work-best.html' title='Sometimes old solutions work best'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111391642847082115</id><published>2005-04-19T08:10:00.000-05:00</published><updated>2005-04-19T08:13:48.470-05:00</updated><title type='text'>Case of static method names</title><content type='html'>I like to make my static method names start with an upper case letter.  I know that isn't standard and that only class names are supposed to start with an upper case letter but I find that it is helpful because it quickly shows which methods are static.  Also, I have never confused a static method with a class because the usage is different.  Does this sound beneficial?&lt;br /&gt;&lt;br /&gt;(I don't know from where I got this idea but at one time I assumed it was a standard.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111391642847082115?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111391642847082115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111391642847082115&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111391642847082115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111391642847082115'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/case-of-static-method-names.html' title='Case of static method names'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111298933817636808</id><published>2005-04-08T14:35:00.000-05:00</published><updated>2005-04-08T14:42:18.176-05:00</updated><title type='text'>Developer Documentation</title><content type='html'>Have you ever gotten a product and you could obviously tell that the person who wrote the manual didn't speak English natively?&lt;br /&gt;From my little knowledge of languages it seems that it works better for people to translate into their native language.&lt;br /&gt;&lt;br /&gt;I think the same principles applies to developers translating from code to documentation.  I would prefer to explain how a product works to a user and have the user write the documentation because they will cover things that seem obvious to me but not the average user.&lt;br /&gt;Someone not intimately familiar with the product will probably write much better documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111298933817636808?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111298933817636808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111298933817636808&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111298933817636808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111298933817636808'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/developer-documentation.html' title='Developer Documentation'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111298291223941418</id><published>2005-04-08T12:39:00.000-05:00</published><updated>2005-04-08T12:55:12.240-05:00</updated><title type='text'>Finding duplicate code</title><content type='html'>I noticed some duplicate code in a program that I help maintain and thought "wouldn't it be nice to have a tool that found duplicate lines of code?"&lt;br /&gt;After a quick chat with a co-worker we decided that we could make something that read in every source line, trimmed it, created a hash and added that hash to a List for that file.  Also add that hash to a Map with a List of all of the files and lines where that hash occurs.  When all files are read go through all lines with the same hash (from the Map) and look at the next lines to find if those hashes match.  It wasn't a perfect design but it would probably work well enough.&lt;br /&gt;Before I went any further I decided to check Google and low and behold I found PMD &lt;a href="http://pmd.sourceforge.net/cpd.html"&gt;http://pmd.sourceforge.net/cpd.html&lt;/a&gt;.  It is on its 3rd algorithm and "now it can process the JDK 1.4 java.* packages in about 4 seconds" and "works with Java, C, C++, and PHP code."  I guess there isn't much point in writing my own version. :-) Remember to always do a quick search before coding something new.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111298291223941418?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111298291223941418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111298291223941418&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111298291223941418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111298291223941418'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/finding-duplicate-code.html' title='Finding duplicate code'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111281623946744985</id><published>2005-04-06T14:29:00.000-05:00</published><updated>2005-04-06T14:37:19.466-05:00</updated><title type='text'>Anonymous class constructor</title><content type='html'>Today I was trying to modify an anonymous class to add a parameter to the constructor.  After talking to 3 other co-workers we couldn't decide if it was possible because a constructor has to be named to match the name of the class and an anonymous class does not have a name.  I found the answer at &lt;a href="http://www.developer.com/java/other/article.php/3300881"&gt;http://www.developer.com/java/other/article.php/3300881&lt;/a&gt; under the section titled "Anonymous classes versus local classes."  I am not including the answer here so that you can think about it for a while if you desire.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111281623946744985?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111281623946744985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111281623946744985&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111281623946744985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111281623946744985'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/anonymous-class-constructor.html' title='Anonymous class constructor'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111270883189301990</id><published>2005-04-05T08:47:00.000-05:00</published><updated>2005-04-05T12:46:11.626-05:00</updated><title type='text'>Extra info in stack traces</title><content type='html'>I often find that when I see a stack trace I want to know the value of some variables in that stack. I created a request for enhancement (&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4857236"&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4857236&lt;/a&gt;).&lt;br /&gt;Does that seem useful to you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111270883189301990?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111270883189301990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111270883189301990&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111270883189301990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111270883189301990'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/extra-info-in-stack-traces.html' title='Extra info in stack traces'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111270510158002667</id><published>2005-04-05T07:38:00.000-05:00</published><updated>2005-04-05T07:45:01.580-05:00</updated><title type='text'>What was null?</title><content type='html'>When I get a NullPointerException I usually have to look at the source code to determine what might have been null. Therefore I created a feature request (&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4834738"&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4834738&lt;/a&gt;) to request that NullPointerExceptions include the name of the variable when possible.  Do you think that would be useful?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111270510158002667?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111270510158002667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111270510158002667&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111270510158002667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111270510158002667'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/what-was-null.html' title='What was null?'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111238987240512742</id><published>2005-04-01T15:09:00.000-06:00</published><updated>2005-04-01T15:11:12.406-06:00</updated><title type='text'>del.icio.us Bookmarks</title><content type='html'>I have added most of my computer and programming related bookmarks to &lt;a href="http://del.icio.us/Stauffer"&gt;http://del.icio.us/Stauffer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111238987240512742?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111238987240512742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111238987240512742&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111238987240512742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111238987240512742'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/04/delicious-bookmarks.html' title='del.icio.us Bookmarks'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11811481.post-111223215054010104</id><published>2005-03-30T19:09:00.000-06:00</published><updated>2005-03-30T19:25:07.870-06:00</updated><title type='text'>How not to use JDBC</title><content type='html'>This bad example came from production code. :-)  (DatabaseManager is a wrapper for JDBC and behaves similarly.)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;String select = "select ...";&lt;br /&gt;Result r = null;&lt;br /&gt;List numberList = new ArrayList();&lt;br /&gt;try {&lt;br /&gt;  r = DatabaseManager.ExecuteQuery(select);&lt;br /&gt;  while (r != null) {&lt;br /&gt;      r.next();&lt;br /&gt;      numberList.add(r.getString("col"));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;catch (Exception e) {&lt;br /&gt;  Result.Close(r);//Closes the result while handling null and any IOException.&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A few of the problems with this code:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;DatabaseManager.ExecuteQuery can never return null (but I can let that slide some since a programmer would have to look at the code to know that -- or look at the other 64 examples in code to see that no other code checks for a null return value).&lt;/li&gt;   &lt;li&gt;while(r != null): Knowing nothing about JDBC it should be obvious that r could never change from not null to null.&lt;/li&gt;   &lt;li&gt;while(r.next()) is the standard way to use JDBC.&lt;/li&gt;   &lt;li&gt;This code uses an Exception to get out of the while loop! (Note that I have done something like that once but there was at least a somewhat good reason and it was documented.)&lt;/li&gt;   &lt;li&gt;The result should always be closed in a finally block.&lt;/li&gt; &lt;/ol&gt; So here is the improved code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;String select = "select ...";&lt;br /&gt;Result r = null;&lt;br /&gt;List trackingNumberList = new ArrayList();&lt;br /&gt;try {&lt;br /&gt;  r = DatabaseManager.ExecuteQuery(select);&lt;br /&gt;  while (r.next()) {&lt;br /&gt;      trackingNumberList.add(r.getString("col"));&lt;br /&gt;  }&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;  e.printStackTrace();&lt;br /&gt;  //Logging would be nice but a stack trace to standard error is better than nothing.&lt;br /&gt;} finally {&lt;br /&gt;  Result.Close(r);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11811481-111223215054010104?l=jamesjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesjava.blogspot.com/feeds/111223215054010104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11811481&amp;postID=111223215054010104&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111223215054010104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11811481/posts/default/111223215054010104'/><link rel='alternate' type='text/html' href='http://jamesjava.blogspot.com/2005/03/how-not-to-use-jdbc.html' title='How not to use JDBC'/><author><name>James A. N. Stauffer</name><uri>http://www.blogger.com/profile/02455585046613669065</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
