<?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-7265231704525907886</id><updated>2012-02-16T00:46:00.843-08:00</updated><category term='ant apache target order'/><category term='data modeling'/><category term='wikinomics software ip ideagoras'/><category term='thread safe'/><category term='css'/><category term='java ide battle'/><category term='java'/><category term='mysql'/><category term='MYSQL Workbench 5.0 OSS'/><category term='thread safety'/><category term='java regex tutorial beginners'/><category term='gwt'/><category term='netbeans vs eclipse'/><category term='gwt-ext'/><category term='open source'/><category term='j2ee'/><category term='web.xml'/><category term='play gwt'/><category term='css gwt'/><category term='wikipedia donations'/><title type='text'>Terrance MacGregor</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>99</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1492884441585315151</id><published>2011-11-25T13:28:00.001-08:00</published><updated>2011-11-25T13:36:01.861-08:00</updated><title type='text'>Review of New Relic</title><content type='html'>I just received an overview of NewRelic today. &amp;nbsp;My initial thought is that it looks awesome. If you haven't check out the video, it is worth it. &amp;nbsp; &amp;nbsp;Ref:&amp;nbsp;&lt;a href="http://newrelic.com/why-new-relic/how-it-works"&gt;http://newrelic.com/why-new-relic/how-it-works&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1ZlASrH3G9M/TtAJk55r9vI/AAAAAAAAB88/_m2kgvWHecg/s1600/newRelic.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-1ZlASrH3G9M/TtAJk55r9vI/AAAAAAAAB88/_m2kgvWHecg/s1600/newRelic.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1492884441585315151?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1492884441585315151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1492884441585315151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1492884441585315151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1492884441585315151'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/11/review-of-new-relic.html' title='Review of New Relic'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-1ZlASrH3G9M/TtAJk55r9vI/AAAAAAAAB88/_m2kgvWHecg/s72-c/newRelic.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1056226742762395553</id><published>2011-11-24T18:30:00.001-08:00</published><updated>2011-11-24T18:34:31.609-08:00</updated><title type='text'>Quality Assurance - Quick Read</title><content type='html'>Joel, as much as I don't argue with, wrote 2 articles that I think are great....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 style="background-color: #f5f4df; color: #046380; font-family: Georgia, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The Joel Test: 12 Steps to Better Code&lt;/span&gt;&lt;/h2&gt;&lt;br /&gt;1. &amp;nbsp;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;http://www.joelonsoftware.com/articles/fog0000000043.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 style="background-color: #f5f4df; color: #046380; font-family: Georgia, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Top Five (Wrong) Reasons You Don't Have Testers&lt;/span&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000067.html"&gt;http://www.joelonsoftware.com/articles/fog0000000067.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1056226742762395553?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1056226742762395553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1056226742762395553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1056226742762395553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1056226742762395553'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/11/quality-assurance-quick-read.html' title='Quality Assurance - Quick Read'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7491955686434515691</id><published>2011-11-12T01:05:00.001-08:00</published><updated>2011-11-17T09:27:36.561-08:00</updated><title type='text'>How To Do Work You Don't Want To Do</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-WHOup7Va0f4/Tr44IILQC5I/AAAAAAAAB6U/abNAvmi_9Ag/s1600/coding+horror.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-WHOup7Va0f4/Tr44IILQC5I/AAAAAAAAB6U/abNAvmi_9Ag/s1600/coding+horror.jpg" /&gt;&lt;/a&gt;I was recently given a very complicated task:  installing a highly dependent project in a complex environment ( one of 30 different configurable environments) without VMs or root privledges.   Now, to complicate things, image that you don't have any guidance, not one thing written.   All you have is a poorly documented configuration file known in Maven as the POM, 10 sets of property files, and a git directory.   To make matters even worse if possible, you have never touched this code and you can't write any of it.  You can only compile, build, configure, install, and troubleshoot.   Oh, the developers who wrote the code are in remote offices  and you are installing this complex software in a remote network, without access to the internet.  Number of external services requires for integration = 10+ rest based with encrypted services.     The challenge is daunting.These are the steps that I took to finish:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;1. &lt;b&gt;Procrastinate -&lt;/b&gt;&amp;nbsp;That's right, I said it.   I solved a few other issues knowing that this task was looming. &amp;nbsp;So I am not the only one advocating being lazy, you can read &lt;a href="http://www.entrepreneur.com/article/166054"&gt;this&lt;/a&gt;&amp;nbsp;supporting column. &amp;nbsp; &amp;nbsp; Who knows, maybe someone will cancel the task and you &amp;nbsp;wouldn't have to do it , right?&lt;br /&gt;&lt;br /&gt;2.  &lt;b&gt;Control It &lt;/b&gt; -  Create a teaching aid to teach someone else.  When you teach something, you must learn the material better.  It it only through teaching that you really learn.  I turn to documentation as not only a helper for those that follow, but more as a motivator.    Face it, compiling and configuring someone else's work is  just about the worst job out there.  When you think of the benefits and value you have by building training material, just about any task is bearable.   If you have control, you are going to be much happier.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;3.&amp;nbsp;&lt;b&gt;Acknowledge&amp;nbsp;your Pain&lt;/b&gt; - When doing something very difficult, remind yourself... it is going to suck at first, bad.  Then,  it will get easier.   It always does, provided you have the prerequisite knowledge to complete the task.  If you find yourself without the basic fundamentals in place,  you will always struggle until your foundation is correct.  You are human and this cycle is natural.  I acknowledge the pain by swearing at my computer some times, if you choose this option, make sure you do it quietly. :- )&lt;br /&gt;&lt;br /&gt;&amp;nbsp;4. &lt;b&gt;Don't give up&lt;/b&gt; - work through the pain and don't give up.   Grab a coworker and talk through a problem you are having.  Even if  they don't know how to solve it, it can feel better or help you work through something.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;5. &lt;b&gt;Celebrate&lt;/b&gt; - By now, maybe is it 1 day or 5 days later, you will have solved the problem and become that much sharper for it.  Realize that when you can do hard jobs, other people around you will value that skill, even if they don't say it.&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;Do it again -&lt;/b&gt;&amp;nbsp;As soon as possible, volunteer for the same job.   Taking the hard jobs means that you are typically going to grow your skill set.   Even if this boss doesn't realize how valuable these skills are, remember, that one day, you will find someone who does appreciate them.&lt;br /&gt;&lt;br /&gt;7.  &lt;b&gt;Expand Your Influence &lt;/b&gt;- If you can influence the work so that it is easier to do, then that is even better.Train a coworker - grab someone and help them through the steps that you just completed.Take the time to work with the remote developers building your code to make the task easier to complete.   Your customer will thank you for it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7491955686434515691?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7491955686434515691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7491955686434515691' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7491955686434515691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7491955686434515691'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/11/how-to-do-work-you-dont-want-to-do.html' title='How To Do Work You Don&apos;t Want To Do'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WHOup7Va0f4/Tr44IILQC5I/AAAAAAAAB6U/abNAvmi_9Ag/s72-c/coding+horror.jpg' height='72' width='72'/><thr:total>2</thr:total><georss:featurename>Hampstead, MD 21074, USA</georss:featurename><georss:point>39.6048253 -76.8499774</georss:point><georss:box>39.5803578 -76.8894594 39.6292928 -76.8104954</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2481128504315075746</id><published>2011-10-31T11:52:00.000-07:00</published><updated>2011-10-31T11:53:10.716-07:00</updated><title type='text'>The Man In The Arena</title><content type='html'>&lt;div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium; "&gt;&lt;span id="internal-source-marker_0.5047709529753774" style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;Often quoted during plebe summer in 1996, one of the greatest quotes that I have ever read and appropriate as ever.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;"It is not the critic who counts, nor the man who points out how the strong man stumbled, or where the doer of deeds could have done them better. The credit belongs to the man who is actually in the arena; whose face is marred by dust and sweat and blood; who strives valiantly; who errs and comes short again and again; who knows the great enthusiasms, the great devotions, and spends himself in a worthy cause; Who, at the best, knows in the end the triumph of high achievement; and who, at the worst, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who know neither victory nor defeat."&lt;/span&gt;&lt;br /&gt;&lt;p dir="ltr" style="text-align: right; margin-top: 0pt; margin-bottom: 0pt; "&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;~President Theodore Roosevelt&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="text-align: right; margin-top: 0pt; margin-bottom: 0pt; "&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;Speech at the Sorbonne&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="text-align: right; margin-top: 0pt; margin-bottom: 0pt; "&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;Paris, France&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="text-align: right; margin-top: 0pt; margin-bottom: 0pt; "&gt;&lt;span style="font-size: 11pt; font-family: Arial; color: rgb(0, 0, 0); background-color: transparent; font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; "&gt;April 23, 1910&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2481128504315075746?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2481128504315075746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2481128504315075746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2481128504315075746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2481128504315075746'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/10/man-in-arena.html' title='The Man In The Arena'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-541408455616858354</id><published>2011-10-04T19:36:00.000-07:00</published><updated>2011-11-23T19:38:28.582-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia donations'/><title type='text'>Donating To Wikipedia</title><content type='html'>&lt;a href="https://wikimediafoundation.org/wiki/Support_Wikipedia/en" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="Support Wikipedia" border="0" src="//upload.wikimedia.org/wikipedia/commons/2/26/Fundraising_2009-square-thanks-en.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I donated to Wikipedia for the first time. &amp;nbsp;I love the service, love the mission, and use it almost everyday. &amp;nbsp;The site gives me hope in humanity. &amp;nbsp;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-541408455616858354?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/541408455616858354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=541408455616858354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/541408455616858354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/541408455616858354'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/10/donating-to-wikipedia.html' title='Donating To Wikipedia'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>Hampstead, MD 21074, USA</georss:featurename><georss:point>39.6048253 -76.8499774</georss:point><georss:box>39.5803578 -76.8894594 39.6292928 -76.8104954</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-513730125365693716</id><published>2011-09-04T06:35:00.002-07:00</published><updated>2011-11-23T20:13:21.387-08:00</updated><title type='text'>7 questions to ask before taking on a new software client</title><content type='html'>&lt;div&gt;This article is geared towards a small services company or freelancer  that is looking to build software for clients.  There are probably many more questions that you should ask, but these seems to be the most important.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1.  &lt;b&gt;Can you make a profit? &lt;/b&gt; If you cannot make enough money on a project,  you will not be able to earn enough to live (bad) or save enough to get you through the rough patches (really bad).    Having cash reserves is the only way to survive the time gaps in between work for you or your developers.  Managing an efficient bench of developers is perhaps the most difficult tasks in software services.  Having money is the only way to do this.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2.  &lt;b&gt;What is your client's experience level?&lt;/b&gt;  If you are dealing with a client who is new to software development and the bumps that happen along the way, then you will need to spend some extra time with them to educate them and get them comfortable with the process.  It is important to size them up appropriately.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3.  &lt;b&gt;Is the work doable with the budget?&lt;/b&gt;  When a client asks how much their custom software costs to develop,  my first reaction is to cringe.  It is difficult to determine as many times the client is thinking of behavior they expect to have without communicating it effectively.  As you already know, software is expensive.   It is very important that you set expectations clearly.  This is tricky because you want to secure the work, but you must be honest.  If the customer does not want to do work with you because you are telling them something that they don't want to hear, you are much better off not taking them on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4.  &lt;b&gt;What benefits are there other than money for the work?&lt;/b&gt;  Can you gain some useful experience from a project?  Is the technology something that you want to work in?  Can you use this client as a valuable resource?  Is the network of people they are connected to valuable?  There are some basic questions here that you should think about.  Beware however, clients could potentially over inflate their social value in order to obtain a better deal from you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;5.  &lt;b&gt;Do you have the time and resources to serve them?&lt;/b&gt;  You must think very carefully about this.  Software development is all about pipeline management.  If you overextend yourself, your client and ultimately you, will pay the price.   If you take on a high value client and cannot serve them, then the damage could be catastrophic.  Taking on less work will lead you to a higher quality product, happier clients, and less money in the short run. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. &lt;b&gt;Can you say no?&lt;/b&gt;  If you cannot say no to a software project, then you should not be doing the software project.  Backing yourself into a corner means that you are less likely to use good judgement.  Having the power and ability to say no is critical.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7.  &lt;b&gt;Did you read the Prisoner's Dilemma for software development?&lt;/b&gt;  If you haven't read &lt;a href="http://www.spectacle.org/995/sw.html"&gt;this&lt;/a&gt; and you are working for clients, you are missing out big time.  This article should be required reading for all freelancers.   The summary is that you must be able to stop work if a client isn't paying.   If you don't, you will get burned. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks for reading.  If you have any other questions I should add to this, let me know and I will post them.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-513730125365693716?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/513730125365693716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=513730125365693716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/513730125365693716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/513730125365693716'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/09/software-project-leadership-random.html' title='7 questions to ask before taking on a new software client'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3052058014680568113</id><published>2011-09-04T06:35:00.001-07:00</published><updated>2011-09-04T06:46:12.522-07:00</updated><title type='text'>Software Project Leadership -</title><content type='html'>As a leader, you have 2 switches.  It is on or off.  There is no middle ground or treading water.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you can take a project on and have the bandwidth to lead it, great.  If you don't have the bandwidth, you had better put someone on place who can lead the software project.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What does it take to lead a software project?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Have experience - You need to know what you are talking about&lt;/div&gt;&lt;div&gt;2. Have Top  Cover - Make sure you can make mistakes and push forward.  If you don't have top cover, you are destined for failure.&lt;/div&gt;&lt;div&gt;3. Be smart - change something that isn't working. Don't stick to convention when it isn't serving you.&lt;/div&gt;&lt;div&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/7265231704525907886-3052058014680568113?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3052058014680568113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3052058014680568113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3052058014680568113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3052058014680568113'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/09/software-project-leadership.html' title='Software Project Leadership -'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5685591678745781930</id><published>2011-08-29T14:32:00.000-07:00</published><updated>2011-10-29T23:19:32.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='play gwt'/><title type='text'>The Play Framework - My Most Recent Wow Moment</title><content type='html'>There have been several moments in my technology experience when an advance came along that was so truly ground breaking,  it made me stop in awe and say "wow".&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://1.bp.blogspot.com/-FTNtlwRo2IM/TqzrcnKYcZI/AAAAAAAABzQ/b2skyr3mjmI/s320/Java_Logo.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5669164907734004114" /&gt;&lt;b&gt;1998 Java:&lt;/b&gt; As a computer science major working through the complexities &lt;a href="http://www.usna.edu/CS/cs/scscourses.htm#ic312"&gt;data structures&lt;/a&gt; , I was frustrated with the number of pointer errors and with the poor documentation of the &lt;a href="http://www.cplusplus.com/reference/clibrary/cstdio/"&gt;standard libraries&lt;/a&gt;.   When I a new class being offered on programming languages, found java and was hooked.  Coupled with clean documentation and visual editors, it provided a significant boost to my productivity.  I could actually write code to do useful things.  Wow.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 105px; height: 106px;" src="http://3.bp.blogspot.com/-ZRSf0A3UBpA/TqzoD7KNbGI/AAAAAAAAByg/1Wnn-E_Khsk/s320/hibernate.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5669161185070378082" /&gt;&lt;div&gt;&lt;b&gt;2005 - Object Relational Mapping (ORM) &lt;/b&gt;- One of my first corporate jobs was a write a proprietary software / database application using MySQL and Java.  I remember carefully mapping out all &lt;/div&gt;&lt;div&gt;of my classes and breaking my tables down to 3nd normal form.  When I needed to make changes to the system, I stumbled blindly into all of the issues associated with using a relational database and an object oriented model.  I remember talking to a guy on a train from New York city about my problem.  It was then that I found out about ORM and the vast benefits it provides.  Wow.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/-MBoNu6jYFsA/TqzqLL5TZNI/AAAAAAAABy4/Dw9mm4_jwhE/s320/gwt.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5669163508845208786" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 100px; height: 100px; " /&gt;&lt;div&gt;&lt;b&gt;2007 Google Web Toolkit&lt;/b&gt; - When I started working in software industry, I used many different types of Java based frameworks to include JSPs and struts.  I found them very complicated and inefficient to work in.  In 2007,  I found a web framework that simplified web development, the Google Web Toolkit(GWT).  GWT  is perhaps the most powerful and elegant engineering solutions that I have seen to date. I marveled at its  innovation and simplicity compared to other Java based frameworks.  Coupled with GWT's ability to handle cross browser compilation, it is truly a cutting edge tool. There are downsides with  GWT's  including SEO, but I in general agree with many of these &lt;a href="http://www.quora.com/What-is-programming-on-Google-Web-Toolkit-like"&gt;comments.&lt;/a&gt;    I have seen other frameworks and ran through some basic setups with things like RoR and DJango, but, when it comes to scaling, a compiled language (like Java) is the software that you want to scale with. RoR and Python are excellent frameworks for sure, but they lack of the protections of strongly typed languages and have scaling problems that naturally accompany them. I realize that I greatly glossing over the scaling comment, but if you want to argue, please post on &lt;a href="http://www.quora.com/What-web-languages-are-best-suited-for-mass-scaling-an-application"&gt;quora&lt;/a&gt; instead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/-3ic9WUhB4J8/TqzmNRBe-mI/AAAAAAAABx8/Tu27GeHOhtU/s200/droid.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5669159146534926946" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 100px; height: 100px; " /&gt;&lt;div&gt;&lt;b&gt;2009 Android&lt;/b&gt; - The sheer capabilities of the smartphone are still mind blowing.  We have not even begun to see the full capabilities of this advancement.  Writing software for the Android was the most intuitive experience that I have had to date.   It was a truly a "wow" experience.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/-rd2KJ3sYzdY/TqzqopC5NHI/AAAAAAAABzE/JwKnZOlldx8/s320/play-logo.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5669164014886270066" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 130px; height: 100px; " /&gt;&lt;div&gt;&lt;b&gt;2011 Play&lt;/b&gt; - If you have about 20 minutes, I recommend that you download the tool and try it out.  Like RoR, you will be running in no time.   What I found even more amazing, is the toolsets that they have integrated into the backend.  This page is great for showing you how the platform has evolved: ref &lt;a href="http://www.playframework.org/2.0"&gt;http://www.playframework.org/2.0&lt;/a&gt; .   Now, if I had time to dig into this framework for a couple days, I am sure I would shortcomings, but I like what I see so far and look forward to seeing it grow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Looking for the next "wow".&lt;/div&gt;&lt;div&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/7265231704525907886-5685591678745781930?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5685591678745781930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5685591678745781930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5685591678745781930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5685591678745781930'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/10/play-framework-ah-ha-moment.html' title='The Play Framework - My Most Recent Wow Moment'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-FTNtlwRo2IM/TqzrcnKYcZI/AAAAAAAABzQ/b2skyr3mjmI/s72-c/Java_Logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3309514132719340426</id><published>2011-04-28T09:48:00.001-07:00</published><updated>2011-10-30T00:13:32.401-07:00</updated><title type='text'>5 things I love and 3 things I hate about Selenium from a software engineer's perspective</title><content type='html'>&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/-7IsAouK23XI/Tqzs7u3EtAI/AAAAAAAABzc/sLTtdvwmjDo/s320/Selenium-logo.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5669166541888074754" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 100px; height: 100px; " /&gt;&lt;/div&gt;&lt;div&gt;The purpose is to review &lt;a href="http://seleniumhq.org/"&gt;Selenium &lt;/a&gt;from a software engineer's perspective.  I have spent only a short time with this tool, so my views are going to be skewed of course.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;5 Things I love about Selenium&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Ease of Installation- Setting up Selenium takes moments.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Documentation:  There are lots of excellent &lt;a href="http://www.youtube.com/watch?v=JjGkxG_mP7M&amp;amp;feature=related"&gt;You-Tube videos&lt;/a&gt; that explain how to use Selenium for basic cases.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. It makes it easy to quickly build a test case to solve a critical UI path.  These sorts of test are excellent for "smoke testing" an application in a continuous integration environment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;4. File Based Test Cases:  I can check tests into a repository and share them with others.  This allows tests to be incorporated into your build system to include specific branches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;5. Automates testing the UI - Duh.  This is pretty obvious,  but it is a great thing to spend fewer resources.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What I hate about Selenium&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;1. Tests are frail.  The second you change one thing in your UI, you have to change your test.   This could get messy as your tests becomes tightly coupled to your code.  You will need to devote resources to write your tests and ensure that that they are up to speed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. You must get a feel for the application.  If the server, the Selenium test might report a failure when the &lt;/div&gt;&lt;div&gt;application works fine.  You will have to get used to this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. It is very difficult at times to understand why tests fail.  Some other examples of complaints (and solutions) about Selenium can be found &lt;a href="http://googletesting.blogspot.com/2009/06/my-selenium-tests-arent-stable.html"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is clear that Selenium is not a silver bullet.  You still must visually inspect pages for expected outcomes.  There is a clear case for pulling up a check off list and going through each browser.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3309514132719340426?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3309514132719340426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3309514132719340426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3309514132719340426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3309514132719340426'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/04/5-things-i-love-and-hate-about-selenium.html' title='5 things I love and 3 things I hate about Selenium from a software engineer&apos;s perspective'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-7IsAouK23XI/Tqzs7u3EtAI/AAAAAAAABzc/sLTtdvwmjDo/s72-c/Selenium-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8529622689722645055</id><published>2011-04-01T16:15:00.000-07:00</published><updated>2011-04-01T16:15:38.579-07:00</updated><title type='text'>Getting the Response Headers from an HTTP Connection | Example Depot</title><content type='html'>&lt;a href="http://www.exampledepot.com/egs/java.net/GetHeaders.html"&gt;Getting the Response Headers from an HTTP Connection | Example Depot&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a pretty good site for pulling down response headers.  What i didn't like was that there isn't a cleaner wasn't an example to count the numbers of keys.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It would be much more effective to do something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;for(int i=0;i&lt;connection.getheaderfields().size();i++){&lt; div=""&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;//blah&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setting the properties is key because you can do things like proxy requests.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.innovation.ch/java/HTTPClient/api/HTTPClient/HttpURLConnection.html"&gt;http://www.innovation.ch/java/HTTPClient/api/HTTPClient/HttpURLConnection.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium; "&gt;&lt;pre&gt;con.setRequestProperty("SomeProxyProtocol", ...);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;/connection.getheaderfields().size();i++){&lt;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-8529622689722645055?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.exampledepot.com/egs/java.net/GetHeaders.html' title='Getting the Response Headers from an HTTP Connection | Example Depot'/><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8529622689722645055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8529622689722645055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8529622689722645055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8529622689722645055'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/04/getting-response-headers-from-http.html' title='Getting the Response Headers from an HTTP Connection | Example Depot'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5743285344720678216</id><published>2011-01-08T21:42:00.000-08:00</published><updated>2011-01-08T21:59:34.512-08:00</updated><title type='text'>Some Audio Books I "Read" While Commuting</title><content type='html'>I am cleaning out my closets and getting organized when I ran across some notes from books I have read while commuting.   This is only a sample as I stopped taking notes for some reason. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These are the bits of wisdom that I thought were valid enough jot down.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Book Title:  Do It Now&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Act the first time you read or touch a piece of work.  &lt;/div&gt;&lt;div&gt;Procrastination is the thief of time&lt;/div&gt;&lt;div&gt;Schedule projects that take hours&lt;/div&gt;&lt;div&gt;be clever when completing tasks because work expands to fill time&lt;/div&gt;&lt;div&gt;Things don't have to be perfect.&lt;/div&gt;&lt;div&gt;Work in 90 minute blocks of focused effort&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title: Guns, Germs, and Steel&lt;/b&gt;&lt;/div&gt;&lt;div&gt;circumstances can play a large part in success&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  Inner Ape&lt;/b&gt;&lt;/div&gt;&lt;div&gt;We cannot stray far from our genetic behavior code without suffering&lt;/div&gt;&lt;div&gt;Hierarchies are complex and take a lot of work.  They are always, always in churn&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  Freakanomics&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Data doesn't lie&lt;/div&gt;&lt;div&gt;Kids success is based on their parent's character&lt;/div&gt;&lt;div&gt;People are driven by incentives&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title: Shut up, stop whining and get a life&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Your failures are your own&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  John Stossle's Give Me A Break&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Question things like "organic food is better for you than non-organic food."&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  Search For Mankind&lt;/b&gt;&lt;/div&gt;&lt;div&gt;There have been many strains of people in the world before humans reached present state.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  Kid Magic 1,2,3&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Don't get mad at kids, stay calm&lt;/div&gt;&lt;div&gt;Keep a timer to motivate kids&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title:  Fear book ? (Title Doesn't sound right)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Millions of years have built a powerful intuition system, listen to it and process the fear in your head.&lt;/div&gt;&lt;div&gt;Don't fear things and worry about them since much of that time is wasted&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Title: Great Secret&lt;/b&gt;&lt;/div&gt;&lt;div&gt;See the world as it should be&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Title:  The perfect mile&lt;/div&gt;&lt;div&gt;Set goals&lt;/div&gt;&lt;div&gt;work everyday&lt;/div&gt;&lt;div&gt;listen to yourself&lt;/div&gt;&lt;div&gt;expect lots of failure&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Too Little, Too Late: &lt;/div&gt;&lt;div&gt;Actions speak, not words&lt;/div&gt;&lt;div&gt;Stay away from people that do harm&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Title:  8 Things For Successful Businesses to do (Title clearly isn't right)&lt;/div&gt;&lt;div&gt;Successes take time&lt;/div&gt;&lt;div&gt;Evaluate people carefully, frmo all angles,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Title: Your Management Sucks&lt;/div&gt;&lt;div&gt;Be at war with yourself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-5743285344720678216?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5743285344720678216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5743285344720678216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5743285344720678216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5743285344720678216'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/01/some-audio-books-i-read-while-commuting.html' title='Some Audio Books I &quot;Read&quot; While Commuting'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8081867088579809241</id><published>2011-01-07T20:53:00.000-08:00</published><updated>2011-01-07T21:55:24.999-08:00</updated><title type='text'>Comcast's Bandwidth Throttling Done Poorly</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Bandwidth Throttling&lt;/span&gt;&lt;/b&gt; - I have not written a blog posting in a long time, but the good folks at Comcast have forced my hand :-) .  Their bandwidth throttling plan is being very poorly carried out.  They basically render the internet useless to customer that use it the most frequently and giving them no tools to view and modify bandwidth behavior.  The tide of unhappy users is coming.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;How does their throttling plan work? From Comcast: &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;" &lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: rgb(68, 68, 68); line-height: 19px; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px; "&gt;Comcast says that sustained use of 70% of your up or downstream throughput triggers the BE state, at which point you'll find your traffic priority lowered until your usage drops to 50% of your provisioned upstream or downstream bandwidth for "a period of approximately 15 minutes." A throttled Comcast user being placed in a BE state "may or may not result in the user's traffic being delayed or, in extreme cases, dropped before PBE traffic is dropped."&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;How does their throttling plan work? In English: &lt;/div&gt;&lt;div style="text-align: left;"&gt;If you are using your internet a lot, we will slow your traffic way down so other people can use the internet.  What is a lot?  Some random and imaginary Comcast official:  "Well, we know what a lot is when we see it.  "&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt; I should not have foolishly watched "James and the Giant Peach" on streaming Netflix with the kids. Now, I must for that poor decision with ridiculously slow internet &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_mrInYe5_WBM/TSfw4ZB3KgI/AAAAAAAAA0Y/QQtnEdiV8F4/s400/SpeakEasy8Jan2011.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5559677116594203138" /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;   &lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a snapshot from SpeakEasy's bandwidth tester.   Wow!  .70 Mbps is blazing!  This is slightly faster than AOL dialup disks from back in the day.   I guess I have been dubbed a high bandwidth pirate!&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From Comcast's perspective, I get it.  Yes, people who are downloading more should not make the internet experience worse for those that don't use it as much.  Comcast likes to blame people who use P2P to download illegal content or feature length films.   They villanize high bandwidth users who are perfectly legitimate.   If you don't believe me, take a look at this article from PC world.  The term is "Bandwidth Hog".  Ref:  &lt;a href="http://www.pcworld.com/article/156447/comcast_has_begun_throttling_the_bandwidth_hogs.html"&gt;http://www.pcworld.com/article/156447/comcast_has_begun_throttling_the_bandwidth_hogs.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am perfectly content with smart filtering by service providers, but users must:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Have a view into their usage&lt;/div&gt;&lt;div&gt;2. Have clearly posted bandwidth use along with all of the internet traffic in the area so users have clarity into how the service providers are routing their traffic.&lt;/div&gt;&lt;div&gt;3. Be able to control their behavior to effectively operate in the arbitrary  (250Gbps) threshold.  &lt;/div&gt;&lt;div&gt;4. Be able to actually choose their service providers or augment their internet service with additional carriers.   There is still a lot of back door dealing (or at least it seems like that) to stifle competition between service providers.  &lt;b&gt;Comcast has a virtual monopoly&lt;/b&gt; in my town of Hampstead, MD.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&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/7265231704525907886-8081867088579809241?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8081867088579809241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8081867088579809241' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8081867088579809241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8081867088579809241'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2011/01/comcasts-bandwidth-throttling-done.html' title='Comcast&apos;s Bandwidth Throttling Done Poorly'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mrInYe5_WBM/TSfw4ZB3KgI/AAAAAAAAA0Y/QQtnEdiV8F4/s72-c/SpeakEasy8Jan2011.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4280820847314058687</id><published>2009-12-28T04:42:00.000-08:00</published><updated>2009-12-28T04:43:41.850-08:00</updated><title type='text'>Use Case Relationships</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Use Case Relationships&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use case relationships fall into the category of things that “seemed like a good idea at the&lt;br /&gt;time”. I suggest that you actively ignore them. They’ll add no value to your use cases, or&lt;br /&gt;to your understanding of the system, and they will be the source of many never ending&lt;br /&gt;debates about whether or not to use «extends» or «generalization».&lt;br /&gt;&lt;br /&gt;Ah, thanks &lt;b&gt;&lt;span class="gen"&gt;Ilja Preuss &lt;/span&gt;&lt;/b&gt;for this post: http://www.coderanch.com/t/100621/OO-Patterns-UML-Refactoring/UML-generalization-vs-extend-use&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4280820847314058687?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4280820847314058687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4280820847314058687' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4280820847314058687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4280820847314058687'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/12/use-case-relationships.html' title='Use Case Relationships'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7055394700052740117</id><published>2009-12-10T09:21:00.001-08:00</published><updated>2009-12-10T09:22:06.890-08:00</updated><title type='text'>IDE SSL connection</title><content type='html'>When you are making an SSL connection from your desktop IDE, you need to augement your JVM with the CA cert that you are connecting to. &lt;br /&gt;&lt;br /&gt;The default password for the Java default keystore file $JAVA_HOME/lib/security/cacerts is ‘changeit’&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7055394700052740117?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7055394700052740117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7055394700052740117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7055394700052740117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7055394700052740117'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/12/ide-ssl-connection.html' title='IDE SSL connection'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6160507533362095231</id><published>2009-12-10T08:58:00.000-08:00</published><updated>2009-12-10T09:00:24.094-08:00</updated><title type='text'>Fail Often And Early!</title><content type='html'>Re: http://ctotodevelopers.blogspot.com/2009/12/what-is-really-meant-by-failing-early.html&lt;br /&gt;&lt;br /&gt;I really liked this post.  I think that it is a much more natural process.  Getting bogged down in large expansive projects isn't very helpful.  I would rather see projects start working in an environment and have 2 of them succeed than plan 1 massive project. &lt;br /&gt;&lt;br /&gt;This just doesn't seem to work well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6160507533362095231?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6160507533362095231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6160507533362095231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6160507533362095231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6160507533362095231'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/12/fail-often-and-early.html' title='Fail Often And Early!'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1092793486156036345</id><published>2009-10-18T11:08:00.000-07:00</published><updated>2009-10-18T11:09:43.292-07:00</updated><title type='text'>Big Machines - Software Proposals</title><content type='html'>&lt;div&gt;This software looks awesome.  Will need to get a trial version.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.bigmachines.com/"&gt;http://www.bigmachines.com/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-1092793486156036345?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1092793486156036345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1092793486156036345' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1092793486156036345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1092793486156036345'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/big-machines-software-proposals.html' title='Big Machines - Software Proposals'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4368368340988700202</id><published>2009-10-18T11:05:00.000-07:00</published><updated>2009-10-18T11:08:00.591-07:00</updated><title type='text'>Google Web Toolkit</title><content type='html'>&lt;a href="http://googlewebtoolkit.blogspot.com/2009/10/building-enterprise-web-apps-in-cloud.html"&gt;http://googlewebtoolkit.blogspot.com/2009/10/building-enterprise-web-apps-in-cloud.html&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Very interesting article.  The take away here is that there is that code reuse on client and server is still a little messy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If I recall correctly, we had identical object in the client and server and just copied over jars.  As long as you have a decent built pattern, you should be all set.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Thanks Colin for passing this blog item along.  Looking forward to GWT v2.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;T&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4368368340988700202?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4368368340988700202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4368368340988700202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4368368340988700202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4368368340988700202'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/google-web-toolkit.html' title='Google Web Toolkit'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3910916092957589458</id><published>2009-10-18T00:32:00.001-07:00</published><updated>2009-10-18T00:32:48.464-07:00</updated><title type='text'>Amazon Ec2 Blocks Email!</title><content type='html'>&lt;div&gt;Uggh, this is not a fun problem.  Had to learn this the hard way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://searchcloudcomputing.techtarget.com/news/article/0,289142,sid201_gci1371369,00.html"&gt;http://searchcloudcomputing.techtarget.com/news/article/0,289142,sid201_gci1371369,00.html&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-3910916092957589458?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3910916092957589458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3910916092957589458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3910916092957589458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3910916092957589458'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/amazon-ec2-blocks-email.html' title='Amazon Ec2 Blocks Email!'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7700295519345615598</id><published>2009-10-17T21:10:00.000-07:00</published><updated>2009-10-18T00:31:58.137-07:00</updated><title type='text'>Annoying UTF-8 - Python</title><content type='html'>Python String come in 2 different flavors.... Unicode and Bytecode.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unicode strings default to the system standard.  Apple's standard is UTF-8.  Window's is ASCII.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What does this mean?  It means that when running Python and you need to use UTF-8, you need to specify this on the String you are processing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-7700295519345615598?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7700295519345615598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7700295519345615598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7700295519345615598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7700295519345615598'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/annoying-utf-8-python.html' title='Annoying UTF-8 - Python'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3110952974378430522</id><published>2009-10-16T12:37:00.000-07:00</published><updated>2009-10-16T12:42:04.055-07:00</updated><title type='text'>Bouncy Castle Crypto APIs for Java</title><content type='html'>Interesting API.... http://www.bouncycastle.org/java.html&lt;br /&gt;&lt;br /&gt;Will have to look at this to incorporate into toolkit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3110952974378430522?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3110952974378430522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3110952974378430522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3110952974378430522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3110952974378430522'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/bouncy-castle-crypto-apis-for-java.html' title='Bouncy Castle Crypto APIs for Java'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4888468185637854995</id><published>2009-10-07T12:07:00.000-07:00</published><updated>2009-10-07T12:12:53.809-07:00</updated><title type='text'>Processing Instructions in XML</title><content type='html'>I have to implement a fairly large XML and complex XML document and am doing some refreshing work.  One of the requirements of an XML file is to have PIs (processing instructions). &lt;br /&gt;&lt;br /&gt;To me, this doesn't make a lot of sense.  I would just tag command in the data and keep my processing straight forward.  Having to deal with nuances of XML takes time and energy that I just don't see returned unless you live in an XML world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4888468185637854995?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4888468185637854995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4888468185637854995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4888468185637854995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4888468185637854995'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/processing-instructions-in-xml.html' title='Processing Instructions in XML'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2858133320721484755</id><published>2009-10-06T05:43:00.000-07:00</published><updated>2009-10-06T05:46:20.586-07:00</updated><title type='text'>TCL?  Are you serious?</title><content type='html'>I have heard about Tcl when I worked at AT&amp;amp;T.  A lot of guys loved it.  I never touched it.  I think that the name is what did it. &lt;br /&gt;&lt;br /&gt;I am now writing a web caching piece using TCL, so we will see how this goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2858133320721484755?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2858133320721484755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2858133320721484755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2858133320721484755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2858133320721484755'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/tcl-are-you-serious.html' title='TCL?  Are you serious?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5079922928990909299</id><published>2009-10-01T08:55:00.001-07:00</published><updated>2009-10-01T08:58:49.831-07:00</updated><title type='text'>Clairvoyant Replacement Algorithm</title><content type='html'>I stumbled across this when looking at implementing some more complex caching than hashtables and was amazed at how awesome this would be to work on. &lt;br /&gt;&lt;br /&gt;Clairvoyant algorithms are incredibly difficult to implement and vary wildly per implementation.  This requires statistical analysis and is probably what the winner of the Netflix competition team implemented.&lt;br /&gt;&lt;br /&gt;Very cool sorts of problems to work on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5079922928990909299?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5079922928990909299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5079922928990909299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5079922928990909299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5079922928990909299'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/10/clairvoyant-replacement-algorithm.html' title='Clairvoyant Replacement Algorithm'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-9217063524275217195</id><published>2009-09-04T22:06:00.000-07:00</published><updated>2009-10-06T22:55:03.712-07:00</updated><title type='text'>Building your Amazon E2C environment</title><content type='html'>&lt;div&gt;After working in the software industry, I have to say that I have found nothing as profound of a shift as the use of VMs in what I call "serial environments".  The result of this shift will make software maintenance much easier.  You can duplicate complex software environments with the mere click of a button!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are the steps:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Sign up for a VM on Amazon's EC2 Cloud Service.&lt;/div&gt;&lt;div&gt;2. Create start a basic image.&lt;/div&gt;&lt;div&gt;3. Load software &lt;/div&gt;&lt;div&gt;4. Develop&lt;/div&gt;&lt;div&gt;5. Bundle into an image&lt;/div&gt;&lt;div&gt;6. Hand out images to your distributed team of developers.&lt;/div&gt;&lt;div&gt;7.  When they are done working, simple jump back to step 5 until you are done. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lets take a moment to demystify what is really happening with Amazon's EC2 Server farm.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Overview:   &lt;/span&gt;Amazon hosts thousands of servers in remote server farms.  These probably look like racks and rack of machines consuming tremendous power loads to run the servers and cool the machines.  What amazon also had is a pretty large comms pipe into each server farm.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mrInYe5_WBM/SqH6xLN_WEI/AAAAAAAAAk8/ZxRT4Flc6O4/s1600-h/amazone2c_server_farm.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 226px;" src="http://3.bp.blogspot.com/_mrInYe5_WBM/SqH6xLN_WEI/AAAAAAAAAk8/ZxRT4Flc6O4/s320/amazone2c_server_farm.jpg" alt="" id="BLOGGER_PHOTO_ID_5377855152789084226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Amazon allows you to "spin" up a virtual server.  These are the basic settings user for a typical VM.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mrInYe5_WBM/SqH7CRuAPbI/AAAAAAAAAlE/zkBaIV9sRZA/s1600-h/amazone2c_server_farm_mid.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 306px; height: 320px;" src="http://1.bp.blogspot.com/_mrInYe5_WBM/SqH7CRuAPbI/AAAAAAAAAlE/zkBaIV9sRZA/s320/amazone2c_server_farm_mid.jpg" alt="" id="BLOGGER_PHOTO_ID_5377855446591749554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We will break down all of the different sections.  For our purposes, we are going to focus on AMI selection.  There are three different choices for AMI selections.  They are QuickStart, My AMIs, and Community AMIs.  We will discuss this in more detail at a later time.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mrInYe5_WBM/SqH9VDvRv2I/AAAAAAAAAlM/mV_npFx_f0o/s1600-h/amazone2c_ami_options.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 58px;" src="http://1.bp.blogspot.com/_mrInYe5_WBM/SqH9VDvRv2I/AAAAAAAAAlM/mV_npFx_f0o/s320/amazone2c_ami_options.jpg" alt="" id="BLOGGER_PHOTO_ID_5377857968279764834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What makes up an AMI?&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mrInYe5_WBM/SqSRlz__7-I/AAAAAAAAAm0/Hf8e0j6etyQ/s1600-h/AKI_ARI_AMI.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_mrInYe5_WBM/SqSRlz__7-I/AAAAAAAAAm0/Hf8e0j6etyQ/s400/AKI_ARI_AMI.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378583933787041762" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 332px; height: 126px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;What happens does a VM look like from Amazon's Console perspective?  Lets start with the creation process:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;1. Selecting the VM&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mrInYe5_WBM/SqSGPw6S-zI/AAAAAAAAAmc/YYfZ519BbeQ/s1600-h/creating_instance_VMs.jpg" style="text-decoration: none;"&gt;&lt;img src="http://4.bp.blogspot.com/_mrInYe5_WBM/SqSGPw6S-zI/AAAAAAAAAmc/YYfZ519BbeQ/s400/creating_instance_VMs.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378571460372790066" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 205px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;2. Setting Basic Options&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mrInYe5_WBM/SqSCm1cDX4I/AAAAAAAAAlk/XoaqVmb9VQA/s1600-h/Launch_Instance_Wizard.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_mrInYe5_WBM/SqSCm1cDX4I/AAAAAAAAAlk/XoaqVmb9VQA/s400/Launch_Instance_Wizard.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378567458678595458" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 235px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;3. Viewing your running instance&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div&gt;test&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mrInYe5_WBM/SqSMcoa2qAI/AAAAAAAAAms/fxOSVD48ZbM/s1600-h/running_instance.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_mrInYe5_WBM/SqSMcoa2qAI/AAAAAAAAAms/fxOSVD48ZbM/s400/running_instance.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378578278501492738" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 181px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;4. Saving your AMI!   - One of the most important aspects that you need to think about it, is replicating the server so you can set up,  store the image, and use it later.  For our purposes,  we want to replicate the server so many developers will be able to get an identical instance.   It helps us dramatically because it means that we can get complicted environments up in no time.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;First, we need to find our keys so we can have access from our remote server to our environment.   &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mrInYe5_WBM/SqSTrWlwwmI/AAAAAAAAAm8/CwD2V04kykE/s1600-h/keys.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_mrInYe5_WBM/SqSTrWlwwmI/AAAAAAAAAm8/CwD2V04kykE/s400/keys.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378586227994837602" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 332px; height: 135px; " /&gt;&lt;/a&gt;&lt;div style="text-align: center; "&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left; "&gt;A deeper looking into the x.509, the personal key, and the x.509 certificate&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;div style="text-align: center; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_mrInYe5_WBM/SqVrr0-LKrI/AAAAAAAAAnE/6UwIARYY7_k/s400/deeperLook_into_x509_personal_Cert.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378823730661894834" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 85px; " /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;Copy over your personal key and your X.509 Certificate&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;div style="text-align: center; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/_mrInYe5_WBM/SqVrsDvjeKI/AAAAAAAAAnM/XOAFFwZCZ2I/s400/copy_certs_ec2_root.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378823734627104930" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 188px; " /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Ok, we are going to skip to the final image of what it takes to build a bundle using the command line.  It isn't the clearest thing in the world, so this is my best attempt at how it works.  I think that it would be worthwhile to look at ElasticFox's model since it rquires fewer key transfers and probably less human error associated with the Amazon command line tools.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mrInYe5_WBM/SqWfapQaEDI/AAAAAAAAAnU/qo24BYgjJxQ/s1600-h/EC2_Keys.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_mrInYe5_WBM/SqWfapQaEDI/AAAAAAAAAnU/qo24BYgjJxQ/s400/EC2_Keys.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5378880610064011314" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 308px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;This process is very cumbersome I will have to admit.  I generated some code that lets you run all of these command from a simple gui tool.  You would have to pull down the source code from Google's SVN, compile and run.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The link to this Netbeans 6.5 Java project is: &lt;a href="http://code.google.com/p/romanlogicutilities/source/browse/#svn/trunk/AmiGuiHelper"&gt;http://code.google.com/p/romanlogicutilities/source/browse/#svn/trunk/AmiGuiHelper &lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/7265231704525907886-9217063524275217195?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/9217063524275217195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=9217063524275217195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/9217063524275217195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/9217063524275217195'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/09/building-your-amazon-e2c-environment.html' title='Building your Amazon E2C environment'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mrInYe5_WBM/SqH6xLN_WEI/AAAAAAAAAk8/ZxRT4Flc6O4/s72-c/amazone2c_server_farm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4776413818214994991</id><published>2009-07-02T11:26:00.000-07:00</published><updated>2009-12-10T09:22:34.893-08:00</updated><title type='text'>Want to make good use of your expensive developers?</title><content type='html'>1. Make your environment trivial to set up and use&lt;div&gt;2. Use VMs and replicate your environment at the drop of a hat&lt;/div&gt;&lt;div&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/7265231704525907886-4776413818214994991?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4776413818214994991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4776413818214994991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4776413818214994991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4776413818214994991'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/07/want-to-make-good-use-of-your-expensive.html' title='Want to make good use of your expensive developers?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4203938653355266974</id><published>2009-07-02T06:39:00.000-07:00</published><updated>2009-07-02T06:41:50.657-07:00</updated><title type='text'>Best Hibernate Tutorial</title><content type='html'>&lt;div&gt;Of all the hibernate tutorials I found, this one was the best bar none. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.metaarchit.com/articles.html"&gt;http://www.metaarchit.com/articles.html&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note, you are going to need to modify your jar files.  Pulling down the Hibernare Core current release isn't suffficient.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This tutorial is for people who have java experience and time with the IDE.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-4203938653355266974?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4203938653355266974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4203938653355266974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4203938653355266974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4203938653355266974'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/07/best-hibernate-tutorial.html' title='Best Hibernate Tutorial'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3186624951052677203</id><published>2009-03-27T08:14:00.000-07:00</published><updated>2009-06-12T21:47:58.099-07:00</updated><title type='text'>My brief life as a software integrator</title><content type='html'>&lt;div&gt;    Perhaps of the most challenging jobs I had aside from being a farm hand, was being a software integrator.   For months, I had the chance to work as a full time software integrator.   My job has consisted of taking highly coupled software and putting it into many, many different operating environments using dynamic and non backwards compatible dynamic apis as well as hand woven security measures like Single Sign On.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;There are the top things that I learned:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;How unsexy but important good CM is&lt;/li&gt;&lt;li&gt;Benefits of well documented code &lt;/li&gt;&lt;li&gt;How to read log files extremely well&lt;/li&gt;&lt;li&gt;I hate java's Spring configuration files&lt;/li&gt;&lt;li&gt;How to use the holy grail of integration  - remote debugger.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What I liked about software integration:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It is very challenging&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What I disliked:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Changing source code makes problem dynamic - you have to relearn everything with a new release.  &lt;/li&gt;&lt;li&gt;Finding a needle in the haystack when you have a very poor stack trace.&lt;/li&gt;&lt;li&gt;If it doesn't work, it is your fault.  &lt;/li&gt;&lt;li&gt;If it isn't in when it is expected, it is your fault&lt;/li&gt;&lt;li&gt;If customers don't like it, it is your fault.&lt;/li&gt;&lt;li&gt;If it works, it is the actual core developer who did a good job&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/7265231704525907886-3186624951052677203?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3186624951052677203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3186624951052677203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3186624951052677203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3186624951052677203'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/03/my-brief-life-as-software-integrator.html' title='My brief life as a software integrator'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1757834579870576792</id><published>2009-03-10T12:00:00.000-07:00</published><updated>2009-03-12T13:12:08.537-07:00</updated><title type='text'>Redirectingin Tomcat</title><content type='html'>This is the best way to direct to another URL in the Tomcat Container.&lt;br /&gt;&lt;br /&gt;1. create a folder in webapps folder&lt;br /&gt;&lt;br /&gt;2. create index.jsp with this content&lt;br /&gt;&amp;lt% response.sendRedirect("http:www.cnn.com"); %&amp;gt&lt;br /&gt;&lt;br /&gt;3. Restart Tomcat!&lt;br /&gt;&lt;br /&gt;Done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks Nick!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1757834579870576792?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1757834579870576792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1757834579870576792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1757834579870576792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1757834579870576792'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/03/redirectingin-tomcat.html' title='Redirectingin Tomcat'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3648826593728626472</id><published>2009-02-24T09:32:00.000-08:00</published><updated>2009-03-02T12:29:09.692-08:00</updated><title type='text'>Cam Studio vs Wink?</title><content type='html'>Which one is better?&lt;br /&gt;&lt;br /&gt;http://debugmode.com/wink/&lt;br /&gt;&lt;br /&gt;http://camstudio.org/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I vote for Wink because it found it pretty easy to edit the frames and add audio.  The files were also much smaller with this software, which was a definite plus.  I think that CAM had both AVI and Flash, but you had to record in AVI or flash mode.  &lt;br /&gt;&lt;br /&gt;Wink was flexible because I think that it let you do both.&lt;br /&gt;&lt;br /&gt;I also like Wink's loading feature for the a presentation.  The little bar showing percent loaded was nice.&lt;br /&gt;&lt;br /&gt;Overall, Wink wins out if you want to do a quick and easy presentation.  If you want a more detailed trial, please look somewhere else!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3648826593728626472?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3648826593728626472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3648826593728626472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3648826593728626472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3648826593728626472'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/02/cam-studio-vs-wink.html' title='Cam Studio vs Wink?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3656400614513452136</id><published>2009-01-25T15:21:00.001-08:00</published><updated>2009-01-25T17:14:47.285-08:00</updated><title type='text'>Thread Safety in Java - Part 3 Condition Objects and Better Ways to do Synchronization</title><content type='html'>Ok, we are going back to part 2's scenario.  We have SGT Lock managing the mortar team but he also is flexible enough that he can control the air power.  Right?  You are the program  (Platoon Commander) and your squads are running your missions (threads)....&lt;br /&gt;&lt;br /&gt;They are out there, when all of a sudden, squad X runs into trouble.  They call SGT Lock and say "Hey, we are going to take over the enemy bunker, but we need mortars."&lt;br /&gt;&lt;br /&gt;SGT Lock: "Sure, no problem.  I locked it up for you!  No other squad can touch it." &lt;br /&gt;Squad5:  "Thanks Reentrant!"&lt;br /&gt;&lt;br /&gt;Lots of fighting.... bullets, mortars, etc...&lt;br /&gt;&lt;br /&gt;Squad 5 " SGT Lock, the mortar team is great, but we want to try something really cool.  Can you get the team to fire their mortars after the bunker gets reenforced?"  &lt;br /&gt;&lt;br /&gt;SGT Lock:  Umm, sure, I can lock up the mortar team for you and will tell them to wait when it gets loaded up with bad guys.&lt;br /&gt;&lt;br /&gt;Squad 5:  You the man!&lt;br /&gt;&lt;br /&gt;SGT Lock:  Ummm, yeah, no problem, but I have a question?  What happens if no enemy troops fill the bunker?  Now you have tied up my mortar team. &lt;br /&gt;&lt;br /&gt;Squad 5:  "I don't care, I am trying to do my mission"&lt;br /&gt;&lt;br /&gt;SGT Lock:  Roger roger, but sounds like we need to talk to the platoon commander....&lt;br /&gt;&lt;br /&gt;Squad 5:  Yeah, you are probably right.  Maybe he has thought of this already?  He is a bright guy...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As the platoon commander, you take a break from polishing your shoes to answer SGT Lock's new question.  It is a good one.  What happens when a squad and resources have to wait for a condition?  &lt;br /&gt;&lt;br /&gt;Being a smart guy, you have built in a militaristic condition into your thought pattern.  You tell SGT Lock that when a squad has to wait for something to happen, they just need to call back to SGT Lock to hold our mission and start firing when they need it.&lt;br /&gt;&lt;br /&gt;SGT Lock:  "Ok Squad 5, I spoke with the LT, you just need to call me up when you get stuck.  I will tear off a sheet of paper with your order on it and save it.  When it the troops fill the bunker, give me a call and I will take out your order, have the team dial it in, and then start firing.  There won't be any mix ups.  &lt;br /&gt;&lt;br /&gt;Squad 5:  "That makes a lot of sense.  We don't want to tie up the resource when other squads need it."&lt;br /&gt;&lt;br /&gt;SGT Lock:  "Ok, everytime a Squad uses the mortar team, they will send blackberry messages to signalAll with the words "Hey, we used the mortar team" and we are done.  &lt;br /&gt;&lt;br /&gt;SGT Lock continues.... "All squads waiting for a condition to be fulfilled with the mortar team will have a chance, but we have to be fair.  Squad 5, when the command signalAll() happens, I will talk with you directly.  Check to see if the bunker is full yet.  If it is, give me the fire command.  Otherwise, you will just have to await() a little longer"&lt;br /&gt;&lt;br /&gt;Squad 5:  "Geesh, this means that I am dependent on the other squads to do what they are told.  I hope that they are kind and considerate enough to notify us.  I hope that I make sure to call await() too!" &lt;br /&gt;&lt;br /&gt;SGT Lock:  "Yeah, I hope so too.  I think that you were trained and programmed to think about all of the different conditions that you need to consider. "&lt;br /&gt;&lt;br /&gt;Squad 5:  "Does all of the this locking, signaling, and awaiting take a lot of time for us to communicate?"&lt;br /&gt;&lt;br /&gt;SGT Lock:  " Sure it takes a little longer for use to communicate, but it better that we are accurate when we are sending explosives dangerously close to your position!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Squad 5:  "Yes, thats true.  SGT, no to be a pain, but I think I can see a time when  this could be messed up.  What happens if everyone is waiting for troops to fill their perspective bunkers.  No one calls signalAll() and we just sit and twiddle out thumbs?  &lt;br /&gt;&lt;br /&gt;SGT Lock:  "Yes, that is a very good question. That could happen.  Hmmm, I need to talk to the LT again!"&lt;br /&gt;&lt;br /&gt;As the LT , you tell SGT Lock "Oh boy, I need to look at my manual.  They last thing they taught us was how to get out of a deadlock situtation.  I need to think about it"  &lt;br /&gt;&lt;br /&gt;As you flip through your camo "guide to concurrent military operations for dummies" , you read about something else the squads can call.   When a squad is done with the mortar team, they can just yell "signal". At that point, SGT Lock pulls the first paper on his stack and gives them control.  Hmmm, interesting, but what does this buy me?  Not much for now.    The system can still be deadlocked. &lt;br /&gt;&lt;br /&gt;LT to all:  "Squad 5 brought us a really good question about deadlocking. I will have to address this later on.  I do want to take this opportunity to talk about how we can simplify all of this synchronization. Meet at my hooch at 2200.  "&lt;br /&gt;&lt;br /&gt;2200  Sharp&lt;br /&gt;&lt;br /&gt;LT:  Look, the good SGT Lock has done a lot of work to take care of things like how squads are to handle using different resources.  This is kind of messy.  I thought that it would be good to review a few things.  &lt;br /&gt;&lt;br /&gt;LT:  "Ok, so if you have squads out there and they need to us the mortars, you , SGT Lock don't need to get involved at all.  Instead, the mortar team can use some of their old regs to manage this stuff.  Yes, that is right, the mortar team needs to dust off manual 1.0 and know that every squad's request can be completely synchronized from the start.  &lt;br /&gt;&lt;br /&gt;so, it would look something like this:  &lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void synchronize fireMortars(Coordinates iCoordinates, int iFireDuration,    Target iTarget){&lt;br /&gt;  &lt;br /&gt;  while(iTarget.isABadTimeToAttack()){&lt;br /&gt;    wait();&lt;br /&gt;&lt;br /&gt;    attack(iTarget);&lt;br /&gt;&lt;br /&gt;    notifyAll();  // Yeah, this lets everyone who is waiting for a good time to                  &lt;br /&gt;                  //attack to be unblocked and able to try again.&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There are some problems, our original scheme of using reentrant locks and conditions allowed us much finer control!  This is really nice when doing high volume high performance military operations.  This is for a high functioning platoon like us.&lt;br /&gt;&lt;br /&gt;When we are kid of kicking back or working with a new squad, we are going to stick with the synchronize method as much as possible.  It is not very inefficient, but it works with little confusion.  The good news about this is that when you use this operation, I can easily look at the message traffic because it is standardized.  It makes it easy for the folks back in washington to critique our operations and be true armchair quarterbacks.  (Washington = Someone debugging the code).  They can tell us when we are messed up much easier than when we try to create our own reentrant locks and our own conditions. &lt;br /&gt;&lt;br /&gt;Since we are a new platoon, I will give you another lesson here in the future that will make us even better.  &lt;br /&gt;&lt;br /&gt;One final point that I want to point out... locks are kind of strange.  Everything we have has a lock on it.  Our machine guns, grenades, and knives all have locked.  They are locked for use or unlocked, and loaded.  Hence the term "lock and load".  When the gun is locked and loaded, it is ready to be used.  I know that this is confusing, but the Mortar team has a lock associated with it.  It is either locked or not.  &lt;br /&gt;&lt;br /&gt;Some old school military folks used to call mortars with this command.  We will not do this because it is pretty  creepy.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public MortarUnit {&lt;br /&gt;   &lt;br /&gt;    Object militaryLock;&lt;br /&gt; &lt;br /&gt;    public MortarUnit(){&lt;br /&gt;        militaryLock = new Object();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    synchronized(militaryLock){&lt;br /&gt;        attack();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&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/7265231704525907886-3656400614513452136?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3656400614513452136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3656400614513452136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3656400614513452136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3656400614513452136'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/01/militaristic-way-to-learn-thread-safety_25.html' title='Thread Safety in Java - Part 3 Condition Objects and Better Ways to do Synchronization'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6529178348309018239</id><published>2009-01-24T10:55:00.000-08:00</published><updated>2009-01-24T11:00:51.090-08:00</updated><title type='text'>Best SVN tutorial for Linux</title><content type='html'>This is one of the best tutorials that I found.  Took me a couple of minutes to create a project and hook netbeans into it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://systhread.net/texts/200607subver.php"&gt;http://systhread.net/texts/200607subver.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Only one problem:  I think that there was an error with this line: &lt;br /&gt;&lt;code&gt; cp -Rp * /tmp/myproject/trunk &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I skipped it and it worked fine.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I looked at using this Web Based SVN manager but decided against it because of the overhead associated with a remote installation.  The tool can be found here:   http://svnmanager.sourceforge.net/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6529178348309018239?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6529178348309018239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6529178348309018239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6529178348309018239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6529178348309018239'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/01/best-svn-tutorial-for-linux.html' title='Best SVN tutorial for Linux'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-472213752361031253</id><published>2009-01-18T20:23:00.000-08:00</published><updated>2009-01-25T15:20:54.124-08:00</updated><title type='text'>The Militaristic Way to Learn Thread Safety in Java - Part 2 Synchronize</title><content type='html'>Ok, lets take a moment to refresh where we are...  We are the platoon commander (running Java program) and have several squads (threads) running missions for us.  The Company commander (JVM) is working for the Battalition commander (OS).  &lt;br /&gt;&lt;br /&gt;Our squads are currently our forward taking the hill.  They are all sharing one thing, the mortar team that is part of the platoon.  The problem that we have is that we have to share the mortar team.  There are some simple parameters that we have to think about when it comes to mortar teams.  Each squad needs to have mortars fired in a particular way.  For example:&lt;br /&gt;&lt;br /&gt;Squad1:  &lt;br /&gt;  Rounds:    81 mm High Explosive Contact Fuse&lt;br /&gt;  Angle:     75 degrees &lt;br /&gt;  Direction: 320 degrees&lt;br /&gt;&lt;br /&gt;Squad2:&lt;br /&gt;  Rounds:    81 mm White Phosphorous Proximity Fuse&lt;br /&gt;  Angle:     45 degrees&lt;br /&gt;  Direction: 015 degrees&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What happens when Squad1 calls in a target and then Squad2 calls in a target.  For example, lets say squad1 calls in the following:&lt;br /&gt;&lt;br /&gt;Squad1: "Request 81 mil high bam bams on contact at 75 degrees elevation.... we are under fire, taking cover, will call back with the direction."&lt;br /&gt;&lt;br /&gt;Mortar Team:  "Ok, good luck!, we are setting up everything, just let us know the direction."&lt;br /&gt;&lt;br /&gt;Immediately after &lt;br /&gt;&lt;br /&gt;Squad2 calls in: "Request 81 mil white lighting with prox fuse at 45 degree elevation.... oh no, we have  flat.  Will call you back with the direction"&lt;br /&gt;&lt;br /&gt;Mortar Team:  "Okie dokie!, will make the changes and get set for you."&lt;br /&gt;&lt;br /&gt;Seconds later:&lt;br /&gt;Squad1:  "Sorry about that, we have it cleared up.  Please set the direction to 320 degrees."  &lt;br /&gt;&lt;br /&gt;Mortar team:  "Ok, got it.  Finally, we have a direction!  Let her rip boys."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our mortar team could start firing with the possible combination of:  &lt;br /&gt;&lt;br /&gt;  Rounds:    81 mm White Phosphorous Proximity Fuse&lt;br /&gt;  Angle:     45 degrees&lt;br /&gt;  Direction: 320 degrees&lt;br /&gt;&lt;br /&gt;Yikes!!!!!!   That could be a huge problem (race condition).  &lt;br /&gt;&lt;br /&gt;So, what should you do a platoon commander?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As the platoon commander, I would assign SGT Lock to take control of ordering mortar attacks.  He will wait until the mortar requests are complete, and then submit them!  No worries now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SGT Lock's first name by the way is ReEntrant.   Everytime a squad is in a somewhat complicated maneuver, they lock down different phases of the mission in case they need more.  Lets say they are calling in air strikes from the birds in the air.  They started by locking the mortar team, and to back them up more, they put a lock on the birds and call in the big boys.  When they are all down, they unlock the birds, then finally unlock the mortar team.  Nice work.&lt;br /&gt;&lt;br /&gt;You need to be really careful that the platoon commander doesn't terminate the squad's mission since it owns all of these locks.  You could have a situtation where the birds in the air have some coordinates but the mission gets killed.  All they have is bad coordinates and a ton of bombs.  I hope that they don't take their best bet and dump them where they think they should!  It could be a bad data in DMZ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-472213752361031253?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/472213752361031253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=472213752361031253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/472213752361031253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/472213752361031253'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/01/militaristic-way-to-learn-thread-safety_18.html' title='The Militaristic Way to Learn Thread Safety in Java - Part 2 Synchronize'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3599648363126012969</id><published>2009-01-18T09:49:00.000-08:00</published><updated>2009-01-18T20:23:33.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thread safety'/><category scheme='http://www.blogger.com/atom/ns#' term='thread safe'/><title type='text'>The Militaristic Way to Learn Thread Safety in Java</title><content type='html'>So, I was asked a question the other day that made me pause for a moment.  The question was something like this: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"How would you implement a thread safe network application listening on a particular port."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It has been years since I have done any threaded applications and I have to knock some cob webs out of my brain. These are the steps that I took to learn this:&lt;br /&gt;&lt;br /&gt;1. Read, Read, Read&lt;br /&gt;&lt;br /&gt;Threads are extremely well documented.  I am glad that this is going to be such and easy topic.  Another thing that I learned is that it is really best to read about the same topic from multiple authors.  People are great, but how they phrase things is very important.  It would be better to be taught by an expert, but since that is so rare we will have to use written work.    I started with the following sources:&lt;br /&gt;&lt;br /&gt;A. Core Java 2 Volume 2 by Gary Cornell and Cay Horstmann  pg 1-84&lt;br /&gt;Lessons Learned - There are two types of multitasking to take into consideration.  The first is preemptive multitasking and the second one is cooperative multitasking.  Since these are such well written names, it is very easy to understand what each one is.  I decided to use a military set of analogies for these first 84 pages to make it a little more interesting.  Unfortunately, in my attempt to master thread safe programming, I had to review Exception Handling in order to better understand how Java threads handle error exceptions.  Core Java 2 Volume 1 , 7th ed, Chapter 11.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Preemptive Multitasking is the drill sergeant approach.  You are done functioning when the drill sergeant says so.&lt;br /&gt;&lt;br /&gt;Cooperative Multitasking is the liberal operating system.  It asked programs, "Hey, can I interrupt you if that is ok?"  Only if you say sure, I can take a break, does the os switch you off.&lt;br /&gt;&lt;br /&gt;So, which one is the best to use?  I like polite people almost 100% of the time, but if we are trying to storm the beaches of Normandy, we can't wait for every single thing be perfect and ready.  If a solider is like, hey, I have to write a letter home to mom, shine my shoes and polish my belt buckle, things might have run differently.  Another way to think about it is if you have a weak leader who says, hi, is everyone ready to attack?  If not, let me know.  When the last guy is ready, we will take off. A good leader some times has to be able to grab everyone and make them do what they need to do even if they aren't ready.  It is harder to run this type of environment because you have to know what everyone is doing and be prepared to direct people and firepower when necessary.  &lt;br /&gt;&lt;br /&gt;Sorry to belabor this point, but I want to give one more example.  If a platoon is involved in a skirmish, you usually have some high powered machines units that you can use.  A good company commander needs to know what his units are doing and if appropriate, direct firepower  at the necessary location.  He doesn't give a command "just shoot at what you want".  Telling people to just shoot at what you want is pretty easy to do but is hardly the most effective way to get things done.&lt;br /&gt;&lt;br /&gt;So, pretty much all Operating Systems today use "tough love" or preemptive multitasking to get things done.  They don't mess around and are out to kick butt.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What is the organizational structure used for programs and how does it break down in military terms?&lt;br /&gt;&lt;br /&gt;1. OS - This is the battalion commander level.  The OS has multiple programs running and kicking butt.&lt;br /&gt;&lt;br /&gt;2. Program Running - Company Level = This program is doing a great job.  It too has to manage smaller units, called Platoons.  Each squad is kicking butt on the squad level.&lt;br /&gt;&lt;br /&gt;3. Java Implementation - Platoon Level&lt;br /&gt;&lt;br /&gt;3. Squads - These are the threads that are running inside the program.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, in each unit, you have to think about the type of resources that we have available.  The platoon commander has his own mortor squad that it uses. Squads have to share this resource and do.  &lt;br /&gt;&lt;br /&gt;The Platoon has is own units to operate and doesn't share resources with other platoons.&lt;br /&gt;&lt;br /&gt;So, why should the platoon share the mortor squad?  It is just faster for them.  If they had to radio back to the Company level, it would just take forever and the Germans don't really want to hold their attack up now do they?  You want to be able to yell over to the mortor team and get steel down range in a hurry.&lt;br /&gt;&lt;br /&gt;Ahhh, but what happens if the mortor team is already firing at someone else?  What if another platoon is trying top defend their position because they are over run?  Ah, decisions decisions.  This is where is get interesting......&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Time to get example up and running = 3 minutes - needed to create new project.&lt;br /&gt;There is a long section here where we jump from theory to an example.  I would have prefered more theory here because we barely scratched the surface.  &lt;br /&gt;&lt;br /&gt;Note to author- Page 13 looks like it contradicts itself.  When talking about extending a Thread object, it says that calling its start mechanism is no longer recommended.  The author talks about decoupling tasks with mechanisms.  Ok.... so, right below that, there is a warning, "Do not call the run method of the Thread class.... Instead call the start method.  So, does he mean the actual Thread.class or an extended version?  Very confusing.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Interrupting Threads  and Interrupting Squads&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lets say you are a platoon commander, you instantly create a squad.  You give them the command to take the hill.  On your mark, get set, run!  They go off and keep going until the hill is taken.  When they do take it over, they are done and the squad is finished and disappears.  (Ok, this is kind of strange, but just go with it).&lt;br /&gt;&lt;br /&gt;What happens if you change you mind?  Can you yell "Stop, come back!"  No, the squad keeps on charging ahead at full steam trying to make you happy and fulfill their orders.  You want to get them to come back, so you send them a message on the squad's blackberry.  It says, hey, squad.interupt().  Well, if the squad his time to check their blackberry messages, they would stop fighting, and come back home.  Lets say that they are too busy fighting to check their message or the guy who is holding the blackberry has been knocked out of commission and is passed out at the bottom of the hill.  How does the squad (thread) respond?  &lt;br /&gt;&lt;br /&gt;Well, the magic blackberry, knowing that it is not moving and therefore is blocked from telling people what the status is,  shoots a direct signal to the squad leader and says, hey, I just sent you a message dude.  You are being interrupted!  Stop fighting for a second, this is important partner.   Read that secret envelope that is stored in your pocket marked "Top Secret: InterruptedException Orders" and follow them.  &lt;br /&gt;&lt;br /&gt;Now, the squad leader could have two types of orders:&lt;br /&gt;"Abort Mission" - This is the command, you can cancel the operation or not, it is up to you.  Threads behave the same way, they don't have to cancel, they were just requested to stop. This sounds like the JVM isn't preemtive.  According to this definition, it looks, feels and smells like it is cooperative.  Yikes! Talk about a liberal military!  We will have to do some more work with this later.&lt;br /&gt;&lt;br /&gt;"Go Left and Outflank them"  Ok, so, you have a backup plan to go left.  Seems like a good idea, so do it!  A regular Thread has this option to.  If there is an exception, then follow the directions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Scenario 2:&lt;br /&gt;You told your squad to take the hill.  Now, you are laying back, chilling and relaxing.  The squad is about mid way up the hill, but it is late and everyone is tired including the enemy, so they decide to sleep.  While they are sleeping, you send the blackberry message "Hey, I need to interupt you".  The magic blackberry knows that everyone is sleeping right away because the communications corporal hit the snooze button on the phone.  Since the blackberry is really smart and knows it is sleeping, it shoots a direct signal to the squad leader and says hey!  We are being interrupted.  You need to do something and like proto.  Open up the secret orders dude and oh by the way, I just cleared the interrupt message on my blackberry message system since I told you already.  Cool?  I like being a blackberry.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, lets say the squad leader is directing the fight.  Things are going well and the Germans are cowering in their holes.  All of a sudden, the squad leader yells down to the communications corporal and says "Hey buddy, have we been interupted?  I want to know".  The corporal says, let me look.  "Yes!, we have 1 interuptions  .  Ok, thanks for check to see if isInterrupted was called.  A second goes by, he asked the corporal hey, I know we already asked, but have we been interupted?   The corporal says "Hey Sgt, yeah, still the same.  We haven't deleted it yet because you haven't followed your secret orders!  I am not going to delete the message until you do!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No, the platoon commanded is looking at everything and wants to know what of all the squads using the mortor fire team, is the current one stuck somewhere? &lt;br /&gt;&lt;br /&gt;The first thing that he does is talk to his platoon sgt who pretty much knows everything.  Hey First SGT, which squad is using my mortar team?  Can you check the&lt;br /&gt;currentSquad() ( just sub currentThread for currentSquad())?  Of course the SGT shoots a quick reply back.&lt;br /&gt;&lt;br /&gt;The platoon commander gets on the radio and yells, hey, squad using the mortar team, are you stuck?  If they are, he calls for air power, then tells them, well now you are unstuck.  Please continue.  The squad calls back:  "Thanks Platoon commander, you are not as bad a guy as the others say..  We are now unblocked and running again.  ?  If they were never stuck, the platoon commander says, cool.  Carry on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Squad / Thread States&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Your squad can be for things, green (or new), ready to fight (runnable), hunkeredDown (blocked), or dead (dead)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;New:&lt;/span&gt;  As a platoon commander, you tell HQ that you need another squad.  In our ficticious world, HQ grabs the first 10 green soliders gives them to you.  Hi, we are ready to fight.  Give us our orders!  Oh yeah, we don't have any guys and we don't have maps.  The platoon commander thinks oh boy, what did I get myself into?  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Making your squad ready to fight: Runnable &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Immediately, you send the boys to the armory.  Go on and some machine guns, grenades, and some bullets.  Oh yeah, make sure you get a map and a blackberry of course. The squad gets all of their stuff and is ready. Check them over and say, oh yeah, I think that you are runnable.  Meet up for the brief so I can start you off on your first mission.  After the brief and some dumb questions for the noobs, you tell them, ok, take the hill will all of the Germans. Just wait for word to come down from the battalion commander (OS) comes.  There are a lot of other things going on. Sure, the hill is defended by the historic 3rd SS Division and is battle hardened, but you guys have a blackberry for pete's sake.  Make sure that you use the Mortar team!  They are there to help you.  &lt;br /&gt;&lt;br /&gt;So, the squad is not running toward the hill.  They call the mortar team and use them for 30 minutes straight.  As the platoon commander, you get mad because the other squads are waiting in their positions because they want to use the mortars too.  Rather than attack and get killed, they wait smartly for the mortars.  You pick up the radio and tell the squad leader "Hey!  Take a break and let everyone use the mortar team!  You are new, but that isn't an excuse.  Didn't your mother tell you to share?"&lt;br /&gt;&lt;br /&gt;That night, you issue a command to all of your squads  "Hey, take a break from time to time so others can use the mortars".  Now, you know that they threads will be a little more fair with the limited platoon resources.&lt;br /&gt;&lt;br /&gt;When you have your squads out fighting the next day, you know that hey, these guys are all runnable (or fightable), but not everyone is using the mortars (Read :  threads are runnable, but only one is running at a time).&lt;br /&gt;&lt;br /&gt;Understand what State your Squads are in (Thread States)&lt;br /&gt;&lt;br /&gt;Life is really good as the platoon commander.  You are taking Germans out left and right, minimal casualties, and you think, hey, I will be up for a medal of honor at this rate.  Then, all of sudden the problems start rolling in.&lt;br /&gt;&lt;br /&gt;Of your squads, you have 5 total.  Squad 1, 2, 3, 4, and 5 respectively.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sleep: Squad 1's leader is a former high school football player who is tougher than tough.  The only problem is that he has fought super hard and is tired.  He wants his squad to sleep.  No problem.  "Get some shut eye, but leave you blackberry on!" you tell them.  &lt;br /&gt;&lt;br /&gt;Block on I/O: Squad 2's leader is a led by a former McDonald's assistant night manager.  Since he is used to not sleeping, he has taken point and is calling in bombing runs right before he attacks.  To call these runs in, he actually radios up to Division HQ back in London.  "Hey, I need bombs on target, how do you copy"  Well, the guy at the division level decides that he want to use morse code to respond. He decided to respond to squad 2 in more code.  Dit dit da da......  Squad 2 just looks at his watch and rolls his eyes as he breaks out his morse words the best he can.&lt;br /&gt;&lt;br /&gt;Running: Squad 3's leader was a former farm hand.  His squad was to take the right side of the hill.  He is doing so right now.  &lt;br /&gt;&lt;br /&gt;wait/Notify: Squad 4 , led by a former school teacher, was charged with leading the attack.  He wants to attack, but was told to wait for the right condition to launch his assault. He lies in wait and expects squad 3 to shoot him a text message to his blackberry.&lt;br /&gt;&lt;br /&gt;Suspect/Resume: Squad 5 is lead by a former chess champion.  He is on the left wing of the attack.  He was told to suspend his attack for the time being by the all knowing platoon commander(you).&lt;br /&gt;&lt;br /&gt;Now, your squads are dedicated.  If a squad in a particular state, the only way it can get out of the state is it gets out of it's waiting condition on its own by waiting for whatever it is it was waiting for.  Otherwise, the only way you can stop a squad is to just push the button to have them all killed (oh no!).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Dreaded Dead Squad (Dead State/ End State):&lt;br /&gt;&lt;br /&gt;All good things come to an end.  Our squads can be ended in 2 ways: 1. they complete their mission or 2. Their mission is ended prematurely and they are killed by their leadership!  Ok, this is a little weird, but at least we won't forget it!  &lt;br /&gt;&lt;br /&gt;Lets say squad 5 is attacking, I can tell it to stop and that would kill it.  I could say squad5.stop().  Yikes, not very nice.  You should never call this as the platoon commander because there is a new cooler way to do this.  &lt;br /&gt;&lt;br /&gt;So, lets say it has been about 4 hours and you want the status of squad5, you would ask it squad5.isAlive()?  If the squad is runnable or being blocked, it will tell you "yeah, I am cool".  If it the squad is new, it will say "No, I am not alive.".  If the squad is dead, it will say "no, sorry, I am dead.  I had to tell you this from beyond the grave".&lt;br /&gt;&lt;br /&gt;So, lets say you want to know if your squad is new or dead?  Guess what, you can't!  You just know if your thread is in a the battle.   &lt;br /&gt;&lt;br /&gt;What is you want to know if you squad is blocked, running, or in a runnable state.  That really stinks, but because you are at such a high level, that is ok.  You just want a quick status check.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Masterful Battle and Playing Favorites: An introduction to Thread Priorities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All of your squads have a priority associated with them.  Since we are all military units, we must take our order in the chain of command.  Our priority is 5  (This is the normal) at the platoon level.  Since we a getting new squads, they also have a priority of 5.  Lets say we want a squad to have a priority of 1, we would call squad5.setPriority(1).  &lt;br /&gt;&lt;br /&gt;This means that when it comes to using the mortars, squad5 would have a higher priority.  &lt;br /&gt;&lt;br /&gt;So, who detemines who gets to use the mortars?  That job has been assigned to SGT Scheduler.  He determines which squads get scheduled to use the mortars.  &lt;br /&gt;&lt;br /&gt;Well, there is a slight problem.  Since we were moved into Battalion 007, we have to think about their rules.  They only issue three levels of squad priorities.  1, 2, and 3.  What happens when we have our own procedures for SGT Scheduler?  Well, we have to make sure that our operation can function without priorities.  We should still be able to launch an attack.  That battle should not hing on priorities.  Be careful that you don't assign a high priority to squad5 but leave squad1 hanging.  sqaud1 would never get to use the mortars.  Maybe they don't need them but for a second.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Daemon Sergeants  (Daemon Threads)&lt;br /&gt;&lt;br /&gt;Lets say we need have a super big battle and we quickly start running out of ammunition.  As the platoon commander, you order SGT Daemon to help out the squads by delivering ammunition.  "SGT Daemon, start working!"&lt;br /&gt;&lt;br /&gt;SGT Daemon runs around giving bullets and grenades to the squads.  They take over the hill and say "We are done!  Time for us to go home."  All the squads take off and soon it is just SGT Daemon is there, chilling.  Ok, as the platoon commander, we wrap things up and call it a day.  There is no purpose in keeping that hard working SGT Daemon out there.&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;Time to clean up and get organized&lt;br /&gt;&lt;br /&gt;So, you and your platoon are doing great until the Captain from Company C comes down.  he inspects you and rips you up.  As you sit in your tent with your head in your hands, over comes the platoon SGT.  He says sir, I think that we need to get organized.  Lets put our squads, admin, leadership, mortar team, and our supply units into groups (thread groups).  &lt;br /&gt;&lt;br /&gt;You are depressed but curious and are able to mutter  "What would I want to do that?"  " Well sir, it helps you control things and check statuses at a much higher level".  Think of it as folder with lots of files" the SGT says with kind eyes.  Bam, it hits you!  Of course.  I can check to see the status of all of my squads by just asking my "squad group", hey, are you runable?"   Now you get it.  "Thanks SGT, again".&lt;br /&gt;&lt;br /&gt;So, for the next 3 days, you prepare for your inspection by organizing your teams.  &lt;br /&gt;&lt;br /&gt;ThreadGroup admin = new ThreadGroup("AdminTeam");&lt;br /&gt;ThreadGroup squads = new ThreadGroup("Squads");&lt;br /&gt;ThreadGroup leadership = new ThreadGroup("Leadership");&lt;br /&gt;ThreadGroup mortar = new ThreadGroup("MortarTeam");&lt;br /&gt;ThreadGroup supply = new ThreadGroup("Supply");&lt;br /&gt;&lt;br /&gt;One day 4, the Captain comes back ready to grill you again and anxious to fail you.  He asks "what is the status of your squads"  You start to stutter, you look around nervously, then you see your SGT nod confidently.  Seeing this, you know you can do it.  You look the Captain in the eye and say "Hey, I am on top of things.  I know exactly how to find that.  I simply type the following into my blackberry "squads.activeCount()"  it tells me how many are active.  &lt;br /&gt;&lt;br /&gt;The Captain raises his eyes.  Nice work Platoon commander, but how would you interrupt all of these units so that they follow their secret orders? &lt;br /&gt;&lt;br /&gt;Well, I would simple call squads.interupt() from my blackberry of course!&lt;br /&gt;&lt;br /&gt;"Well done, your platoon has passed with flying colors!"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;How do your squads handle Exceptions?  &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;We talked already about the interruptexception that we threw at the squads so they would follow their secret directions.  Now, lets take a look at what happens if other exceptions occur.  &lt;br /&gt;&lt;br /&gt;Ok, when our squad is out there with manuevers and all of a sudden runs into a purple german cow with a machine gun, the squad stops what they are doing, and they get a PurpleCowMachineGun exception.  Yikes!  We never planned for that.  The squad's mission is a failure and they must die.  Yeah, pretty harse, I know.   This would be a runtime error that we should have checked and is therefore an unchecked exception.  Yes, that is right, you should have been able to deal with a purple cow.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In another issue, lets say squad1 is pinned down by fire and we need mortars.  We get the mortar team to help us, but there are no more mortars left.  "The team says sorry, we don't have any more. We are taking a trip to Walmart and have to pick some more up.  We will let you know. "  Ut oh, we have an error that we have to deal with!  &lt;br /&gt;This is also and unchecked exception.  Kill the squad!  There mission must be aborted.  &lt;br /&gt;&lt;br /&gt;In the final scenario, squad1 is given a special radio to call in air support.  They are told to read the secret password that is located in private epstein's boot.  Well, you get to the attack point, make Private Epstein take off his boot, but bam, no secret file.  This is a checked exception that you would have to deal with.  Since you are prepared for this even, when the call gets made back to the Platoon commander, (throwing), the platoon commander says, "Check his other boot".  You do and of course find the note.  So, happily, you use the code and finish the mission.  &lt;br /&gt;&lt;br /&gt;Ideally, we want the squad to be able to handle exceptions that can come up during missions, do we give them some generic instructions ( UncaughtExceptionHandler()) so the squad can do something rather than panic.  Typically, we will have the squad call send a note to us letting us know where they were when they failed.  The would say, "hey, this is squad1, we failed here because of xyz."  Next time you plan your missions for the squads, you can run some checks before you send the squads.  Unfortunately, the squads are going to die when you have exceptions.  You really want your squad to send the report to you on the blackberry.  If you don't tell the squad to do this, in the future, they will report errors by getting on the radio and blasting it out (System.err).  If they send it via blackberry, you can store it and go back to it later on (log file).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3599648363126012969?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3599648363126012969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3599648363126012969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3599648363126012969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3599648363126012969'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/01/militaristic-way-to-learn-thread-safety.html' title='The Militaristic Way to Learn Thread Safety in Java'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7834100962688103994</id><published>2009-01-10T18:13:00.000-08:00</published><updated>2009-01-10T19:04:22.069-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='data modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='MYSQL Workbench 5.0 OSS'/><title type='text'>Good Open Source Data Modeler for MySQL</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Summary:&lt;/span&gt;  You have to pay for modeling software for MySQL, but you can get pretty close for free by using MYSQL's Workbench 5.0 OSS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problem:&lt;/span&gt;  I have a database with ~ 100 tables and have to figure out what was going on.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Background:&lt;/span&gt;  I searched the internet high and low looking for something that would break this thing down into a nice visual picture I could grasp this treasure trove of tables and key dependencies very quickly.&lt;br /&gt;&lt;br /&gt;I searched Google for "data modeling tools" and found this immediately: &lt;a href="http://www.databaseanswers.com/modelling_tools.htm"&gt;http://www.databaseanswers.com/modelling_tools.htm&lt;/a&gt;  Hmmm, not knowing how good this list was or how hold it was, I narrowed my scope very quickly by adding " open source" to my search.  &lt;br /&gt;&lt;br /&gt;I found several tools and this is what I pulled down:&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight:bold;"&gt;Open System Architecture&lt;/span&gt;:&lt;a href="http://www.codebydesign.com/"&gt; http://www.codebydesign.com/&lt;br /&gt;&lt;/a&gt;  &lt;br /&gt;This looked so promising!  I was excited but could not find documentation on it.  My download held scant information and the help icon references some config file that had to be set correctly.  Very disappointing.  I liked the look and feel of the tool.  &lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight:bold;"&gt;DIA&lt;/span&gt;: &lt;a href="http://live.gnome.org/Dia"&gt;http://live.gnome.org/Dia&lt;/a&gt;&lt;br /&gt;As someone who has reverse engineered databases using VISIO to create an EER model, I was hoping that this free Visio competitor would come close.  This tool has similar functions that I would need to draw diagrams, but I didn't see anything for database modeling.  A little disappointing, but a great mental note to keep in my head.  Thanks Evan for introducing me to DIA.  &lt;br /&gt;&lt;br /&gt;3.  &lt;span style="font-weight:bold;"&gt;MYSQL Workbench 5.0 OSS&lt;/span&gt;: &lt;a href="http://dev.mysql.com/workbench/"&gt;http://dev.mysql.com/workbench/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;I was super glad to see that MySQL offered this product.  I have found Sun to produce rock solid technology products and have relied on them as a company in the past.  I stumbled into this tool, but really like it. It is clean and easy to use.  My biggest complaint is that I can't just point to a live database and reverse engineer the tables.  To do that, you need the commercial version!  $99.  Arrrrgh.  (Pirate Talk)&lt;br /&gt;See comparisons: &lt;a href="http://www.mysql.com/products/workbench/features.html"&gt; http://www.mysql.com/products/workbench/features.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Steps to get my database loaded in MySQL Workbench&lt;/span&gt;&lt;br /&gt;1.  MySQL Workbench can only pulled data in that came from a DDL.  What is a DDL?  You can read this &lt;a href="http://en.wikipedia.org/wiki/Drop_(SQL)"&gt;wiki&lt;/a&gt;, or just know it as the list of tables that are in our DB.  (BTW - DDL stands for Data Definition Language - not the most intuitive name). You have to generate this from your legacy database.  &lt;br /&gt;&lt;br /&gt;Run the following mysql command from your command line&lt;br /&gt;&lt;br /&gt;mysqldump -u root -p --databases &lt;span style="font-style:italic;"&gt;dbName&lt;/span&gt; --no-data&gt;&lt;span style="font-style:italic;"&gt;mysqlWorkBenchImportDb.sql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Make sure you click the final option that says - "Add Objects to Diagram"  That is why you are doing all of this mess in the first place, right?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Next Step&lt;/span&gt; - Use Hibernate / JPA to do the same thing automatically to manage the database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7834100962688103994?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7834100962688103994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7834100962688103994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7834100962688103994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7834100962688103994'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2009/01/good-open-source-data-modeler-for-mysql.html' title='Good Open Source Data Modeler for MySQL'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5700139239901169063</id><published>2008-12-23T08:12:00.000-08:00</published><updated>2008-12-23T12:14:47.291-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java regex tutorial beginners'/><title type='text'>Best Java Regex Tutorial</title><content type='html'>Ok, Sun has nailed something.  Their REGEX tutorial is one of the best tutorials that I have seen.  The author did a great job of putting this together.&lt;br /&gt;&lt;br /&gt;link:  &lt;a href="http://java.sun.com/docs/books/tutorial/essential/regex/intro.html"&gt;http://java.sun.com/docs/books/tutorial/essential/regex/intro.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some notes that I took:&lt;br /&gt;&lt;br /&gt;The special metacharacters are:&lt;br /&gt;&lt;br /&gt;([{\^-$|]})?*+&lt;br /&gt;. = Substitute for one value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Working with patterns:&lt;/span&gt;&lt;br /&gt;I found that the &lt;span style="font-weight:bold;"&gt;union pattern&lt;/span&gt; to be a little confusing.  The tutorial recommends that union patterns be written like this:  [1-4[6-9]].  Thankfully, they showed another way to do this that I happen to like better even though it isn't very easy to read either.  [1-46-9]  .  I messed around with the syntax and found this even easier:  [[1-4][6-8]].&lt;br /&gt;&lt;br /&gt;Looking at intersection, the tutorial says to write them like this: [0-9&amp;&amp;[345]]. I experimented and found this to be an easier way to write the expression: &lt;br /&gt;[[0-9]&amp;&amp;[345]].  This seems to work just fine and looks cleaner.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Predefined Character Classes:   When writing code, you should use these as much as possible.  They are cleaner to read and will keep your code consistent.  There are really three main types of classes:&lt;br /&gt;&lt;br /&gt;Digit = 0-&gt;9: \d&lt;br /&gt;Word = char or digit: \w&lt;br /&gt;Whitespace = Any white space: \s&lt;br /&gt;&lt;br /&gt;What I find a little odd is that to negate these, you just use the capital letter.  Not very intuitive.  The "." is included in this section, but this looks just like the "." metacharacter. &lt;br /&gt;&lt;br /&gt;Quantifiers:  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My Summary:&lt;br /&gt;I don't like Regex much because it forces you, the human, to wrap yourself around the implementation, not the other way around.  Java is good at making objects wrap around problems and things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5700139239901169063?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5700139239901169063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5700139239901169063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5700139239901169063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5700139239901169063'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/12/best-java-tutorial.html' title='Best Java Regex Tutorial'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2143524707862946702</id><published>2008-12-09T06:03:00.001-08:00</published><updated>2008-12-09T06:56:58.324-08:00</updated><title type='text'>Best way to send mail in Java</title><content type='html'>Ok, so I need to run a program and email the results.  Pretty easy, right?  Right, so what are the options out there?&lt;br /&gt;&lt;br /&gt;JavaMail - Supported by Sun  - This is a huge plus because I know it will be stable.&lt;br /&gt;Commons Email by Jakarta - This site is very stable too&lt;br /&gt;&lt;br /&gt;So, Lets look at the Examples&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;JavaMail&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import javax.mail.*;&lt;br /&gt;import javax.mail.internet.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;public class SimpleDemo{&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt; public static void main(String args[])&lt;br /&gt;  {&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;      String smtpServer=args[0];&lt;br /&gt;      String to=args[1];&lt;br /&gt;      String from=args[2];&lt;br /&gt;      String subject=args[3];&lt;br /&gt;      String body=args[4];&lt;br /&gt;      send(smtpServer, to, from, subject, body);&lt;br /&gt;    }&lt;br /&gt;    catch (Exception ex)&lt;br /&gt;    {&lt;br /&gt;      System.out.println("Usage: java com.lotontech.mail.SimpleSender"&lt;br /&gt;       +" smtpServer toAddress fromAddress subjectText bodyText");&lt;br /&gt;    }&lt;br /&gt;    System.exit(0);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This looks simple enough.&lt;br /&gt;&lt;br /&gt;Benefits - Very easy to do a basic email.&lt;br /&gt;Drawback - You have two jars to load, JavaMail and the JavaBeans Activation Framework&lt;br /&gt;Ok, so what exactly do you need to the "JavaBeans Activation Framework" for and how large is it?  Well, according to the site, this framework does the following:  &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;With the JavaBeans Activation Framework standard extension, developers who use Java technology can take advantage of standard services to determine the type of an arbitrary piece of data, encapsulate access to it, discover the operations available on it, and to instantiate the appropriate bean to perform said operation(s)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ok, so what does this really mean?  We have a tool that automatically does something for us?  I hate using tools that automate things without me knowing what it is that is being automated.  The text example that they give isn't very clear.  &lt;br /&gt;&lt;br /&gt;Looking at the basic functions however, it looks like we don't have to add this jar to do simple things. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Size is 0.34 MB.  Not bad.&lt;br /&gt;&lt;br /&gt;Jakarta Commons Mail&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import org.apache.commons.mail.SimpleEmail;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;  SimpleEmail email = new SimpleEmail();&lt;br /&gt;  email.setHostName("mail.myserver.com");&lt;br /&gt;  email.addTo("jdoe@somewhere.org", "John Doe");&lt;br /&gt;  email.setFrom("me@apache.org", "Me");&lt;br /&gt;  email.setSubject("Test message");&lt;br /&gt;  email.setMsg("This is a simple test of commons-email");&lt;br /&gt;  email.send();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple and only has no dependencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2143524707862946702?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2143524707862946702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2143524707862946702' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2143524707862946702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2143524707862946702'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/12/best-way-to-send-mail-in-java.html' title='Best way to send mail in Java'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7951148734484436573</id><published>2008-11-16T08:36:00.001-08:00</published><updated>2008-11-16T08:38:34.754-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikinomics software ip ideagoras'/><title type='text'>Technology - Don't do it yourself</title><content type='html'>I took this note down when I read &lt;a href="http://www.wikinomics.com"&gt;Wikinomics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I liked it enough that I put it in my blog&lt;br /&gt;&lt;br /&gt;One of the things you really need to turn a company around is by acquiring technology from outside the company, not sitting in the company and developing yourself. There really is not a market for that and that model can not be sustained in the long run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7951148734484436573?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7951148734484436573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7951148734484436573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7951148734484436573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7951148734484436573'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/technology-dont-do-it-yourself.html' title='Technology - Don&apos;t do it yourself'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4009439080986308146</id><published>2008-11-16T07:49:00.000-08:00</published><updated>2008-11-16T08:10:05.245-08:00</updated><title type='text'>Voice to Text and other existential thoughts</title><content type='html'>I fell in love with Jott when it first came out.  I cannot believe the power of such a tool and was happy to pay $3.95 a month for it.  &lt;br /&gt;&lt;br /&gt;Based on comments from &lt;a href="http://news.bbc.co.uk/2/hi/technology/7174333.stm"&gt;Bill Gates&lt;/a&gt;, &lt;a href="http://news.cnet.com/8301-17939_109-10098125-2.html"&gt;Google's new technologies&lt;/a&gt;, Dragon natural speaking, and my recent experience with Jott, my mind has been racing.  &lt;br /&gt;&lt;br /&gt;Now, what makes this really interesting, is if we can convert voice to 0000s and 1111s, then how long until we can learn the biological format and then mimic it in the human brain?  &lt;br /&gt;&lt;br /&gt;Same Message:  Processed Aurally and Visually&lt;br /&gt;&lt;br /&gt;Right now, there is a long chain of events that occur when information comes in aurally.  Once sounds is converted from physical vibrations to electronic impulse, it gets processed somewhere.  &lt;br /&gt;&lt;br /&gt;If you read text, you are using a completely different part of the brain to process it. Your optic nerve converts the text into electronic impulses.&lt;br /&gt;&lt;br /&gt;So here is the question:  How is that information stored?  Is it stored in the same place or a different place?    Does the brain double book these memories?&lt;br /&gt;&lt;br /&gt;Anti Matrix:&lt;br /&gt;As much as I love the movie Matrix, I have to disagree with one of the coolest parts of the whole move.  The Matrix like plan of injecting knowledge into the brain is 180 degrees off.  The real power comes from not memorizing information, it comes from adding humanity to knowledge.  It is the curious, theoretical, and emotional side of humuanity that must be exported out of the biological brain.  I think that the best way to do that however, is to first understand how stuff gets in.&lt;br /&gt;&lt;br /&gt;If we understood how thought and memory get encoded, the final question is:  What if you could transmit your entire biological electrical structure (your brain) to a machine?  Would you be alive on that machine?  You probably want to get a backup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4009439080986308146?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4009439080986308146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4009439080986308146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4009439080986308146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4009439080986308146'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/voice-to-text-jott-and-other.html' title='Voice to Text and other existential thoughts'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7445553826960708194</id><published>2008-11-15T13:11:00.001-08:00</published><updated>2008-11-15T13:11:37.495-08:00</updated><title type='text'>I am testing the Jott...</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I am testing the Jott to Blogger function. &lt;a target='_blank' href='http://www.jott.com/show.aspx?id=ab86a73c-e1dd-46f8-a2a3-5c6c494fe8e3'&gt;listen&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Powered by &lt;a target='_blank' href='http://jott.com'&gt;Jott&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7445553826960708194?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7445553826960708194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7445553826960708194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7445553826960708194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7445553826960708194'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/i-am-testing-jott.html' title='I am testing the Jott...'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4176927049425301238</id><published>2008-11-14T21:30:00.000-08:00</published><updated>2008-11-14T21:32:33.051-08:00</updated><title type='text'>Moodling around?</title><content type='html'>I am making an after school technology club at my son's school.  I found this and totally want to use it when I design the class.  It is called "Moodle"&lt;br /&gt;&lt;br /&gt;Thanks GHOP for listing this&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4176927049425301238?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4176927049425301238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4176927049425301238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4176927049425301238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4176927049425301238'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/moodling-around.html' title='Moodling around?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4834321582972374089</id><published>2008-11-14T21:16:00.000-08:00</published><updated>2008-11-14T21:28:03.962-08:00</updated><title type='text'>Recovery from Java Addiction</title><content type='html'>Ok, I am hooked on Sean Kelly's videos.  They are very good!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.archive.org/details/SeanKellyRecoveryfromAddiction"&gt;http://www.archive.org/details/SeanKellyRecoveryfromAddiction&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Summary:  J2EE sucks for web development&lt;br /&gt;To many layers&lt;br /&gt;lots of xml&lt;br /&gt;Java is very wordy, making it difficult to read.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP - Messy / non portable / PHP is basic&lt;br /&gt;&lt;br /&gt;Ruby - messy perl symbols/ unicode is bad&lt;br /&gt;&lt;br /&gt;Python - Google likes it&lt;br /&gt;&lt;br /&gt;Code is read more than it is written.&lt;br /&gt;&lt;br /&gt;I don't think that this lecture provided a strong argument.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4834321582972374089?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4834321582972374089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4834321582972374089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4834321582972374089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4834321582972374089'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/recovery-from-java-addiction.html' title='Recovery from Java Addiction'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8925923123306513463</id><published>2008-11-14T20:13:00.001-08:00</published><updated>2008-11-14T21:16:27.092-08:00</updated><title type='text'>Awesome Web User Interface lecture</title><content type='html'>Looked at results of Google's GHOP program and got into Plone.  Somehow, I ended up getting to this link and it blew my mind.  I love this lecture.  It was a very influential lecture:  &lt;a href="http://oodt.jpl.nasa.gov/better-web-app.mov"&gt;http://oodt.jpl.nasa.gov/better-web-app.mov&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I like this because it is a US government production.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Video Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UI must allow for rapid turn around.  Compiled code on backend is great, but a poor choice for a UI.&lt;br /&gt;&lt;br /&gt;J2EE for User Interface =  Very bad. &lt;br /&gt;&lt;br /&gt;The goal is to have the following:&lt;br /&gt;&lt;br /&gt;  XML Situps (messing with XML) &lt;br /&gt;  No writing SQL (programs are better at this)&lt;br /&gt;&lt;br /&gt;Some of the different platforms that people went to are:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;J2EE&lt;br /&gt;Ruby on Rails&lt;br /&gt;Zope - Python&lt;br /&gt;Turbo Gears - Python&lt;br /&gt;Django - Python&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Summary:  Zope looks awesome, RR is next.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Look at screencast for screen videos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-8925923123306513463?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8925923123306513463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8925923123306513463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8925923123306513463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8925923123306513463'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/11/awesome-web-user-interface-lecture.html' title='Awesome Web User Interface lecture'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-292673390856864666</id><published>2008-10-12T18:39:00.001-07:00</published><updated>2008-10-12T18:39:37.678-07:00</updated><title type='text'>Organizing J2EE Web Apps</title><content type='html'>See 2.0 in this link:  http://java.sun.com/blueprints/code/projectconventions.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-292673390856864666?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/292673390856864666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=292673390856864666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/292673390856864666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/292673390856864666'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/10/organizing-j2ee-web-apps.html' title='Organizing J2EE Web Apps'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1950910803007382995</id><published>2008-10-02T03:44:00.001-07:00</published><updated>2008-10-02T03:56:08.966-07:00</updated><title type='text'>The Law of the Paperboy - Java Collections</title><content type='html'>I was reading code that uses the Java Map collection and pretty much find it unreadable and confusing.  When I starting looking for more, I found this blog:  http://javaekspert.blogspot.com/2007/11/overexposing-java-collections-is-bad.html  ( Niels Bech Nielsen) and clicked on of the links that describes the Law of the Paperboy.&lt;br /&gt;&lt;br /&gt;I really, really, like this example.  I think that all code should implement this kind mentality.  It makes writing code much easier to write, read, and improve.&lt;br /&gt;&lt;br /&gt;What it basically says, is that object should be responsible for carrying out there own actions.  The paper boy should not be able to walk through a customer's house looking for money.  The customer must give the paperboy money :-)&lt;br /&gt;&lt;br /&gt;http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/&lt;br /&gt;&lt;br /&gt;Once you break this, you end up with a mess on your hands.  To steal a couple of lines from Niels,&lt;br /&gt;&lt;br /&gt;"Actually, that the caller manually iterates the collection is quite a common OO anti-pattern. Developers may be able to think abstract, however, once they start programming it has to be all too concrete."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks Professor Karl Lieberherr for the paperboy example and to Niels for exposing it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1950910803007382995?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1950910803007382995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1950910803007382995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1950910803007382995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1950910803007382995'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/10/law-of-paperboy-java-collections.html' title='The Law of the Paperboy - Java Collections'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3890661714527019326</id><published>2008-10-02T03:27:00.001-07:00</published><updated>2008-10-02T03:33:32.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ant apache target order'/><title type='text'>Ant Targets - What gets called first?</title><content type='html'>Ok, I found this &lt;a href="http://ant.apache.org/manual/using.html"&gt;link&lt;/a&gt; very helpful.  To steal a portion:&lt;br /&gt;&lt;br /&gt;A target can depend on other targets. You might have a target for compiling, for example, and a target for creating a distributable. You can only build a distributable when you have compiled first, so the distribute target depends on the compile target....&lt;br /&gt;&lt;br /&gt;It is important to remember that when you see something like this, targets get fired from right to left.  &lt;br /&gt;&lt;br /&gt;&amp;lt target name="A"/&amp;gt&lt;br /&gt;&amp;lt target name="B" depends="A"/&amp;gt&lt;br /&gt;&amp;lt target name="C" depends="B"/&amp;gt&lt;br /&gt;&amp;lt target name="D" depends="C,B,A"/&amp;gt&lt;br /&gt;&lt;br /&gt;Suppose we want to execute target D. From its depends attribute, you might think that first target C, then B and then A is executed. Wrong! C depends on B, and B depends on A, so first A is executed, then B, then C, and finally D.&lt;br /&gt;&lt;br /&gt;Thanks Apache for putting this very well done documentation out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3890661714527019326?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3890661714527019326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3890661714527019326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3890661714527019326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3890661714527019326'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/10/ant-targets-what-gets-called-first.html' title='Ant Targets - What gets called first?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6746128621886527867</id><published>2008-09-30T11:54:00.000-07:00</published><updated>2008-09-30T11:57:10.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css gwt'/><title type='text'>Where should you reference you css; html or module's xml file?</title><content type='html'>I had this question rattling around in my head and just got to looking up the answer on google: see below.  I think that the answer to this question is pretty clear - put your references to css in your .xml file.   This is just the better answer because you don't have to think about it and it is the most flexible approach.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Including Stylesheets in the Module XML file&lt;br /&gt;Another way to include your stylesheet within your module is to use the &lt;stylesheet&gt; element in your module XML file. This uses automatic resource inclusion to bundle the .css file with your module.&lt;br /&gt;&lt;br /&gt;The difference between using a link tag in HTML and the &lt;stylesheet&gt; element in your module XML file is that with the mdoule XML file approach, the stylesheet will always follow your module, no matter which host HTML page you deploy it from.&lt;br /&gt;&lt;br /&gt;Why does this matter? Because if you create and share a module, it does not include a host page and therefore, you cannot guarantee the stylesheet's availability. Automatic Resource inclusion solves this problem. If you do not care about sharing or re-using your module then you can just use the standard HTML link rel stuff in the host page.&lt;br /&gt;&lt;br /&gt;Tip: Use a unique name for the .css file with included resources to avoid collisions. If you automatically include "styles.css" and share your module and someone puts it on a page that already has styles.css there will be problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6746128621886527867?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6746128621886527867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6746128621886527867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6746128621886527867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6746128621886527867'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/09/where-should-you-reference-you-css-html.html' title='Where should you reference you css; html or module&apos;s xml file?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5465473080508417763</id><published>2008-09-07T07:58:00.001-07:00</published><updated>2009-06-04T13:17:13.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><title type='text'>GWT-EXT Web Developer Skills</title><content type='html'>I am writing this because I wanted to take lay out all of the necessary skills that a developer must master to be a great developer in our office.  In order to be a stronger developer, I wanted to use these topics listed as an internal blueprint.  I advocate using the team approach and playing to strengths, but when you are a single developer, you have to think about the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1.  IDE&lt;/span&gt;:  You need to be very comfortable using the following tools in an IDE, logging, local/ &lt;b&gt;&lt;i&gt;remote debugging&lt;/i&gt;&lt;/b&gt;, various plugins, and in general, know the ins and outs of the ide.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. ANT Build tools&lt;/span&gt;:  You must master ANT.  This means that you must be able to weave together a GWT-EXT application, a database backend, and servlet with ANT.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3.  Version Control&lt;/span&gt;:  You must know how to import projects, deal with persnickety commits, and the dreadful cleanup command. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4.  Documentation&lt;/span&gt;:  Writing things like how tos, apis, problems, code, forums, etc...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5.  Deployment server&lt;/span&gt;:  When you deploy your application, just must understand how the application server works, what you need for it to deploy successfully, and understand problems associated with the server.  This include understanding how to write servlets on the backend. Some examples are Apache Web Server for client data only, Tomcat or JBoss for more complicated GWT projects.   Must be able to trouble shoot via logs.  Not as easy as it sounds. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;6.  JavaScript&lt;/span&gt;:  You cannot get around this as hard as GWT developers work at it!  In the future, GWT might be powerful enough to shield you from the assembly code of the web, but for now, you had better know it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;7.  Java&lt;/span&gt;: This goes without saying. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;8.  GWT Api&lt;/span&gt;:  I haven't done much work with GWT, but I assume that GWT has more to offer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;9. GWT-EXT Api&lt;/span&gt;:  This api does a nice job of wrapping GWT. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;10. Server technology&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;11.  Hibernate /ORM &lt;/span&gt;:  You will need to be able to run ORM software on the backend to store, query, and edit data.  You will have to be comfortable enough to set up your application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;12. Database Translation&lt;/span&gt;:  You must have some way to programatically get data out of the database server.  This involves using hibernate or even hand written queries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;13.  EXT Javascript Api version 2.0.2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;14.  Spring&lt;/span&gt;  I absolutely hate Spring.  It is sold as next best thing since sliced bread, but it is difficult to configure .xml files as a human.  I have had a 1000 line spring file to "configure".  When used properly however, it is a very, very nice tool to have.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;15.  Maven&lt;/span&gt;  This build system is superior to ANT.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;16.  Single Sign On &lt;/span&gt; Must know how Single Sign On Works from client to server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;16. REST &lt;/span&gt;  We use REST extensively in our environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5465473080508417763?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5465473080508417763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5465473080508417763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5465473080508417763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5465473080508417763'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/09/gwt-ext-web-developer-skills.html' title='GWT-EXT Web Developer Skills'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5370874757239191325</id><published>2008-08-15T10:13:00.000-07:00</published><updated>2008-09-07T10:57:03.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.xml'/><category scheme='http://www.blogger.com/atom/ns#' term='j2ee'/><title type='text'>Minimum Web.XML file - web.xml</title><content type='html'>Below is the code for the most minimal Web.xml file that a web app must have.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I left out the brackets because they don't seem to show up. &gt; &lt;&lt;br /&gt;&lt;br /&gt;!-- dummy web.xml --&lt;br /&gt;&lt;br /&gt;web-app  Something  /web-app&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5370874757239191325?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5370874757239191325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5370874757239191325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5370874757239191325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5370874757239191325'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/08/minimum-webxml-file-webxml.html' title='Minimum Web.XML file - web.xml'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2940289876822070996</id><published>2008-08-14T12:52:00.000-07:00</published><updated>2008-09-07T10:57:50.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt-ext'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>GWT App Builder  Dagger - Uneven Comboboxes - CSS</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/terrance.macgregor/SKRawNCcqII/AAAAAAAAAPE/Z6fPkA0qmME/uneven_ComboBox.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://lh5.ggpht.com/terrance.macgregor/SKRawNCcqII/AAAAAAAAAPE/Z6fPkA0qmME/uneven_ComboBox.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I ran into an issue that took me about 2 hours to clear up. &lt;br /&gt;&lt;br /&gt;The issue can be seen here when using GWT-Ext on an eclipse app that gets created by GWT.  GWT 1.5 created a CSS file that gets dumped in the same dir at the app .html page. The CSS file has a tag that shifts all of your images down by 20 pixels.  &lt;br /&gt;&lt;br /&gt;img {&lt;br /&gt;margin-top: 20px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Nice!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It wasn't until I posted to the gwt-ext group that I found the error. Thanks Sanjiv for coming to the rescue.  &lt;br /&gt;&lt;br /&gt;More details can be found on the GWT-EXT forum:&lt;br /&gt;&lt;a href="http://groups.google.com/group/gwt-ext/browse_frm/thread/32684269349e1429"&gt;http://groups.google.com/group/gwt-ext/browse_frm/thread/32684269349e1429&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Issue reported via Google Web Toolkit:&lt;br /&gt;&lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=2753"&gt;http://code.google.com/p/google-web-toolkit/issues/detail?id=2753&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GWT patched their new GWT release so that: &lt;br /&gt;   img {&lt;br /&gt;       margin-top: 20px;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;Thank you Google and to Zundel!&lt;br /&gt;&lt;br /&gt;Here is the patch code which can be found here:  &lt;br /&gt;&lt;a href="http://code.google.com/p/google-web-toolkit/source/detail?r=3519"&gt;http://code.google.com/p/google-web-toolkit/source/detail?r=3519&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Index: user/src/com/google/gwt/user/tools/AppCss.csssrc&lt;br /&gt;===================================================================&lt;br /&gt;--- user/src/com/google/gwt/user/tools/AppCss.csssrc (revision 3518)&lt;br /&gt;+++ user/src/com/google/gwt/user/tools/AppCss.csssrc (working copy)&lt;br /&gt;@@ -1,13 +1,12 @@&lt;br /&gt; /** Add css rules here for your application. */&lt;br /&gt;-button {&lt;br /&gt;+&lt;br /&gt;+&lt;br /&gt;+/** Example rules used by the template application (remove for your app) */&lt;br /&gt;+.pc-template-button {&lt;br /&gt;   display: block;&lt;br /&gt;   font-size: 16pt&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;-.widePanel {&lt;br /&gt;-  width: 100%&lt;br /&gt;-}&lt;br /&gt;-&lt;br /&gt;-img {&lt;br /&gt;+#pc-template-img {&lt;br /&gt;   margin-top: 20px;&lt;br /&gt;-}&lt;br /&gt;\ No newline at end of file&lt;br /&gt;+}&lt;br /&gt;Index: user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc&lt;br /&gt;===================================================================&lt;br /&gt;--- user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc (revision 3518)&lt;br /&gt;+++ user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc (working copy)&lt;br /&gt;@@ -20,10 +20,14 @@&lt;br /&gt;   public void onModuleLoad() {&lt;br /&gt;     Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png");&lt;br /&gt;     Button button = new Button("Click me");&lt;br /&gt;-&lt;br /&gt;+    &lt;br /&gt;+    // We can add style names&lt;br /&gt;+    button.addStyleName("pc-template-btn");&lt;br /&gt;+    // or we can set an id on a specific element for styling&lt;br /&gt;+    img.getElement().setId("pc-template-img");&lt;br /&gt;+    &lt;br /&gt;     VerticalPanel vPanel = new VerticalPanel();&lt;br /&gt;-    // We can add style names.&lt;br /&gt;-    vPanel.addStyleName("widePanel");&lt;br /&gt;+    vPanel.setWidth("100%");&lt;br /&gt;     vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);&lt;br /&gt;     vPanel.add(img);&lt;br /&gt;     vPanel.add(button);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2940289876822070996?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2940289876822070996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2940289876822070996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2940289876822070996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2940289876822070996'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/08/gwt-app-builder-dagger-uneven.html' title='GWT App Builder  Dagger - Uneven Comboboxes - CSS'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/terrance.macgregor/SKRawNCcqII/AAAAAAAAAPE/Z6fPkA0qmME/s72-c/uneven_ComboBox.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6668458956802541019</id><published>2008-08-13T20:14:00.000-07:00</published><updated>2008-08-18T06:06:26.629-07:00</updated><title type='text'>GWT jQuery Firefox and the Jsonp Mashup</title><content type='html'>My first attempt at pulling in a Restful service from outside my webserver container was a complete fail, but not as bad as these: &lt;a href="http://failblog.org/"&gt;http://failblog.org/ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The boring history&lt;/span&gt;&lt;br /&gt;Almost all future web applications will be developed using XMLHttpRequest (XHR).&lt;br /&gt;XHR is an API that can be used by JavaScript and other web browser scripting languages to transfer XML and other text data between a web server and a browser. Though it can do synchronous fetches, it is almost always asynchronous, due to the greater UI responsiveness. Source:  &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;Wikipedia&lt;/a&gt; (Of course)   XHR is a key ingredient to RESTful services allowing data to be picked up and loaded onto a webpage.&lt;br /&gt;&lt;br /&gt;The ability for browsers to be able to pull this kind of data in is very, very important in the modern computer environment and as a result are supported by both Firefox and IE.  Yippee. The problem however is that Firefox does not support Cross Domain Support in Firefox 2 or 3.  In three they kind of do, see: &lt;a href="http://www.nczonline.net/blog/2008/4/27/cross_domain_xhr_removed_from_firefox_3"&gt;http://www.nczonline.net/blog/2008/4/27/cross_domain_xhr_removed_from_firefox_3&lt;/a&gt;  *1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Security + Firefox my Cross Domain XHR difficult&lt;/span&gt;&lt;br /&gt;Cross domain security issues exist with Firefox.  What does this mean?  This means that Firefox does not want a XHR to contact another server.  The server must be on the same host,same port number, and very importantly, in the same container at the data being requested and the client that is being populated. This is a big security issue that can be read about more here.  You can read more about Cross Domain issues here: &lt;a href="https://www.kb.cert.org/vuls/id/143297"&gt;US-Cert Security&lt;/a&gt;. If you really like security stuff, just search for "firefox" on their site: &lt;a href="https://www.kb.cert.org/vuls/html/search"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to do Cross Domain XHR with GWT&lt;/span&gt;&lt;br /&gt;this is why you read this in the first place, right?  You can read this &lt;a href="http://code.google.com/support/bin/answer.py?answer=65632&amp;topic=11368"&gt;article &lt;/a&gt; by Dan Morrill , but there really isn't a nice neat project put together that demonstrates how to do this.  This article is well written however.&lt;br /&gt;&lt;br /&gt;A good look at Jsonp:  &lt;a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/"&gt;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;jQuery - Has a work around, but you must ensure that your JSONP RESTful service can properly wrap the returning JSON.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Other ways around it: &lt;br /&gt;You can mess around with something called and &lt;a href="http://dojotoolkit.org/node/87"&gt;iFrame proxy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Solution: Enough already, lets see a working example already!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; Coming Soon!- Sorry about that.  I hope that I have time to address the issue.&lt;br /&gt;&lt;br /&gt;Thanks Jason F, Dave P, John M&lt;br /&gt;&lt;br /&gt;*1 Thanks Nicholas C. Zakas for the insightful blog post and for posting your research on Firefox and the Cross Domain Browsing Issue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6668458956802541019?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6668458956802541019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6668458956802541019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6668458956802541019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6668458956802541019'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/08/gwt-jquery-firefox-and-jsonp-mashup.html' title='GWT jQuery Firefox and the Jsonp Mashup'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-294253384773105018</id><published>2008-08-13T20:03:00.000-07:00</published><updated>2008-08-13T21:10:59.649-07:00</updated><title type='text'>Installing Joomla with Xampp on Vista 64bit - Great tutorial</title><content type='html'>&lt;span style="font-weight:bold;"&gt;I hate website design:&lt;/span&gt;&lt;br /&gt;  I can think of nothing more unfun that putting a cool functioning website together.  I love going to great sites and respect web site designers tremendously.  It is just something that I cannot do.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Why I am bothering to do this?&lt;/span&gt;&lt;br /&gt;My neighbor asked me how to set up a website several months ago.  I quickly hooked her into GoDaddy and got here up and running.  The problem was that building and maintaining a site with any complications is difficult.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Joomla&lt;/span&gt;&lt;br /&gt;When looking for a good website designer, I was turned onto Joomla, a CMS (Content Management System).  I love this tool because it takes a lot of the headaches out of website setup.  If you are not doing anything fancy and just want a site to run some basic information about yourself or your company, Joomla is a the way to go.  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Great Tutorial &lt;/span&gt;&lt;br /&gt;I initially tried to install this on a remote server and failed.  On night two of the installation, I found an amazing tutorial to do this: &lt;a href="http://www.videotutorialzone.com/content-management-systems/joomla-cms/installing-joomla-1.5-on-windows-2003-with-an-apache-web-server.html"&gt;www.videotutorialzone.com&lt;/a&gt;&lt;br /&gt;I followed this tutorial and it worked great on Vista.&lt;br /&gt;&lt;br /&gt;In 15 minutes, I was up and running.    What I really liked about this was the tool XAMPP.  I heard about this, but was utterly amazed at how quickly this tool worked.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks Troy and John F&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-294253384773105018?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/294253384773105018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=294253384773105018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/294253384773105018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/294253384773105018'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/08/installing-joomla-with-xampp-on-vista.html' title='Installing Joomla with Xampp on Vista 64bit - Great tutorial'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4215532680887636066</id><published>2008-08-05T12:05:00.000-07:00</published><updated>2008-08-12T02:33:32.068-07:00</updated><title type='text'>GWT - Getting a URL picture loaded on your client</title><content type='html'>How do you get a picture from a URL?&lt;br /&gt;&lt;br /&gt;1) java.net.URL does not exist in the GWT JRE emulation. See&lt;br /&gt;http://code.google.com/webtoolkit/documentation/jre.html  You may only use a&lt;br /&gt;subset of classes in java.lang and java.util for client-side code. Pulled from this &lt;a href="http://www.mail-archive.com/google-help-dataapi@googlegroups.com/msg00444.html"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Basically, if I want my client to pull an image bundle, the best was is to do an RPC call back to the server from the client and&lt;br /&gt;allow the server to pull the picture from the internet.&lt;br /&gt;&lt;br /&gt;If you want to pull a single image, you should just call Image(String url) in GWT.  &lt;br /&gt;&lt;br /&gt;Thanks Drake for brining this up, Evan for the recommendation, and Vivian for putting it in plain English.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4215532680887636066?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4215532680887636066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4215532680887636066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4215532680887636066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4215532680887636066'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/08/gwt-getting-url-picture-loaded-on-your.html' title='GWT - Getting a URL picture loaded on your client'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6231137659679048308</id><published>2008-07-30T06:31:00.000-07:00</published><updated>2008-07-30T06:33:45.447-07:00</updated><title type='text'>GWT Client Side Logging</title><content type='html'>GWT.log ("Your message",null);&lt;br /&gt;&lt;br /&gt;This log message shows you log messages in hosted mode.&lt;br /&gt;&lt;br /&gt;Analogous to System.out.println();&lt;br /&gt;&lt;br /&gt;Thanks Dave P!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6231137659679048308?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6231137659679048308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6231137659679048308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6231137659679048308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6231137659679048308'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/gwt-client-side-logging.html' title='GWT Client Side Logging'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6444062742338078953</id><published>2008-07-29T15:02:00.000-07:00</published><updated>2008-07-29T15:03:33.811-07:00</updated><title type='text'>I hate articles like this one: Anti Java</title><content type='html'>My feedback to the author:  &lt;br /&gt;&lt;a href="http://itmanagement.earthweb.com/features/article.php/3761921/The+Anti-Java+Professor+and+the+Jobless+Programmers.htm"&gt;http://itmanagement.earthweb.com/features/article.php/3761921/The+Anti-Java+Professor+and+the+Jobless+Programmers.htm&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I remember moving from C++ to Java when I was an undergrad.  There is no comparison.  I could write programs quickly and solve problems several magnitudes faster.  I could care less about pointer allocation and memory leaks.  If the purpose of a language is to really know what is going on, use assembly.  I bet that there were people who made this same argument when C came around.  Besides, we all know that "real coders use binary."&lt;br /&gt;&lt;br /&gt;Another analogy that I can think of.   "Real" computer folks needed to know characteristics about how their vacuum tubes worked.  Training manuals were probably written to ensure that vacuum tubes were working, etc.  When transistors came around, people probably grumbled against that too.  &lt;br /&gt;&lt;br /&gt;Java and languages like it are the future.I don't care what type of anecdotal evidence there is against it.  &lt;br /&gt;&lt;br /&gt;There will be a day when Java is too low level(this has already happened in my opinion).  That will be a good time because we will abstract ourselves from even more of the details and look at solving much more complicated problems than how to read a text file in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6444062742338078953?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6444062742338078953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6444062742338078953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6444062742338078953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6444062742338078953'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/i-hate-articles-like-this-one-anti-java.html' title='I hate articles like this one: Anti Java'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-812409806085836547</id><published>2008-07-27T19:24:00.000-07:00</published><updated>2008-07-27T20:03:55.793-07:00</updated><title type='text'>Thinking Temporally - Not Computer Science Related - Slightly Abstract</title><content type='html'>Ok,  I had a rather strange thought that when I explained it to my wife, she thought it was crazy.* &lt;br /&gt;&lt;br /&gt;When I started working in the world of temporality (my new word), it became clear to me how very temporal life is.  For example (in a very simplified biological example), when you exhale, you are expelling CO2 atoms from your body that you once brought in the form of oxygen.  These atoms belong to you when you need them, they are part of you.  When you breath them out, they float around until they find a plant where the CO2 atoms are converted and released as oxygen.  This oxygen finds itself in another  person.  We don't give this a second thought because we live in such abstract terms that these things don't cross our minds daily. &lt;br /&gt;&lt;br /&gt;The point of this is not to give a bad chemistry lesson, but to understand that all things and states are temporary.  Nothing is is ever the same. Every second that ticks by leads to massive change that we simply do not detect.  Physically, we are passing shadows through this world of atoms, collecting them, using them to transmit electricity in our brains, build muscles, think abstractly, and tossing all of those atoms when our time has expired.    &lt;br /&gt;&lt;br /&gt;I don't have a super cool awesome religious thing or a platitude to sum this up, but would rather make an observation:  all things have a window for which they are in existence or in a particular state.  &lt;br /&gt;&lt;br /&gt;Now to get a little strange.  Do we really exist if atoms are gathered together (our life) and then scattered (when we die)?  Nothing was created and nothing was destroyed.  We used these atoms and energy we derived from other atoms to go about our life.   Here is where I react a wall that I cannot get over. What exactly is the point of playing this game?   &lt;br /&gt;&lt;br /&gt;Some general blabbing:  Is the Universe a container or an entity?    &lt;br /&gt;Using the principle that energy cannot be created or destroyed, it must be true that the universe cannot be created or destroyed?  The other option here is to say that the Universe on a high level does not follow the laws of energy preservation.  In this case, there must be a universe that our universe belongs to with its own set of rules?  Or maybe there are no rules for a Universe?  Logic would dictate that the Universe belongs to something.  &lt;br /&gt;&lt;br /&gt;* Note: This is a common reaction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-812409806085836547?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/812409806085836547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=812409806085836547' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/812409806085836547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/812409806085836547'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/thinking-temporally-not-computer.html' title='Thinking Temporally - Not Computer Science Related - Slightly Abstract'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4405387796616069725</id><published>2008-07-23T18:07:00.000-07:00</published><updated>2008-08-04T15:48:20.244-07:00</updated><title type='text'>Reading Jar files from inside a Jar</title><content type='html'>Ok, so I wanted to copy a jar file form inside a jar file and stick it on someone's machine.  Strange huh?  I don't think so.  Here is the main source of code that used:  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.keenertech.com/content/228.aspx"&gt;http://www.keenertech.com/content/228.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My code looks something like this.  Note, this only seems to copy a jar file, not a folder.  This isn't very clean and because it is inside a jar, I had to use JOptionPane to shoot out errors.  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    private void copyResource(String strName){          &lt;br /&gt;        InputStream in = this.getClass().getResourceAsStream("/"+strName);&lt;br /&gt;        DataOutputStream out = null;&lt;br /&gt;        try {&lt;br /&gt;            try{     &lt;br /&gt;                out = new DataOutputStream(new FileOutputStream(&lt;br /&gt;                    new File(workingDirField.getText()+ &lt;br /&gt;                    File.separator+projectText.getText()+File.separator+"lib"+File.separator+strName)&lt;br /&gt;                ));&lt;br /&gt;            } catch (IOException IOE){&lt;br /&gt;               JOptionPane.showMessageDialog(new JFrame(),"DataOutputStream could not be created" + IOE.toString());&lt;br /&gt;            }&lt;br /&gt;       &lt;br /&gt;            if(in==null){&lt;br /&gt;                JOptionPane.showMessageDialog(new JFrame(),"In is null");&lt;br /&gt;                System.exit(-1);&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;            byte[] buffer=new byte[1024]; // I know the length at this point&lt;br /&gt;            int value = in.read(buffer);&lt;br /&gt;            while(value!=-1){&lt;br /&gt;                       &lt;br /&gt;                try{&lt;br /&gt;                    out.write(buffer);&lt;br /&gt;                } catch (IOException ioe){&lt;br /&gt;                        JOptionPane.showMessageDialog(new JFrame(),"DataOutputStream could not bewritten to" + ioe.toString());&lt;br /&gt;                }             &lt;br /&gt;                    value = in.read(buffer);&lt;br /&gt;                }&lt;br /&gt;                out.close();               &lt;br /&gt;            } catch (IOException ioe){&lt;br /&gt;                JOptionPane.showMessageDialog(new JFrame(), ioe.toString()+"n" &lt;br /&gt;                        + strName + "Associated with close");&lt;br /&gt;            }&lt;br /&gt;   } // End Method&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What a headache!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While this really did look like it was going to be simple operation, I ended up going down a messy path and learning some things.  &lt;br /&gt;&lt;br /&gt;Java cannot zip folders and unzip them well.&lt;br /&gt;&lt;br /&gt;1. Java programs have to follow strict security rules that are set in the JRE bin.&lt;br /&gt;2. I don't fully understand the security posture of the machine that I am working on.&lt;br /&gt;3. I don't fully understand what the security rules are either.&lt;br /&gt;&lt;br /&gt;== Update ==&lt;br /&gt;I have nearly forgotten about this now I am faced with extracting a zipped folder once again. &lt;br /&gt;&lt;br /&gt;I ran into this error today:  What is strange about this is the way the slashes are facing.  I ran into someone today that said I should use 7Zip.  (Thanks Billy).  I used 7Zip to zip the files, but now I am starting to think that I may need to generate some more test files with the 7Zip- zipped folder outputs.  &lt;br /&gt;&lt;br /&gt;Extracting: ext-2.0.2/adapter/&lt;br /&gt;java.io.FileNotFoundException: ext-2.0.2\adapter (The system cannot find the path specified)&lt;br /&gt;        at java.io.FileOutputStream.open(Native Method)&lt;br /&gt;        at java.io.FileOutputStream.&lt;init&gt;(FileOutputStream.java:179)&lt;br /&gt;&lt;br /&gt;Before I do this, I am going to look into a suggestion made by Mike (see comments).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4405387796616069725?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4405387796616069725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4405387796616069725' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4405387796616069725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4405387796616069725'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/reading-jar-files-from-inside-jar.html' title='Reading Jar files from inside a Jar'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2340899982465024417</id><published>2008-07-23T08:10:00.000-07:00</published><updated>2009-04-13T05:23:37.022-07:00</updated><title type='text'>Build a PC or buy one?</title><content type='html'>I was faced with this decision and after much flip flopping whether to purchase a new manufactured PC or build my own I decided to build my own.  I decided that I can get much more computing power to construct my own.  My good buddy Sean M is going to help me walk through the steps of selecting the components and putting it together.&lt;br /&gt;&lt;br /&gt;I have to admit, there was a lot of flip flopping that took place with the ulitmate OS.  The big three were Mac, Linux, and Windows.  I love XP because it has always made my life easy, but a guy I know and respect switched to Mac.  In light of Vista troubles, I heavily, heavily leaned towards going with Mac.  I was reluctant to give up Microsoft because I know the OS so well.  In a turn of events however, I decided that niether choice was what I would go with.  I am going to try the open source route now that Linux has matured over time.  I am going to give Ubuntu a try, and dual load XP (64 bit).  &lt;br /&gt;&lt;br /&gt;Mac is too expensive and not powerful enough for me at this time.  &lt;br /&gt;&lt;br /&gt;Total cost for system will be : ~$600&lt;br /&gt;&lt;br /&gt;Components will include (more details to follow): &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Intel-Q6600-Quad-Core-Processor-Cache/dp/B000LRMR26"&gt;Intel Core 2 Quad Q6600&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newegg.com/product/product.aspx?Item=N82E16813131025&amp;nm_mc=KNC-GoogleAdwords&amp;cm_mmc=KNC-GoogleAdwords-_-NA-_-NA-_-NA"&gt;Asus P5H Delux mobo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4 gig Ram - no link!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.evga.com/articles/378.asp"&gt;512 eVGA 8800 GT Graphics Card &lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;Thanks Sean M for taking the time to work with me on this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2340899982465024417?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2340899982465024417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2340899982465024417' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2340899982465024417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2340899982465024417'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/build-cpu-or-buy-one.html' title='Build a PC or buy one?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5744540765685905659</id><published>2008-07-21T09:23:00.000-07:00</published><updated>2008-07-21T09:24:29.964-07:00</updated><title type='text'>GWT project creator open source</title><content type='html'>I kept having to make projects that have almost the exact same setups. It kind of got to be a pain to mess with command line prompts, so I spent 2 hours today writing this today to allow for simple easy use.&lt;br /&gt;&lt;br /&gt;Code:  &lt;a href="http://code.google.com/p/gwtprojectcreator/"&gt;http://code.google.com/p/gwtprojectcreator/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have tried to find a good eclipse plugin for GWT dev, but so far have not found anything decent to do this. Cypal looked promising, but they don't see themselves as a GWT project creator, more of a Web development environment that does GWT on a side note.&lt;br /&gt;&lt;br /&gt;This project is a pure swing application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5744540765685905659?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5744540765685905659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5744540765685905659' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5744540765685905659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5744540765685905659'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/gwt-project-creator-open-source.html' title='GWT project creator open source'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4869584048093444680</id><published>2008-07-10T11:11:00.000-07:00</published><updated>2008-07-10T11:12:15.337-07:00</updated><title type='text'>Restful Services - Getting Struts 2</title><content type='html'>Provided you still have a Struts2 checkout on your hard disk somewhere, in WindowsExplorer you can just right click on the top level dir and SVN update to checkout the latest HEAD revision of the trunk. You will also need the HEAD revision of XWorks now...on a peer top-level directory with the Struts2 code. XWork is here:  https://svn.opensymphony.com/svn/xwork/trunk&lt;br /&gt;&lt;br /&gt;Otherwise:&lt;br /&gt;&lt;br /&gt; https://svn.apache.org/repos/asf/struts/struts2/trunk&lt;br /&gt;&lt;br /&gt;Follow the directions   http://struts.apache.org/2.x/docs/building-the-framework-from-source.html&lt;br /&gt;&lt;br /&gt;and  particularly:         http://struts.apache.org/2.x/docs/building-with-maven.html   the paragraph about the XWork profile&lt;br /&gt;&lt;br /&gt;XWork gets built first and installed into your local Maven repository using:    mvn install&lt;br /&gt;Then, you can build Struts2...&lt;br /&gt;&lt;br /&gt;Thanks John M!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4869584048093444680?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4869584048093444680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4869584048093444680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4869584048093444680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4869584048093444680'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/restful-services-getting-struts-2.html' title='Restful Services - Getting Struts 2'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4928736875771723910</id><published>2008-07-10T10:36:00.000-07:00</published><updated>2008-07-10T13:31:30.326-07:00</updated><title type='text'>Using Command Line Compiler vice running in Hosted Mode</title><content type='html'>I tried to run in hosted mode but run into situations where I do not want to go through the compile/export JS.  These situations step from the fact that the GWT browser embeds itself with IE.  :-(   &lt;br /&gt;&lt;br /&gt; So, now I have a GWT project created with Cypal.  I want to figure out how to compile form command line in concrete easily repeatable steps and perhaps automate these procedures.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Basically, I am getting too busy to do a decent job of this.  I ended up building a eclipse project via command line and learned how GWT sets up the project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Steps&lt;/span&gt;&lt;br /&gt;1.  You need to create a Module-compile.bat file&lt;br /&gt;&lt;br /&gt;2. It will look something like this: &lt;br /&gt;&lt;blockquote&gt;@java -cp "%~dp0\src;%~dp0; gwt-user.jar; gwt-dev-windows.jar " com.google.gwt.dev.GWTCompiler -out "%~dp0\www" %* com.myStuff.Module&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;3. You are going to have to edit some things because if you run this, you are more than likely going to get this error:&lt;br /&gt;&lt;br /&gt;Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gwt/dev/GW&lt;br /&gt;TCompiler&lt;br /&gt;Caused by: java.lang.ClassNotFoundException: com.google.gwt.dev.GWTCompiler&lt;br /&gt;&lt;br /&gt;4. This worked when I put in the full path for each Jar.&lt;br /&gt;Also, you need to ensure that your class file is set correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4928736875771723910?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4928736875771723910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4928736875771723910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4928736875771723910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4928736875771723910'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/using-command-line-compiler-vice.html' title='Using Command Line Compiler vice running in Hosted Mode'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8820157345224137555</id><published>2008-07-10T10:12:00.000-07:00</published><updated>2008-07-10T10:33:10.277-07:00</updated><title type='text'>Maintaining My Software Dev</title><content type='html'>I was looking for a way to maintain my software dev background.  In my dev environment, there are certain restrictions that makes this difficult to do with consistency.  &lt;br /&gt;&lt;br /&gt;The most basic way that I can think is to maintain all code in SVN at all times.  Before I write a single line, the project should be archived in SVN.&lt;br /&gt;&lt;br /&gt;Additionally, I will keep track of all my Eclipse modules.  Right now, I am running Europa, but am making the transition to Ganymeade.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Here are the modules need to maintain my environment:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aptana: &lt;a href="http://www.aptana.com/docs/index.php/Plugging_Aptana_into_an_existing_Eclipse_configuration"&gt;http://www.aptana.com/docs/index.php/Plugging_Aptana_into_an_existing_Eclipse_configuration&lt;/a&gt;&lt;br /&gt;Cypal: &lt;a href="http://code.google.com/p/cypal-studio/downloads/list"&gt;http://code.google.com/p/cypal-studio/downloads/list&lt;/a&gt;&lt;br /&gt;SubEclipse : &lt;a href="http://subclipse.tigris.org/install.html"&gt;http://subclipse.tigris.org/install.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-8820157345224137555?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8820157345224137555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8820157345224137555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8820157345224137555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8820157345224137555'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/maintaining-my-software-dev.html' title='Maintaining My Software Dev'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7554312857524909736</id><published>2008-07-10T08:01:00.000-07:00</published><updated>2008-07-10T08:05:07.823-07:00</updated><title type='text'>Kimball Group - Data Warehousng</title><content type='html'>I joined the Kimball group to get a hold of some ideas for building large database warehouses.  &lt;br /&gt;&lt;br /&gt;The link that was forwarded to me with some design tips can be found here: &lt;br /&gt;&lt;a href="http://kimballgroup.com/html/07dt.html"&gt;http://kimballgroup.com/html/07dt.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Summary:  When building large database warehouses, you cannot throw machines, memory,and disk space at the problem.  You have to design and build massive systems with some key attributes in mind.  For a small fee, Kimball will help you do that!  :-)&lt;br /&gt;&lt;br /&gt;Thanks Jason F&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7554312857524909736?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7554312857524909736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7554312857524909736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7554312857524909736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7554312857524909736'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/kimball-group-data-warehousng.html' title='Kimball Group - Data Warehousng'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3230325967732677105</id><published>2008-07-09T11:22:00.000-07:00</published><updated>2009-06-13T10:51:23.054-07:00</updated><title type='text'>Google I/O Discussion</title><content type='html'>My Comments On:&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=vv2MnqP8Bmk&amp;amp;feature=PlayList&amp;amp;p=89854BC9F577BE78&amp;amp;index=1"&gt;http://www.youtube.com/watch?v=vv2MnqP8Bmk&amp;amp;feature=PlayList&amp;amp;p=89854BC9F577BE78&amp;amp;index=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first thing that I really liked was the info about getting rid of the giant static DOM file that was being used.  This giant DOM file is what allowed you to manipulate elements used to structure HTML documents.  See 4:30 ~ 5:10.  Summary - you can basically write Java code to implement an HTML.  This was written that was because it was faster when API was issued in GWT 1.4&lt;br /&gt;&lt;br /&gt;This allows you to more safely typecast DOM elements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3230325967732677105?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3230325967732677105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3230325967732677105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3230325967732677105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3230325967732677105'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/google-io-discussion.html' title='Google I/O Discussion'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7845916813743277315</id><published>2008-07-09T09:04:00.001-07:00</published><updated>2008-07-09T09:58:56.414-07:00</updated><title type='text'>Basic JS Api Tutorial - Making a JS API</title><content type='html'>I am writing this because I need to do a very basic JS tutorial.  There is too much that I don't know, although I am sure that I have seen this before.&lt;br /&gt;&lt;br /&gt;1. Understanding the DOM.  The DOM stands for Document Object Model.  It looks at a webpage in an object oriented way.  The document is a an object, and components like tables, frames, etc are all objects that get added to the document.  &lt;br /&gt;&lt;br /&gt;2. Actions can take place on the JS page.  &lt;br /&gt;&lt;br /&gt;3.  A good way to handle these actions is via Event Handlers.  There are different ways that JS is interpreted.  Firefox follows a top down approach whereas IE bubble up from the document.  Firefox's is the open standard, bit I think that IE makes more sense to me.  There are many design considerations that I am sure I have not considered here.&lt;br /&gt;&lt;br /&gt;4.  It is important to note that it is important to note where you put the js file.  If you put js in the head, it will execute when called.  If you put the code in the body, it will execute right away.  &lt;br /&gt;&lt;br /&gt;I think that rather than continue, I will host my js tutorial on googlecode so I can continue to play with it some more.  You can find it here:  &lt;a href="http://code.google.com/p/terrance-macgregor-js-tutorial-for-gwt"&gt;http://code.google.com/p/terrance-macgregor-js-tutorial-for-gwt&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7845916813743277315?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7845916813743277315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7845916813743277315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7845916813743277315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7845916813743277315'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/basic-js-api-tutorial-making-js-api.html' title='Basic JS Api Tutorial - Making a JS API'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2775969924043788169</id><published>2008-07-09T08:38:00.000-07:00</published><updated>2008-07-10T08:49:37.062-07:00</updated><title type='text'>Understanding GWT directory conventions</title><content type='html'>I have never really looked at all if the GWT naming conventions.  &lt;br /&gt;&lt;br /&gt;They can be found here: &lt;a href="http://code.google.com/docreader/#p(google-web-toolkit-doc-1-5)s(google-web-toolkit-doc-1-5)t(DevGuideDirectoriesPackageConventions)"&gt; http://code.google.com/docreader/#p(google-web-toolkit-doc-1-5)s(google-web-toolkit-doc-1-5)t(DevGuideDirectoriesPackageConventions)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My first impressions: This how all project should be created.&lt;br /&gt;&lt;br /&gt;Aside:  I submitted this to Cypal was shut down like the tractor beam on the Death Star:  &lt;a href="http://code.google.com/p/cypal-studio/issues/detail?id=98"&gt;http://code.google.com/p/cypal-studio/issues/detail?id=98&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;Use proper naming conventions for everything that you do.  Using proper naming conventions means that you will be better able to pick up and run with different source code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2775969924043788169?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2775969924043788169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2775969924043788169' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2775969924043788169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2775969924043788169'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/understanding-gwt-directory-conventions.html' title='Understanding GWT directory conventions'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6466714024538440251</id><published>2008-07-09T07:39:00.000-07:00</published><updated>2008-07-09T07:54:31.530-07:00</updated><title type='text'>Aptana for JavaScript Development - Great for GWT</title><content type='html'>I was just forwarded a link to this new tool called Aptana.  It is a JavaScript development plugin for Eclipse. I decided to write a quick review from the perspective of a Google Web Toolkit developer looking for a tool to read and edit java script.&lt;br /&gt;&lt;br /&gt;Installing:  &lt;br /&gt;The directions are very, very easy to use. &lt;br /&gt;&lt;br /&gt;This tool takes a long time to download.  This pretty much leads me to believe that there is a lot of libraries, etc.  It kind of gives me confidence that the software engineers did a lot of high level integration with this tool.  Since there is a professional edition, I assume that I just pulled down all of the professional stuff as well and would have to purchase some sort of key to turn it on, but I could be wrong.  &lt;br /&gt;&lt;br /&gt;I pulled down the freebie tool since it looks like it covers pretty much everything I need. You can see the two differences here: &lt;a href="http://www.aptana.com/studio"&gt;http://www.aptana.com/studio&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My very first impressions:&lt;br /&gt;&lt;br /&gt;When creating a new file, the options at the top of the page were perfect.  &lt;br /&gt;&lt;br /&gt;When looking at GWT compiles JS code, I was totally amazed.  This tool was awesome.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Summary:  Aptana is a great tool to add to my collection.  I will make it a basic load out on all JS work I have do, even if it just involves reading JS code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks Dan L!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6466714024538440251?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6466714024538440251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6466714024538440251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6466714024538440251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6466714024538440251'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/aptana-for-javascript-development-great.html' title='Aptana for JavaScript Development - Great for GWT'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3424054469605468715</id><published>2008-07-08T19:28:00.000-07:00</published><updated>2008-07-08T20:16:40.025-07:00</updated><title type='text'>Example: Building a Temporal Database</title><content type='html'>I am building a temporal database to ensure that I can maintain state change of a changed attribute.  &lt;br /&gt;&lt;br /&gt;How I am going to implement this is through three tables.  In this example, I will look  at modeling a circuit board.&lt;br /&gt;&lt;br /&gt;You have the following attributes in your main circuit board:&lt;br /&gt;&lt;br /&gt;table:circuit_board_table&lt;br /&gt;circuit_board_table_id:22121  &lt;span style="font-style:italic;"&gt;(prime key)&lt;/span&gt;&lt;br /&gt;circuit_board_power:on&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;input1_temporal_attribute_tracker: 3321&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am going to build a temporal_attribute_tracker for input1.  &lt;br /&gt;&lt;br /&gt;table: input1_temporal_attribute_tracker&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;input1_temporal_attribute_tracker_id:3321 &lt;/span&gt;&lt;span style="font-style:italic;"&gt;(prime key)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;input1_temporal_state_id:3302&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No, I going to have a rather large table of the different values that input1 has.  If input1 never changed state however, there will only be one value in here.  If Input1 changed a million times, we should have pretty good performance because our lookup into this table is based on the index.&lt;br /&gt;&lt;br /&gt;Our final table will look something like this:&lt;br /&gt;&lt;br /&gt;table: input1_temporal_state&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;input1_temporal_state_id: 3302 &lt;/span&gt; &lt;span style="font-style:italic;"&gt;(prime key)&lt;/span&gt;&lt;br /&gt;bitvalue:01011000&lt;br /&gt;time_start: 08 July 2008&lt;br /&gt;time_end: 09 July 2008&lt;br /&gt;input1_temporal_attribute_tracker_id: 3321&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Jason F!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3424054469605468715?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3424054469605468715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3424054469605468715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3424054469605468715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3424054469605468715'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/example-building-temporal-database.html' title='Example: Building a Temporal Database'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2288533220100138937</id><published>2008-07-01T06:13:00.001-07:00</published><updated>2008-07-01T06:13:58.061-07:00</updated><title type='text'>GWT  - MVC - Building Independent modules that don't know jack about each other</title><content type='html'>Some of the options as I see them are: &lt;br /&gt;&lt;br /&gt;1. Use the traditional MVC approach. &lt;br /&gt;&lt;br /&gt;    Benefits -     This is straight forward,&lt;br /&gt;                All Ajax calls are local&lt;br /&gt;    Drawbacks - but gets confusing very quickly&lt;br /&gt;        Difficult to test&lt;br /&gt;&lt;br /&gt;2.  Build a super thin client - all logic is held in the server. &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I am looking into how to build a MVC type interface for GWT.  One of the articles that I read mentioned Spring Webflow.&lt;br /&gt;&lt;br /&gt;Webflow is used&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2288533220100138937?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2288533220100138937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2288533220100138937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2288533220100138937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2288533220100138937'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/07/gwt-mvc-building-independent-modules.html' title='GWT  - MVC - Building Independent modules that don&apos;t know jack about each other'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1662173410487508150</id><published>2008-06-28T00:48:00.001-07:00</published><updated>2008-06-28T01:45:01.569-07:00</updated><title type='text'>Yes, the end of the universe does really matter</title><content type='html'>Several months ago, I found an educational show called "&lt;a href="http://science.discovery.com/convergence/cosmos/cosmos.html"&gt;The Cosmos&lt;/a&gt;" (hosted by Carl Sagan)  and was stunned with the clear explanations of things like:  What would things look like while you were moving at the speed of light? &lt;br /&gt;&lt;br /&gt;     One time, Carl Sagan explained the expansion of the universe and how the birth and death of stars helps in the process of spreading out energy.  In the end, the universe, whatever the bounds are, will contain energy that is so incredibly spread out, that it will be unusable.  This means that stars will eventually burn out as galaxies burn and disperse matter throughout the universe.  The universe will go cold and dark, and life as we know, will not exist.&lt;br /&gt;&lt;br /&gt;     This thought really bugged me and for weeks was dormant until 3 am today.  While on vacation in beautiful Ocean City, MD , this notion really bothered me enough that I stumbled down to the lobby computer and started looking at different articles on the internet until I found this &lt;a href=" http://www.slate.com/id/2096491/"&gt;nice summary&lt;/a&gt; by Jim Hold from "The Slate". &lt;br /&gt;&lt;br /&gt;To sum up the article:&lt;br /&gt;&lt;br /&gt;     The cosmos has three possible fates: Big Crunch (eventual collapse), Big Chill (expansion forever at a steady rate), or Big Crackup (expansion forever at an accelerating rate).  &lt;br /&gt;&lt;br /&gt;     My personal hypothesis is that the Big Chill is the most likely of fates for the universe.  I base this on the fact this it seems like the most logical (and most boring).  My secret hope is that we will intellectually evolve to the point that we have an understanding of space/time so we can escape this fate.  This requires us to survive long enough to achieve this.  What will this mean?  I like Stephen Hawking's view that space is our best chance for survival - in the short term future as a hedge against our planet's destruction.  Nice huh?&lt;br /&gt;&lt;br /&gt;    In the mean time :-) , today I will go to the beach with my children and we will build sand castles for hours.  I know that whatever we build will eventually be washed out to sea, but cannot think of a more enjoyable way to spend an afternoon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1662173410487508150?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1662173410487508150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1662173410487508150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1662173410487508150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1662173410487508150'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/does-end-of-universe-really-matter.html' title='Yes, the end of the universe does really matter'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3422376044727995389</id><published>2008-06-20T09:59:00.001-07:00</published><updated>2008-06-20T09:59:49.094-07:00</updated><title type='text'>My Favorite Wiki Entry</title><content type='html'>Any reasonably competent java programmer should be able to understand how things hang together by a cursory look at the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3422376044727995389?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3422376044727995389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3422376044727995389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3422376044727995389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3422376044727995389'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/my-favorite-wiki-entry.html' title='My Favorite Wiki Entry'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2773493876425751465</id><published>2008-06-20T09:27:00.000-07:00</published><updated>2008-06-28T01:51:41.587-07:00</updated><title type='text'>Taking the Similie Timeline and putting it into a GWT panel</title><content type='html'>Ok, I have been asked to put the Similie Timeline into a GWT panel.  Similie is a Javascript timeline tool that provides a really cool sliding timeline that can be used to plot events as they occur.  It looks like it has found a home at MIT. To read more about it, see their homepage:  &lt;a href="http://simile.mit.edu/timeline/"&gt;&lt;/a&gt; http://code.google.com/p/simile-widgets/&lt;br /&gt;&lt;br /&gt;There are the steps that I have taken:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Follow the directions!&lt;/span&gt; My first thought was to get this up and running into a regular webpage.  The test worked fine, although since I am not super familar with JavaScript, it took me a while to get the bugs worked out.  Overall, the tutorial on the page was one of the best.  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;2. GWT Widget:&lt;/span&gt; After getting this to work, I looked for some source code that would bring this application into GWT.  This is fundamentally because I am lazy.  :-)    What I found was a very promising tool that wraps the java script into an easy to use GWT object.  &lt;br /&gt;Here is the project homepage: &lt;a href="http://code.google.com/p/gwtsimiletimeline/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, I have not gotten a single thing to compile.  This is primarily due to my inability to execute the source code upon direct download of the example.&lt;br /&gt;&lt;br /&gt;When using the jar, I ended up building the demo from scratch and got this error: &lt;br /&gt;&lt;br /&gt;com.google.gwt.core.client.JavaScriptException: JavaScript TypeError exception: '$wnd.Ext.StatusBar' is null or not an object&lt;br /&gt;&lt;br /&gt;What does this mean?  I am not super sure.  Since I was getting this error, I decided to build the example and not have any wrappers that were mine, i.e. I have my own project source , path, and variables that were set up by Cypal Studios.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Building GWT Example:&lt;/span&gt; My attempt to build the project from the source code:&lt;br /&gt;&lt;br /&gt;This was successful and after linking in GWT-1.4 and GWT 1.5, I realized that there was compatibility issue that needed to be addressed.  gwtsimiletimeline was only 1.4 compatible.  It turns out that for JavaScriptObjects, methods must be final.  So, I basically modified the source code.  I contacted the author and plan on uploading my changes via SVN now that the Author has given me access.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2773493876425751465?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2773493876425751465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2773493876425751465' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2773493876425751465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2773493876425751465'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/taking-similie-timeline-and-putting-it.html' title='Taking the Similie Timeline and putting it into a GWT panel'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5447564079983947184</id><published>2008-06-18T12:30:00.000-07:00</published><updated>2008-06-18T14:06:00.319-07:00</updated><title type='text'>How to put Google Maps onto a GWT Panel</title><content type='html'>This seems like a very east thing to do, but what I have found is that this topic takes a while to think about.  Lets dig into the steps that you need to take.&lt;br /&gt;&lt;br /&gt;Step One - You need to get a key!  So, if you are on a dev machine, how do you do this on your local machine without going out to your URL?    This seems like a bad idea, but I haven't dug into this very much for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5447564079983947184?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5447564079983947184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5447564079983947184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5447564079983947184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5447564079983947184'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/how-to-put-google-maps-onto-gwt-panel.html' title='How to put Google Maps onto a GWT Panel'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2451643347103628608</id><published>2008-06-10T08:13:00.001-07:00</published><updated>2008-06-10T08:41:35.499-07:00</updated><title type='text'>KML files - parsing</title><content type='html'>KML files are the proprietary Google maps files that are used in Google Earth's mapping software to display information.  &lt;br /&gt;&lt;br /&gt;In my case, I have a KML file with all of the timezones in it.  What I want to do, is take this KML file, pull out the coordinates, and then transform these points into a line in a another mapping coordinate system.  &lt;br /&gt;&lt;br /&gt;What is the best approach for this?  Well, it turns out that the KML file uses an XML format that looks like this, ok, this is going to look a little messy.  The prize here is the coordinate system below.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;      -name-Google Earth - New Path-/name-&lt;br /&gt;      -styleUrl-#khStyle638-/styleUrl-&lt;br /&gt;      =LineString-&lt;br /&gt;        -tessellate-1-/tessellate-&lt;br /&gt;        -coordinates-&lt;br /&gt;157.4635479459411,48.88556772149639,0 160.989350637593,48.87562436281718,0 164.97156604507,48.86393537709938,0 168.9145407078514,48.83384052286056,0 172.9673412982646,48.84913100689874,0 179.9756526485466,51.01499857372254,0 &lt;br /&gt;        -/coordinates-&lt;br /&gt;      -/LineString-&lt;br /&gt;    -/Placemark-&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style="font-weight:bold;"&gt;libkml-0.2.2&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;So, what is the best way to parse this file?    Google apparently put together a new library called libkml-0.2.2.  It is a c++ application.  So, how am I going to integrate this with Java?  I would normally love to get a nice easy to use jar file, but this situation is a little different.  I have to download the the visual studio framework and compile this code for my windows XP box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2451643347103628608?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2451643347103628608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2451643347103628608' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2451643347103628608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2451643347103628608'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/blog-post.html' title='KML files - parsing'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5524034323311440178</id><published>2008-06-09T00:01:00.001-07:00</published><updated>2008-06-09T00:04:25.536-07:00</updated><title type='text'>Java Persistence with Hibernate - Inital Tutorial sucess</title><content type='html'>I got up to page 68 in this and successfully completed the tutorial geared towards operating Hibernate with the HSQLDB.  &lt;br /&gt;&lt;br /&gt;I think that the most I have gained from this lesson is getting comfortable with the terminology.  The book assumes that you know what things like Thread safe are, which is nice because you don't get bogged down with things that you already know.&lt;br /&gt;&lt;br /&gt;So far, there have been some valuable lessons learned.  I look forward to looking at the JPA implementation.  This seems like a much more interesting topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5524034323311440178?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5524034323311440178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5524034323311440178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5524034323311440178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5524034323311440178'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/java-persistence-with-hibernate-inital.html' title='Java Persistence with Hibernate - Inital Tutorial sucess'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2923720894556733418</id><published>2008-06-04T12:45:00.000-07:00</published><updated>2008-06-04T12:49:19.782-07:00</updated><title type='text'>Geonames Web Service</title><content type='html'>I am using the geonames web service to determine current time in a different timezone based on lat/long.&lt;br /&gt;&lt;br /&gt;I am having some issues because the main web service fails a lot.  The server is located here:  http://ws.geonames.org.  &lt;br /&gt;&lt;br /&gt;Looking inside the code, you can clearly see that &lt;br /&gt;&lt;br /&gt;Deeper inspection into the source code shows you where the server is &lt;br /&gt;located: WebService.java&lt;br /&gt;&lt;br /&gt; private static String geoNamesServer = "http://ws.geonames.org";&lt;br /&gt; private static String geoNamesServerFailover = "http://ws.geonames.org";&lt;br /&gt;&lt;br /&gt;I shot and email to the creator of geonames.org to see if another server is dedicated as the failover.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2923720894556733418?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2923720894556733418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2923720894556733418' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2923720894556733418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2923720894556733418'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/geonames-web-service.html' title='Geonames Web Service'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4759413387344075034</id><published>2008-06-02T12:03:00.000-07:00</published><updated>2008-06-02T12:23:15.328-07:00</updated><title type='text'>MVC Review</title><content type='html'>I was recently thrown into a software project with extensive use of Model View Controller architecture.  I think that is it worth is&lt;br /&gt;to review some of the basics associated with this approach and make sure that these concepts are cemented in my head.  &lt;br /&gt;So here are some vauge notes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.  A model always updates the view.  This is where the data comes from.Data always from the view.&lt;br /&gt;&lt;br /&gt;2. An Event is fired on a Controller, which sees fit to take some action.  The controller&lt;br /&gt;will either take action on the view or on the data model to change the model.&lt;br /&gt;&lt;br /&gt;3. The model updates the view automatically.  &lt;br /&gt;&lt;br /&gt;4. The view updates the controller only, not the model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4759413387344075034?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4759413387344075034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4759413387344075034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4759413387344075034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4759413387344075034'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/06/mvc-review.html' title='MVC Review'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6192529165717571313</id><published>2008-05-27T12:28:00.000-07:00</published><updated>2008-05-27T13:13:47.523-07:00</updated><title type='text'>Testing GWT with JUnit</title><content type='html'>Ok, I have a very large project working right now with virtually no JUnit testing.  I need to figure a way to start JUnit testing with an integrated wholistic approach for a project that doesn't have anything set up. To do this, I am turning to "GWT in Action", the testing and deploying GWT applications chapter (16).&lt;br /&gt;&lt;br /&gt;Following the steps one by one, I will evaluate this chapter along with other sources as I got through my project.&lt;br /&gt;&lt;br /&gt;16.1 - GWT decided to go with JUnit testing because it is the standard way Java is tested.  &lt;br /&gt;&lt;br /&gt;16.1.1 Overview of JUnit&lt;br /&gt;&lt;br /&gt;It is important to know that JUnit version 3.8.x is compatible with GWT.  Later version s have Java 5 code in it.&lt;br /&gt;&lt;br /&gt;Ok, I went through the basic JUnit portion.  It was very well done.  &lt;br /&gt;&lt;br /&gt;The part where I hit a roadblock was with setting up junitCreator with an already established project that isn't using junitCreator.  If you follow this book, then you  create the project with junitCreator in the beginning.  So, basically, I am torn between figuring out how to integrate this into my project or just hand coding my test units and testing the data from within the framework. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, I will just hand code for now, but I will make note of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6192529165717571313?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6192529165717571313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6192529165717571313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6192529165717571313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6192529165717571313'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/testing-gwt-with-junit.html' title='Testing GWT with JUnit'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4609357797785817024</id><published>2008-05-22T13:45:00.000-07:00</published><updated>2008-05-22T13:47:32.385-07:00</updated><title type='text'>Struts 2.11</title><content type='html'>I downloaded Struts 2.11 from the SVN archive and built it with Maven.  This whole process took about and hour.  There are a lot of files and tests to run.&lt;br /&gt;&lt;br /&gt;SVN archive: https://svn.apache.org/repos/asf/struts/struts2/trunk/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Deploy the rest War - This can be found in the app section that is included with the distribution.&lt;br /&gt;&lt;br /&gt;Note, this is a memory hog.  It is best to remove this from the server when you are done with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4609357797785817024?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4609357797785817024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4609357797785817024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4609357797785817024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4609357797785817024'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/struts-211.html' title='Struts 2.11'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4681209439803455200</id><published>2008-05-14T11:41:00.000-07:00</published><updated>2008-05-14T11:44:53.828-07:00</updated><title type='text'>Using Open Map with GWT - JRE issues</title><content type='html'>I started looking at pulling Openmap into GWT and quickly ran into this problem.&lt;br /&gt;&lt;br /&gt;[javac] bad class file: E:\temp\lib\openmap.jar(com/bbn/openmap/LatLonPoint.class)&lt;br /&gt;[javac] class file has wrong version 50.0, should be 49.0&lt;br /&gt;[javac] Please remove or make sure it appears in the correct subdirectory of the classpath.&lt;br /&gt;&lt;br /&gt;What I found was that there were some issues with compiling GWT (JRE 1.4 compliant - well, sort of) and running JRE v. 1.5 as a command line option to a JRE with version 1.6.  &lt;br /&gt;&lt;br /&gt;If you run Open map and compile GWT code, I found that if you run the server with 1.6, you should be ok.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4681209439803455200?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4681209439803455200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4681209439803455200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4681209439803455200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4681209439803455200'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/using-open-map-with-gwt-jre-issues.html' title='Using Open Map with GWT - JRE issues'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2369006068188967316</id><published>2008-05-14T11:34:00.000-07:00</published><updated>2008-05-14T11:40:55.507-07:00</updated><title type='text'>One of the worst Java Compilation Errors: Class wrong version</title><content type='html'>If you have ever gotten this error before, you know how dificult this can be to debug. &lt;br /&gt;&lt;br /&gt;[javac] class file has wrong version 50.0, should be 49.0&lt;br /&gt;[javac] Please remove or make sure it appears in the correct subdirectory of the classpath.&lt;br /&gt;&lt;br /&gt;The only suggestion that I have is to have the same exact JRE and JDK on both the production and environment and development environment. &lt;br /&gt;&lt;br /&gt;In this case, I had to make sure that the b releases were accurate. So, here is what I had running on my machine:&lt;br /&gt;&lt;br /&gt;Dev Machine JRE : build 1.6.0_05-b13.  &lt;br /&gt;&lt;br /&gt;Production JRE:  build 1.6.0_06-b02&lt;br /&gt;&lt;br /&gt;I ended up loading the server with:  1.6.0_04_b12&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2369006068188967316?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2369006068188967316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2369006068188967316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2369006068188967316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2369006068188967316'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/one-of-worst-java-compilation-errors.html' title='One of the worst Java Compilation Errors: Class wrong version'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-7957959596049839393</id><published>2008-05-14T08:28:00.000-07:00</published><updated>2008-05-14T08:29:27.304-07:00</updated><title type='text'>Firebug Sucks</title><content type='html'>Ok, it really doesn't. I would be blind to coding errors without this tool.  Thanks you Mozilla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-7957959596049839393?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/7957959596049839393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=7957959596049839393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7957959596049839393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/7957959596049839393'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/firebug-sucks.html' title='Firebug Sucks'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2238185359776048773</id><published>2008-05-13T05:01:00.000-07:00</published><updated>2008-05-13T05:07:50.838-07:00</updated><title type='text'>Registering HTML panel click and mouse down</title><content type='html'>This is kind of a frustrating issue: I am trying to handle a native browser event in GWT via the class com.google.gwt.user.client.Event. The event that is passed has these fields in it.  See below.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Here is the funny part - what is the different between:&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user depresses a mouse button over an element.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONMOUSEDOWN = 0x00004;&lt;br /&gt; &lt;br /&gt;and &lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * The middle mouse button (used in {@link DOM#eventGetButton(Event)}).&lt;br /&gt;   */&lt;br /&gt;  public static final int BUTTON_MIDDLE = 4;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the middle button is presses, you have two actions taking place here. &lt;br /&gt;&lt;br /&gt;OnMouseDown fires first, button registration takes place next.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What is the answer here?  Maybe I should not be using this method in my HTMLPanel directly.  &lt;br /&gt;I would be nice to add a mouse listener to my HTML Panel directly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;**&lt;br /&gt; * An opaque handle to a native DOM Event. An &lt;code&gt;Event&lt;/code&gt; cannot be&lt;br /&gt; * created directly. Instead, use the &lt;code&gt;Event&lt;/code&gt; type when returning a&lt;br /&gt; * native DOM event from JSNI methods. An &lt;code&gt;Event&lt;/code&gt; passed back into&lt;br /&gt; * JSNI becomes the original DOM event the &lt;code&gt;Event&lt;/code&gt; was created&lt;br /&gt; * from, and can be accessed in JavaScript code as expected. This is typically&lt;br /&gt; * done by calling methods in the {@link com.google.gwt.user.client.DOM} class.&lt;br /&gt; */&lt;br /&gt;public final class Event extends JavaScriptObject {&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * The left mouse button (used in {@link DOM#eventGetButton(Event)}).&lt;br /&gt;   */&lt;br /&gt;  public static final int BUTTON_LEFT = 1;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * The middle mouse button (used in {@link DOM#eventGetButton(Event)}).&lt;br /&gt;   */&lt;br /&gt;  public static final int BUTTON_MIDDLE = 4;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * The right mouse button (used in {@link DOM#eventGetButton(Event)}).&lt;br /&gt;   */&lt;br /&gt;  public static final int BUTTON_RIGHT = 2;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when an element loses keyboard focus.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONBLUR = 0x01000;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the value of an input element changes.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONCHANGE = 0x00400;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user clicks on an element.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONCLICK = 0x00001;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user double-clicks on an element.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONDBLCLICK = 0x00002;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when an image encounters an error.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONERROR = 0x10000;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when an element receives keyboard focus.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONFOCUS = 0x00800;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user depresses a key.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONKEYDOWN = 0x00080;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the a character is generated from a keypress (either directly or&lt;br /&gt;   * through auto-repeat).&lt;br /&gt;   */&lt;br /&gt;  public static final int ONKEYPRESS = 0x00100;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user releases a key.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONKEYUP = 0x00200;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when an element (normally an IMG) finishes loading.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONLOAD = 0x08000;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when an element that has mouse capture loses it.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONLOSECAPTURE = 0x02000;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Fired when the user depresses a mouse button over an element.&lt;br /&gt;   */&lt;br /&gt;  public static final int ONMOUSEDOWN = 0x00004;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2238185359776048773?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2238185359776048773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2238185359776048773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2238185359776048773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2238185359776048773'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/registering-html-panel-click-and-mouse.html' title='Registering HTML panel click and mouse down'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6046299864521603401</id><published>2008-05-12T09:24:00.000-07:00</published><updated>2008-05-12T09:49:34.536-07:00</updated><title type='text'>Understanding GWT event handling life cycle</title><content type='html'>1. When you make a panel, you need to sink the events inside the panel.  Every single widget implements the EventListener interface.  Lets take a look at HTMLPanel as an example.  Before we do this, we have to understand the interface EventListener.&lt;br /&gt;&lt;br /&gt;What this basically means, is that every single widget implements this method:  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  public interface EventListener {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Fired whenever a browser event is received.&lt;br /&gt;     * &lt;br /&gt;     * @param event the event received&lt;br /&gt;    */&lt;br /&gt;    void onBrowserEvent(Event event);&lt;br /&gt;  }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Looking at HTMLPanel, we see the hierarchy: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_mrInYe5_WBM/SChxM2K_RuI/AAAAAAAAAN0/K0IFX7TlF4g/s1600-h/HTML_Hierarchy.bmp"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_mrInYe5_WBM/SChxM2K_RuI/AAAAAAAAAN0/K0IFX7TlF4g/s320/HTML_Hierarchy.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5199530235313211106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Setting sink events. This function is located in UIObjects (base class in GWT) and looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Adds a set of events to be sunk by this object. Note that only&lt;br /&gt;   * {@link Widget widgets} may actually receive events, but can receive events&lt;br /&gt;   * from all objects contained within them.&lt;br /&gt;   * &lt;br /&gt;   * @param eventBitsToAdd a bitfield representing the set of events to be added&lt;br /&gt;   *          to this element's event set&lt;br /&gt;   * @see com.google.gwt.user.client.Event&lt;br /&gt;   */&lt;br /&gt;  public void sinkEvents(int eventBitsToAdd) {&lt;br /&gt;    DOM.sinkEvents(getElement(), eventBitsToAdd&lt;br /&gt;        | DOM.getEventsSunk(getElement()));&lt;br /&gt;  }&lt;br /&gt;&lt;/Pre&gt;&lt;br /&gt;&lt;br /&gt;What exactly does this mean?   I have no idea, but I think that you are required to register different int to represent different listening events.  Looks pretty sloppy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, you need to overload the method onBrowserEvent().  This event is implemented in Widget, but is empty.  Here is what it looks like:&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;public void onBrowserEvent(Event event) {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Now, all you need is to glue your panel to the DOM structure.  If you remember, Java objects in GWT have a dual relationship between POJO (Plain old Java Object) and DOM.&lt;br /&gt;You do this by sticking your widget onto the browser page: RootPanel.add(myWidget);/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-6046299864521603401?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6046299864521603401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6046299864521603401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6046299864521603401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6046299864521603401'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/understanding-gwt-event-handling-life.html' title='Understanding GWT event handling life cycle'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_mrInYe5_WBM/SChxM2K_RuI/AAAAAAAAAN0/K0IFX7TlF4g/s72-c/HTML_Hierarchy.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4004040312874933022</id><published>2008-05-12T08:44:00.000-07:00</published><updated>2008-05-12T09:11:00.892-07:00</updated><title type='text'>How does  a GWT application register event handling upon initilization?</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Ok, prepare to be confused with this section.  To do, read other sources of GWT documentation and clean this up.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GWT load a global event handler at the document level.  The event handler has two different ways of doing this. &lt;br /&gt;&lt;br /&gt;One - It loads the standard event capturing model.  In order to follow the W3C implementation, events are added in the following format.  &lt;br /&gt;&lt;br /&gt;  $wnd.addEventListener('mousedown', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;&lt;br /&gt;Note: $wnd = the Java Script window.&lt;br /&gt;      true at the end means that this is a W3C compliant case and that the event should be handled during the capture, meaning that the doc gets to handle the event  first.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Two - I makes adjustments for IE browsers.  You can find this implementation in DOMImplIE6.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Looking at the mousedown event, you can find this here:  &lt;br /&gt;&lt;br /&gt;  $doc.body.onmousedown   =&lt;br /&gt;&lt;br /&gt;The main different here is that doc = the JS document object.  wnd is the java script window.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Looking at the DOMImplIE6 init code, here is what I found.  &lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;public native void init() /*-{&lt;br /&gt;    // Fix IE background image refresh bug, present through IE6&lt;br /&gt;    // see http://www.mister-pixel.com/#Content__state=is_that_simple&lt;br /&gt;    // this only works with IE6 SP1+&lt;br /&gt;    try {&lt;br /&gt;      $doc.execCommand("BackgroundImageCache", false, true);&lt;br /&gt;    } catch (e) {&lt;br /&gt;      // ignore error on other browsers&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;    // Set up event dispatchers.&lt;br /&gt;    $wnd.__dispatchEvent = function() {&lt;br /&gt;      // IE doesn't define event.currentTarget, so we squirrel it away here. It&lt;br /&gt;      // also seems that IE won't allow you to add expandos to the event object,&lt;br /&gt;      // so we have to store it in a global. This is ok because only one event&lt;br /&gt;      // can actually be dispatched at a time.&lt;br /&gt;      var oldEventTarget = @com.google.gwt.user.client.impl.DOMImplIE6::currentEventTarget;&lt;br /&gt;      @com.google.gwt.user.client.impl.DOMImplIE6::currentEventTarget = this;&lt;br /&gt;&lt;br /&gt;      if ($wnd.event.returnValue == null) {&lt;br /&gt;        $wnd.event.returnValue = true;&lt;br /&gt;        if (!@com.google.gwt.user.client.DOM::previewEvent(Lcom/google/gwt/user/client/Event;)($wnd.event)) {&lt;br /&gt;          @com.google.gwt.user.client.impl.DOMImplIE6::currentEventTarget = oldEventTarget;&lt;br /&gt;          return;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      var listener, curElem = this;&lt;br /&gt;      while (curElem &amp;&amp; !(listener = curElem.__listener))&lt;br /&gt;        curElem = curElem.parentElement;&lt;br /&gt;&lt;br /&gt;      if (listener)&lt;br /&gt;        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)($wnd.event, curElem, listener);&lt;br /&gt;&lt;br /&gt;      @com.google.gwt.user.client.impl.DOMImplIE6::currentEventTarget = oldEventTarget;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    $wnd.__dispatchDblClickEvent = function() {&lt;br /&gt;      var newEvent = $doc.createEventObject();&lt;br /&gt;      this.fireEvent('onclick', newEvent);&lt;br /&gt;      if (this.__eventBits &amp; 2)&lt;br /&gt;        $wnd.__dispatchEvent.call(this);&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    $doc.body.onclick       =&lt;br /&gt;     &lt;br /&gt;    $doc.body.onmouseup     =&lt;br /&gt;    $doc.body.onmousemove   =&lt;br /&gt;    $doc.body.onmousewheel  =&lt;br /&gt;    $doc.body.onkeydown     =&lt;br /&gt;    $doc.body.onkeypress    =&lt;br /&gt;    $doc.body.onkeyup       =&lt;br /&gt;    $doc.body.onfocus       =&lt;br /&gt;    $doc.body.onblur        =&lt;br /&gt;    $doc.body.ondblclick    = $wnd.__dispatchEvent;&lt;br /&gt;  }-*/;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Here is what the standard DOMImplStandard init() function looks like: &lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  public native void init() /*-{&lt;br /&gt;    // Set up capture event dispatchers.&lt;br /&gt;    $wnd.__dispatchCapturedMouseEvent = function(evt) {&lt;br /&gt;      if ($wnd.__dispatchCapturedEvent(evt)) {&lt;br /&gt;        var cap = $wnd.__captureElem;&lt;br /&gt;        if (cap &amp;&amp; cap.__listener) {&lt;br /&gt;          @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)(evt, cap, cap.__listener);&lt;br /&gt;          evt.stopPropagation();&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    $wnd.__dispatchCapturedEvent = function(evt) {&lt;br /&gt;      if (!@com.google.gwt.user.client.DOM::previewEvent(Lcom/google/gwt/user/client/Event;)(evt)) {&lt;br /&gt;        evt.stopPropagation();&lt;br /&gt;        evt.preventDefault();&lt;br /&gt;        return false;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return true;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    $wnd.addEventListener('click', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('dblclick', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('mousedown', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('mouseup', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('mousemove', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('mousewheel', $wnd.__dispatchCapturedMouseEvent, true);&lt;br /&gt;    $wnd.addEventListener('keydown', $wnd.__dispatchCapturedEvent, true);&lt;br /&gt;    $wnd.addEventListener('keyup', $wnd.__dispatchCapturedEvent, true);&lt;br /&gt;    $wnd.addEventListener('keypress', $wnd.__dispatchCapturedEvent, true);&lt;br /&gt;&lt;br /&gt;    // Set up normal event dispatcher.&lt;br /&gt;    $wnd.__dispatchEvent = function(evt) {&lt;br /&gt;      var listener, curElem = this;&lt;br /&gt;      while (curElem &amp;&amp; !(listener = curElem.__listener))&lt;br /&gt;        curElem = curElem.parentNode;&lt;br /&gt;      if (curElem &amp;&amp; curElem.nodeType != 1)&lt;br /&gt;        curElem = null;&lt;br /&gt;&lt;br /&gt;      if (listener)&lt;br /&gt;        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)(evt, curElem, listener);&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    $wnd.__captureElem = null;&lt;br /&gt;  }-*/;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4004040312874933022?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4004040312874933022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4004040312874933022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4004040312874933022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4004040312874933022'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/how-does-gwt-application-register-event.html' title='How does  a GWT application register event handling upon initilization?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3030952772573697884</id><published>2008-05-12T08:39:00.001-07:00</published><updated>2008-05-12T08:43:59.588-07:00</updated><title type='text'>What are the two main ways that web browers deal with event processing?</title><content type='html'>The first method is via the event bubbling process.  The Event Bubbling process basically states that each element gets the event first.  From there, the event gets passed back from that element, to the parent element on down until the the event reaches the document.  The only browser that uses this method is Microsoft's IE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The second method that browsers have adopted is the event capture model.  In this example, the document receives the event and then passes the event to the right object.  This is the open standard for browser event handling.  After typing this in and knowing that this is the right solution, this way seems like a lot of overhead for the program to deal with.  With these complications however, it is probably a more usable and flexible solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3030952772573697884?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3030952772573697884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3030952772573697884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3030952772573697884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3030952772573697884'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/what-are-two-main-ways-that-web-browers.html' title='What are the two main ways that web browers deal with event processing?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-1519673724669043405</id><published>2008-05-09T02:47:00.001-07:00</published><updated>2008-05-09T02:53:15.550-07:00</updated><title type='text'>Good JavaScript/GWT Quote</title><content type='html'>I have spent some time integrating Java Script libraries into a Google Web Toolkit interface and just heard one of the best quotes (ok, best computer code quotes):  &lt;br /&gt;&lt;br /&gt;"JavaScript is now the assembly code of the web."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-1519673724669043405?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/1519673724669043405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=1519673724669043405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1519673724669043405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/1519673724669043405'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/good-javascriptgwt-quote.html' title='Good JavaScript/GWT Quote'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-165407512227153393</id><published>2008-05-02T03:52:00.000-07:00</published><updated>2008-05-02T03:58:33.688-07:00</updated><title type='text'>Java Applets making a come back?</title><content type='html'>I was forwarded this blogged item from a collegue and was very impressed.  Not only was this applet cleaver, but it worked wonderfully.    &lt;br /&gt;&lt;br /&gt;http://shemnon.com/speling/2008/04/consumer-jre-i-think-they-may.html&lt;br /&gt;&lt;br /&gt;The author of the applet was Ben Fry, a guy I never heard of.  Check out another one of his handy works!&lt;br /&gt;&lt;br /&gt;http://benfry.com/isometricblocks/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-165407512227153393?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/165407512227153393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=165407512227153393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/165407512227153393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/165407512227153393'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/05/java-applets-making-come-back.html' title='Java Applets making a come back?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-972894290649830924</id><published>2008-04-30T17:39:00.000-07:00</published><updated>2008-04-30T17:52:39.704-07:00</updated><title type='text'>How does GWT parse JSON Data?</title><content type='html'>Source: &lt;a href="http://www.manning.com/hanson/"&gt;GWT In Action  &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GWT created their own parser called JSONParser.  &lt;br /&gt;&lt;br /&gt;This code breaks apart your JSON in a very easy to use way.  Here is my demo of it:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt; /** I wrote this code because I wanted to test to see how I&lt;br /&gt;  * could parse JSON data using GWT. */&lt;br /&gt; public static boolean isThisJsonStringValid(String iJSonString) { &lt;br /&gt;  JSONValue json;&lt;br /&gt;  try {&lt;br /&gt;        json = JSONParser.parse(iJSonString);      &lt;br /&gt;  } catch ( JSONException e) {&lt;br /&gt;   return false;&lt;br /&gt;  }  &lt;br /&gt;  return true;&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/7265231704525907886-972894290649830924?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/972894290649830924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=972894290649830924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/972894290649830924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/972894290649830924'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/how-does-gwt-parse-json-data.html' title='How does GWT parse JSON Data?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-6921598869805826525</id><published>2008-04-30T17:29:00.000-07:00</published><updated>2008-04-30T17:39:23.656-07:00</updated><title type='text'>What is JSON?</title><content type='html'>JavaScriptObjectNoation (JSON) was designed to be an easy to read formated text message with little overhead.  &lt;br /&gt;&lt;br /&gt;This language is the best to use to communicate with the client  and server because it is so easy to use and has been widely adopted.  &lt;br /&gt;&lt;br /&gt;What makes JSON such a cool language is that an JSON object is actually a string that when pulled out, is actually working JavaScript code.&lt;br /&gt;&lt;br /&gt;What can JSON read?  JSON can only read basic text, null, boolean, array, and an object.  &lt;br /&gt;&lt;br /&gt;Why can JSON read only these few things?  - To ensure that JSON could be adopted by a large variety of different languages, the JSON was kept pretty basic.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can layer this information to make the data as complex as you want.  For example,  there could n number of arrays inside a JSON object.  &lt;br /&gt;&lt;br /&gt;A sample of a JSON looks like the following (&lt;a href="http://www.json.org/example.html"&gt;Source&lt;/a&gt;)  : &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;The action and label values only need to be provided if they are not the same as the id.&lt;br /&gt;&lt;br /&gt;{"menu": {&lt;br /&gt;    "header": "SVG Viewer",&lt;br /&gt;    "items": [&lt;br /&gt;        {"id": "Open"},&lt;br /&gt;        {"id": "OpenNew", "label": "Open New"},&lt;br /&gt;        null,&lt;br /&gt;        {"id": "ZoomIn", "label": "Zoom In"},&lt;br /&gt;        {"id": "ZoomOut", "label": "Zoom Out"},&lt;br /&gt;        {"id": "OriginalView", "label": "Original View"},&lt;br /&gt;        null,&lt;br /&gt;        {"id": "Quality"},&lt;br /&gt;        {"id": "Pause"},&lt;br /&gt;        {"id": "Mute"},&lt;br /&gt;        null,&lt;br /&gt;        {"id": "Find", "label": "Find..."},&lt;br /&gt;        {"id": "FindAgain", "label": "Find Again"},&lt;br /&gt;        {"id": "Copy"},&lt;br /&gt;        {"id": "CopyAgain", "label": "Copy Again"},&lt;br /&gt;        {"id": "CopySVG", "label": "Copy SVG"},&lt;br /&gt;        {"id": "ViewSVG", "label": "View SVG"},&lt;br /&gt;        {"id": "ViewSource", "label": "View Source"},&lt;br /&gt;        {"id": "SaveAs", "label": "Save As"},&lt;br /&gt;        null,&lt;br /&gt;        {"id": "Help"},&lt;br /&gt;        {"id": "About", "label": "About Adobe CVG Viewer..."}&lt;br /&gt;    ]&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/7265231704525907886-6921598869805826525?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/6921598869805826525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=6921598869805826525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6921598869805826525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/6921598869805826525'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/what-is-json.html' title='What is JSON?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8110798184796434812</id><published>2008-04-30T17:16:00.000-07:00</published><updated>2008-04-30T17:29:11.416-07:00</updated><title type='text'>How are is Object serialization implemented in java?</title><content type='html'>The basic idea is that once you have an object that implements the serializable interface, it can then be written to the and output stream such as a network socket.    &lt;br /&gt;&lt;br /&gt;No extra methods need to be added to implement the interface, however - the purpose of the interface is to identify at run-time which classes can be safely serialized, and which cannot. You, as a programmer, need only add the implements keyword to your class declaration, to identify your classes as serializable.&lt;br /&gt;&lt;br /&gt;public class UserData implements&lt;br /&gt;       java.io.Serializable&lt;br /&gt;&lt;br /&gt;Now, once a class is serializable, we can write the object to any OutputStream, such as to disk or a socket connection. To achieve this, we must first create an instance of java.io.ObjectOutputStream, and pass the constructor an existing OutputStream instance.&lt;br /&gt;&lt;br /&gt;// Write to disk with FileOutputStream&lt;br /&gt;FileOutputStream f_out = new &lt;br /&gt; FileOutputStream("myobject.data");&lt;br /&gt;&lt;br /&gt;// Write object with ObjectOutputStream&lt;br /&gt;ObjectOutputStream obj_out = new&lt;br /&gt; ObjectOutputStream (f_out);&lt;br /&gt;&lt;br /&gt;// Write object out to disk&lt;br /&gt;obj_out.writeObject ( myObject );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://www.javacoffeebreak.com/articles/serialization/index.html"&gt;http://www.javacoffeebreak.com/articles/serialization/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-8110798184796434812?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8110798184796434812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8110798184796434812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8110798184796434812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8110798184796434812'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/how-are-is-object-serialization.html' title='How are is Object serialization implemented in java?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5461004433459566012</id><published>2008-04-30T16:46:00.000-07:00</published><updated>2008-04-30T17:16:08.720-07:00</updated><title type='text'>Core J2EE Patterns - Transfer Object</title><content type='html'>I ran into some code that has ValueObjects in it.  These value objects it turns out, should actually be named Transfer Objects, per this discussion that I found.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/patterns/TransferObject.html"&gt;Link &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The concept behind this pattern is to pull data back from the server in one large chunk so that the client can pull data from this large chunk rather than make many costly calls to the server. &lt;br /&gt;&lt;br /&gt;This "Pattern" sounds like AJAX.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;So, the real question is: Do you need to create get() methods for the data inside the Transfer object?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some thoughts on the design of these Transfer Objects:  &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Typically, the members in the Transfer Object / Value Obects are defined as public, thus eliminating the need for get and set methods. If some protection is necessary, then the members could be defined as protected or private, and methods are provided to get the values. Transfer Objects / Value Obects can be mutable or immutabel depending on whether the application wants to allow updates to the Transfer Objects / Value Obects&lt;/blockquote&gt; - Source: &lt;a href="http://www.allapplabs.com/j2ee_design_patterns/j2ee_design_patterns_transfer_object.htm"&gt;http://www.allapplabs.com/j2ee_design_patterns/j2ee_design_patterns_transfer_object.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I agree with this sentiment although it goes against the grain of good oo design and consistency.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Why are these object serializable?&lt;/span&gt;&lt;br /&gt;The answer to this comes from understanding what a serialized object is in Java.  &lt;br /&gt;&lt;br /&gt;These objects are serialized so that they can be sent over the network.  &lt;br /&gt;&lt;br /&gt;Looking at the source code in eclipse, it lists Serializable as an interface with absolutely no implementation. &lt;br /&gt;&lt;br /&gt;The best explanation of what Java Serialization is was this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Object serialization takes an object's state, and converts it to a stream of data for you. With object serialization, it's an easy task to take any object, and make it persistent, without writing custom code to save object member variables. The object can be restored at a later time, and even a later location. With persistence, we can move an object from one computer to another, and have it maintain its state. This very cool feature, in Java, also happens to be very easy to use.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Source:  &lt;a href="http://www.javacoffeebreak.com/articles/serialization/index.html"&gt;http://www.javacoffeebreak.com/articles/serialization/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5461004433459566012?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5461004433459566012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5461004433459566012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5461004433459566012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5461004433459566012'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/core-j2ee-patterns-transfer-object.html' title='Core J2EE Patterns - Transfer Object'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-8150302389698459862</id><published>2008-04-29T07:57:00.004-07:00</published><updated>2008-04-29T08:02:10.199-07:00</updated><title type='text'>What is a DAO?</title><content type='html'>A DAO is an abstract data access object that keeps the internal of the data private.  I like to think of this as the TCP/IP implementation of data packets.  If I am a network,  could care less what was in the datagram, I just case about the wrapped TCP/IP layer telling me where to go.  &lt;br /&gt;&lt;br /&gt;With a DAO, we have a very similar thing.  The DAO is the internal applicaton/datagram data.  Our communications pieces could care less about these internals, it just knows that it has to pass a DAO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-8150302389698459862?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/8150302389698459862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=8150302389698459862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8150302389698459862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/8150302389698459862'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/what-is-dao_29.html' title='What is a DAO?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-426785870408969765</id><published>2008-04-29T07:57:00.001-07:00</published><updated>2008-04-29T07:57:35.295-07:00</updated><title type='text'>What is a DAO?</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-426785870408969765?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/426785870408969765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=426785870408969765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/426785870408969765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/426785870408969765'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/what-is-dao.html' title='What is a DAO?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-5158574889922732729</id><published>2008-04-22T09:11:00.000-07:00</published><updated>2008-04-29T05:50:39.593-07:00</updated><title type='text'>What is a GWT application Module XML file?</title><content type='html'>I ran across this term the other day when I was trying to GWT-EXT2.0 up and running with the Google Web Toolkit.  I remembered reading about it, but thought that I would take a minute to jot down exactly what it is in my own words so that I don't forget.&lt;br /&gt;&lt;br /&gt;Every single GWT application needs an XML file associated with it in the following form:  projectName.gwt.xml.    &lt;br /&gt;&lt;br /&gt;Example of KitchenSink:  See KitchenSink.gwt.xml&lt;br /&gt;&lt;br /&gt;Inside this file, there are several key components that make up this file.  &lt;br /&gt; &lt;br /&gt;These components are: modules it inherits from, stylesheets, and entry point.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;inherits name&lt;/span&gt; = This means that modules listed here are all copied as if they were part of this application. So, for this example, our application will have all of the module settings for both com.gwtext.GwtExt and com.google.gwt.user.User.  What exactly does this mean for out application?  &lt;br /&gt;&lt;br /&gt;This means that our module will have other modules in it.  So, looking at com.google.gwt.user.User.gwt.xml, we see the following:  &lt;br /&gt;&lt;br /&gt;inherits name="com.google.gwt.core.Core"&lt;br /&gt;&lt;span style="font-style:italic;"&gt;inherits name="com.google.gwt.user.RemoteService"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;inherits name="com.google.gwt.user.DOM"&lt;/span&gt;&lt;br /&gt;inherits name="com.google.gwt.user.HTTPRequest"&lt;br /&gt;inherits name="com.google.gwt.user.History"&lt;br /&gt;inherits name="com.google.gwt.user.Popup"&lt;br /&gt;inherits name="com.google.gwt.user.Form"&lt;br /&gt;inherits name="com.google.gwt.user.TextBox"&lt;br /&gt;inherits name="com.google.gwt.user.Focus"&lt;br /&gt;inherits name="com.google.gwt.user.ImageBundle"&lt;br /&gt;inherits name="com.google.gwt.user.ClippedImage"&lt;br /&gt;inherits name="com.google.gwt.user.RichText"&lt;br /&gt;inherits name="com.google.gwt.user.SplitPanel"&lt;br /&gt;inherits name="com.google.gwt.user.ListBox" &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok, so now what? Lets peek inside Dom.gwt.xml&lt;br /&gt;&lt;br /&gt;Ok, that didn't work so nicely, lets look at this:  RemoteService -  Ok, here is what that file includes:  Note that the user agent right below relates to Client Browser.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;inherits name="com.google.gwt.core.Core"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;inherits name="com.google.gwt.user.UserAgent"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;replace-with class="com.google.gwt.user.client.impl.DOMImplOpera"&lt;br /&gt;  when-type-is class="com.google.gwt.user.client.impl.DOMImpl"&lt;br /&gt;  when-property-is name="user.agent" value="opera"&lt;br /&gt;&lt;br /&gt;replace-with class="com.google.gwt.user.client.impl.DOMImplSafari"&lt;br /&gt;  when-type-is class="com.google.gwt.user.client.impl.DOMImpl"&lt;br /&gt;  when-property-is name="user.agent" value="safari"&lt;br /&gt;replace-with&lt;br /&gt;&lt;br /&gt;replace-with class="com.google.gwt.user.client.impl.DOMImplIE6&lt;br /&gt;  when-type-is class="com.google.gwt.user.client.impl.DOMImpl"&lt;br /&gt;  when-property-is name="user.agent" value="ie6"&lt;br /&gt;&lt;br /&gt;replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla"&lt;br /&gt;  when-type-is class="com.google.gwt.user.client.impl.DOMImpl"&lt;br /&gt;  when-property-is name="user.agent" value="gecko1_8"&lt;br /&gt;&lt;br /&gt;replace-with class="com.google.gwt.user.client.impl.DOMImplMozillaOld"&lt;br /&gt;  when-type-is class="com.google.gwt.user.client.impl.DOMImpl"&lt;br /&gt;  when-property-is name="user.agent" value="gecko"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;holy Moly....  Lets start picking this apart.  Lets look at  com.google.gwt.user.UserAgent.   Ok, time to roll your sleeves up, this is going to get messy......&lt;br /&gt;&lt;br /&gt;Looking at the comments from Google - &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Defines the user.agent property and its provider function.                                                                      &lt;br /&gt;This module is typically inherited via com.google.gwt.user.User  &lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;What is the user.agent property ?  The user agent property is the browser that the client is using.  Note that this module doesn't inherit anything from Core.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;  Browser-sensitive code should use the 'user.agent' property&lt;br /&gt;  define-property name="user.agent" values="ie6,gecko,gecko1_8,safari,opera"&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  property-provider name="user.agent"&gt;&lt;![CDATA[&lt;br /&gt;      var ua = navigator.userAgent.toLowerCase();&lt;br /&gt;      var makeVersion = function(result) {&lt;br /&gt;          return (parseInt(result[1]) * 1000) + parseInt(result[2]);&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      if (ua.indexOf("opera") != -1) {&lt;br /&gt;        return "opera";&lt;br /&gt;      } else if (ua.indexOf("webkit") != -1) {&lt;br /&gt;        return "safari";&lt;br /&gt;      } else if (ua.indexOf("msie") != -1) {&lt;br /&gt;        var result = /msie ([0-9]+)\.([0-9]+)/.exec(ua);&lt;br /&gt;        if (result &amp;&amp; result.length == 3) {&lt;br /&gt;          if (makeVersion(result) &gt;= 6000) {&lt;br /&gt;            return "ie6";&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      } else if (ua.indexOf("gecko") != -1) {&lt;br /&gt;        var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);&lt;br /&gt;        if (result &amp;&amp; result.length == 3) {&lt;br /&gt;          if (makeVersion(result) &gt;= 1008)&lt;br /&gt;            return "gecko1_8";&lt;br /&gt;          }&lt;br /&gt;        return "gecko";&lt;br /&gt;      }&lt;br /&gt;      return "unknown";&lt;br /&gt;  ]]&gt;&lt;/property-provider&gt;&lt;br /&gt;&lt;br /&gt;module&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;entry-point&lt;/span&gt;=  The entry point is the first piece of java code that will be in our application. This class is optional, unless your HTML page references this.  If your HTML page has an entry point, then you must have an entry point in your application.gwt.xml file.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Inside your HTML file, you will see something like this:  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;meta name='gwt:module' content='com.google.gwt.sample.kitchensink.KitchenSink'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Your KitchenSink.gwt.xml file should have something like this in it:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;entry-point class='com.google.gwt.sample.kitchensink.client.KitchenSink'/&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do you notice that the html module does not have the client folder listed in the module reference?  This is kind of confusing.  Why did Google decide to implement it this way?  I am not sure, but it must be linked to the way that they output the files upon compilation.   If you want to change the directory from the client folder, then you need to specify this as a source path entry.&lt;br /&gt;&lt;br /&gt;You can only have one entry point class in a module!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;stylesheet src&lt;/span&gt; =  This links in stylesheets to be used in your application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are some more advanced features:  &lt;br /&gt;&lt;br /&gt;you can set the public path&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-5158574889922732729?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/5158574889922732729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=5158574889922732729' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5158574889922732729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/5158574889922732729'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/04/what-is-gwt-application-module.html' title='What is a GWT application Module XML file?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2617649137297834615</id><published>2008-03-19T08:35:00.000-07:00</published><updated>2008-03-19T09:52:05.790-07:00</updated><title type='text'>Test</title><content type='html'>Test&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2617649137297834615?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2617649137297834615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2617649137297834615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2617649137297834615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2617649137297834615'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/03/test.html' title='Test'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-2110868841574673444</id><published>2008-03-18T11:33:00.000-07:00</published><updated>2011-11-01T16:20:17.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java ide battle'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans vs eclipse'/><title type='text'>Netbeans vs Eclipse</title><content type='html'>There is no contest.  Netbeans is superior to Eclipse and will be the future choice IDE (so says me). &lt;br /&gt;&lt;br /&gt;I am biased however and don't offer any clear and concise agruments.  As a Netbeans lover,I began to use Eclipse for a month.  I was really getting into some of the cool Eclipse features, but when I turned Netbeans back on, I made my mind up that it is clearly easier to use.  &lt;br /&gt;&lt;br /&gt;Some basic comparisons:&lt;br /&gt;Visual Editor - I like to hack together guis to test them out.  Netbeans is quick, easy, and looks sharp.  I could not get the VE plugin to work in the IDE.  After much fussing, I quit.  I spoke to other developers and the concenus is that you need to build it in netbeans and port it over to Eclipse. &lt;br /&gt;&lt;br /&gt;Web Development Out of the box- Netbeans has pre assembled web projects that you can quickly pull down and select.  Eclipse does not have that.  Maybe there is a plugin?  The bottom line is that I don't really care.  I don't want to spend time looking for plugins.&lt;br /&gt;&lt;br /&gt;Old, Crappy Documentation:  Eclipse documentation is frequently out of date.  Looking at the help manual for 3.3, I find references to menus that have long since moved, but nobody bothered to update the help manual.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My impression of Eclipse users is that it was the tool dejour back in the day.  Now however, Netbeans has gotten easier to use, so it will take a while to ween Eclipse folks from their baby.  I think that the newer generation of programmers will move to Netbeans and the Eclipse folks will eventually fad back, but not for a while.  &lt;br /&gt;&lt;br /&gt;Just last year, there were folks at my work who did not want to make the transition from VI to emacs because their editor was better.  Change is hard.  If you are good at one thing, why muck with it unless you can be much, much better.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Looking at the complicated environments that we are dealing with now, it is very clear that the IDE's evolution is the critical piece for development and productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-2110868841574673444?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/2110868841574673444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=2110868841574673444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2110868841574673444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/2110868841574673444'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/03/netbeans-vs-eclipse.html' title='Netbeans vs Eclipse'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-646533183847069922</id><published>2008-03-18T11:15:00.000-07:00</published><updated>2011-11-01T16:20:17.598-07:00</updated><title type='text'>Java J2EE - The Future - A higher level language</title><content type='html'>As a J2SE programmer, you get a chance to really, truly understand the java language.  When you go from a SE to a J2EE environment however, you spend the majority of your time understanding different packages and building your environment.  The complexity can be staggering if you don't take it on bit by bit.  Not only do you have to know Java, but you have to understand all sorts of frameworks to be effective.  As a J2EE programmer, you move from a programmer (my opinion) to more of an assembler(no assembly code) of different packages, frameworks, and libraries.  &lt;br /&gt;&lt;br /&gt;Lets take a look at some of the things that a J2EE developer needs to know:&lt;br /&gt;Jave 2 SE&lt;br /&gt;Apache/Jakarta resources&lt;br /&gt;Spring&lt;br /&gt;JSP&lt;br /&gt;JSF&lt;br /&gt;XML and the related families to include conversation mechanisms&lt;br /&gt;JMS&lt;br /&gt;HTML&lt;br /&gt;A host of other libraries&lt;br /&gt;JavaScript/AJAX/GWT&lt;br /&gt;A Server (Tomcat, Glassfish, JBoss, etc)&lt;br /&gt;An IDE to include ANT&lt;br /&gt;Architecture Constraints&lt;br /&gt;Database&lt;br /&gt;Security&lt;br /&gt;A host of connectivity issues (LDAP, AD, APR)...&lt;br /&gt;Basic Networking&lt;br /&gt;&lt;br /&gt;    Really thinking about it, this is the logical stepping stone for the development of a new web enables high level computing language.  In the future, I could see the development of such a language with its foundations built on top of Java.  Maybe instead of another language, there will be an overarching api and an agreed upon integrated approach.  Of the two IDEs, netbeans looks like the winner so far.&lt;br /&gt;&lt;br /&gt;I have heard that .net programming does a nice job of tying lots of things together because they built with language with the IDE in mind, not the other way around (Java).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-646533183847069922?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/646533183847069922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=646533183847069922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/646533183847069922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/646533183847069922'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/03/java-j2ee-future-higher-level-language.html' title='Java J2EE - The Future - A higher level language'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-4605932070386597470</id><published>2008-03-10T07:50:00.000-07:00</published><updated>2011-11-01T16:20:17.611-07:00</updated><title type='text'>Java Groups in Maryland?</title><content type='html'>Living in Maryland, I have tried to find vibrant Java communities.  So far, I have has some whisperings of meetings, and groups, but nothing definitive yet. &lt;br /&gt;&lt;br /&gt;Found a cool website called meetup.com.  This tool looks pretty cool because it is way people can find other people in the network, but there wasn't anything like that around Carroll County.  Problem - It costs money!  &lt;br /&gt;&lt;br /&gt;Looking at the Java User Group (JUG), couldn't find anything in Maryland.  http://community.java.net/jugs/listing.csp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-4605932070386597470?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/4605932070386597470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=4605932070386597470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4605932070386597470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/4605932070386597470'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2008/03/java-groups-in-maryland.html' title='Java Groups in Maryland?'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7265231704525907886.post-3299760197615940976</id><published>2007-10-14T22:39:00.000-07:00</published><updated>2011-11-01T16:20:17.623-07:00</updated><title type='text'>Kick Off</title><content type='html'>The Romanlogic website has has finally gotten off the ground! The site is pretty basic, but Rome wasn't built in a day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7265231704525907886-3299760197615940976?l=terrance-macgregor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://terrance-macgregor.blogspot.com/feeds/3299760197615940976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7265231704525907886&amp;postID=3299760197615940976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3299760197615940976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7265231704525907886/posts/default/3299760197615940976'/><link rel='alternate' type='text/html' href='http://terrance-macgregor.blogspot.com/2007/10/kick-off.html' title='Kick Off'/><author><name>Terrance MacGregor</name><uri>https://profiles.google.com/105443718923051413153</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-zScHyEfbGJk/AAAAAAAAAAI/AAAAAAAABzk/q3GDUuFXioc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
