<?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-723145211531638205</id><updated>2011-12-13T19:37:38.686-08:00</updated><category term='IntelliJ'/><category term='GWT'/><category term='java swing desktop'/><category term='Java'/><category term='IDE'/><category term='J2EE'/><category term='scala gui'/><category term='Web'/><category term='Eclipse'/><category term='java swing gui'/><title type='text'>Interesting &amp; Frustrating Software Developments</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-8715312706746056115</id><published>2011-03-04T10:24:00.000-08:00</published><updated>2011-03-04T10:24:16.058-08:00</updated><title type='text'>Reflections on (Java) reflection - isn't there another way?</title><content type='html'>In general, I am suspicious when I see much use of reflection - especially when creating objects or accessing fields. &amp;nbsp;It sure seems that there ought to be a better way with a proper object hierarchy.&lt;br /&gt;&lt;br /&gt;In any case, I came across an interesting use case. &amp;nbsp;In this GUI application, the requirement is to create only one window of any given type. &amp;nbsp;So the class is passed into a window manager class. &amp;nbsp;It looks up in its table to see if one has been created and if not, creates one. &amp;nbsp;It does this by being passed the class of the window to create and uses reflection to instantiate it.&lt;br /&gt;&lt;br /&gt;There are a couple valid justifications for this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;you would like the window management encapsulated in one class. &amp;nbsp;&lt;/li&gt;&lt;li&gt;you would like to not instantiate one if one already exists. &amp;nbsp;Using reflection enables this without having to resort to multiple method calls (although it wouldn't be the end of the world).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The other option would be for every window class to implement a &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Isn't there another way?&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In fact, the benefits of &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; come to mind. &amp;nbsp;All you would need is to pass a bit of code to the window manager which it would execute to create the window in lieu of finding the constructor from reflection on the class definition.&lt;br /&gt;&lt;br /&gt;Or, in JDK 7 terms, pass in a closure (from what I've heard of the various proposals).&lt;br /&gt;&lt;br /&gt;One could also emulate this with a one-method interface. &amp;nbsp;Having written all this, it seems it might be useful for each window to implement a singleton pattern, especially if there are various places where the window is being created. &amp;nbsp;But, that might be a bad sign in its own right.&lt;br /&gt;&lt;br /&gt;BTW - why do I not like reflection? &amp;nbsp;Primarily because I tend to use the "Find References" feature of my IDE-of-the-project. &amp;nbsp;And it doesn't catch uses of reflection. &amp;nbsp;(N.B. does &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt;?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-8715312706746056115?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/8715312706746056115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=8715312706746056115' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8715312706746056115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8715312706746056115'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2011/03/reflections-on-java-reflection-isnt.html' title='Reflections on (Java) reflection - isn&apos;t there another way?'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-309872828176094640</id><published>2011-03-04T10:01:00.000-08:00</published><updated>2011-03-04T10:01:53.648-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java swing gui'/><title type='text'>Of JTables and ScrollPanes</title><content type='html'>While working on a Swing app today, I came across some interesting code where a class named RowHeader extended JTable. &amp;nbsp;WTF? In looking at it more closely, it seemed - aha! - they're creating a table to serve as the row header in the JScrollPane. &amp;nbsp;Makes sense - that way when the table is the viewport of the scroll pane, the column headers don't scroll with the table... just what you want. &amp;nbsp;I need to do that everywhere.&lt;br /&gt;But wait - it already does that. &amp;nbsp;How do it know? &amp;nbsp;My tables don't do that, yet the scroll pane knows to put the row header outside the scroll view port. &amp;nbsp;Even the simple example &lt;a href="http://www.oracle.com/technetwork/articles/javase/index-135205.html"&gt;here&lt;/a&gt;&amp;nbsp;doesn't do anything special to accomplish this task. &amp;nbsp;I browsed through a bit of the source code to JScrollPane, it must be looking for a JTable instance, but I don't see where right off hand.&lt;br /&gt;So I suspect this is relatively new functionality and the "legacy" code was doing the same thing before Swing did it automatically.&lt;br /&gt;&lt;br /&gt;Now, to just get the sorting to show...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-309872828176094640?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/309872828176094640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=309872828176094640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/309872828176094640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/309872828176094640'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2011/03/of-jtables-and-scrollpanes.html' title='Of JTables and ScrollPanes'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-1207440686582282581</id><published>2010-08-19T13:32:00.000-07:00</published><updated>2010-08-19T13:45:20.572-07:00</updated><title type='text'>GUI Development</title><content type='html'>&lt;style type="text/css"&gt;ol{margin:0;padding:0}p{margin:0}.l0_ks4l06lar5ed{list-style-type:disc}.c57{padding-top:14.0pt;padding-bottom:4.0pt}.l6_cl86faxf7bw5{list-style-type:disc}.c55{line-height:1.15;text-indent:36.0pt;direction:ltr}.l1_cl86faxf7bw5{list-style-type:circle}.l1_q0e83uldnukt{list-style-type:circle}.l1_8d8nn8m8oov7{list-style-type:circle}.l8_iga4vsnx3glc{list-style-type:square}.l4_x3k4kaigsb55{list-style-type:circle}.l3_3zn51axt3zbj{list-style-type:disc}.l4_3zn51axt3zbj{list-style-type:circle}.l2_ks4l06lar5ed{list-style-type:square}.l1_i6k7tcnlqb33{list-style-type:circle}.l6_3e4nzscpssnx{list-style-type:disc}.l4_8d8nn8m8oov7{list-style-type:circle}.l6_i6k7tcnlqb33{list-style-type:disc}.l5_rkrm9ccg4gox{list-style-type:square}.l8_q0e83uldnukt{list-style-type:square}.l6_lpg74ogzhdxq{list-style-type:disc}.l3_i6k7tcnlqb33{list-style-type:disc}.l4_3e4nzscpssnx{list-style-type:circle}.l8_3zn51axt3zbj{list-style-type:square}.l7_8d8nn8m8oov7{list-style-type:circle}.l4_rkrm9ccg4gox{list-style-type:circle}.l0_i6k7tcnlqb33{list-style-type:disc}.l3_x3k4kaigsb55{list-style-type:disc}.l3_w2ihiuqqmabr{list-style-type:disc}.l8_3e4nzscpssnx{list-style-type:square}.l8_b08vwc9c31ho{list-style-type:square}.l0_3e4nzscpssnx{list-style-type:disc}.l8_x3k4kaigsb55{list-style-type:square}.c33{padding-left:0pt;line-height:1.15;direction:ltr;margin-left:108.0pt}.l1_iga4vsnx3glc{list-style-type:circle}.c31{color:#000099;font-size:11pt;text-decoration:underline;font-family:Arial}.l0_3zn51axt3zbj{list-style-type:disc}.l5_3zn51axt3zbj{list-style-type:square}.l4_b08vwc9c31ho{list-style-type:circle}.l0_iga4vsnx3glc{list-style-type:disc}.l7_3zn51axt3zbj{list-style-type:circle}.l0_q0e83uldnukt{list-style-type:disc}.l3_cl86faxf7bw5{list-style-type:disc}.l6_8d8nn8m8oov7{list-style-type:disc}.l4_iga4vsnx3glc{list-style-type:circle}.l8_8d8nn8m8oov7{list-style-type:square}.l3_3e4nzscpssnx{list-style-type:disc}.l8_rkrm9ccg4gox{list-style-type:square}.c141{color:#000000;font-size:18pt;font-family:Arial;font-weight:bold}.l7_iga4vsnx3glc{list-style-type:circle}.l2_rkrm9ccg4gox{list-style-type:square}.l2_3e4nzscpssnx{list-style-type:square}.l1_3zn51axt3zbj{list-style-type:circle}.l4_w2ihiuqqmabr{list-style-type:circle}.l0_cl86faxf7bw5{list-style-type:disc}.l7_ks4l06lar5ed{list-style-type:circle}.l7_lpg74ogzhdxq{list-style-type:circle}.l2_3zn51axt3zbj{list-style-type:square}.l1_lpg74ogzhdxq{list-style-type:circle}.l4_cl86faxf7bw5{list-style-type:circle}.l4_lpg74ogzhdxq{list-style-type:circle}.l0_8d8nn8m8oov7{list-style-type:disc}.l2_b08vwc9c31ho{list-style-type:square}.l6_b08vwc9c31ho{list-style-type:disc}.l7_3e4nzscpssnx{list-style-type:circle}.l1_x3k4kaigsb55{list-style-type:circle}.l2_q0e83uldnukt{list-style-type:square}.l4_i6k7tcnlqb33{list-style-type:circle}.l2_iga4vsnx3glc{list-style-type:square}.l6_3zn51axt3zbj{list-style-type:disc}.l5_w2ihiuqqmabr{list-style-type:square}.l5_cl86faxf7bw5{list-style-type:square}.l7_rkrm9ccg4gox{list-style-type:circle}.l6_rkrm9ccg4gox{list-style-type:disc}.l0_b08vwc9c31ho{list-style-type:disc}.l6_w2ihiuqqmabr{list-style-type:disc}.l5_i6k7tcnlqb33{list-style-type:square}.l6_iga4vsnx3glc{list-style-type:disc}.l7_i6k7tcnlqb33{list-style-type:circle}.l2_cl86faxf7bw5{list-style-type:square}.c29{padding-left:0pt;line-height:1.15;direction:ltr;margin-left:72.0pt}.l6_x3k4kaigsb55{list-style-type:disc}.l2_w2ihiuqqmabr{list-style-type:square}.l5_8d8nn8m8oov7{list-style-type:square}.l1_rkrm9ccg4gox{list-style-type:circle}.l5_3e4nzscpssnx{list-style-type:square}.l1_3e4nzscpssnx{list-style-type:circle}.l3_b08vwc9c31ho{list-style-type:disc}.c249{padding-top:10.0pt;padding-bottom:2.0pt}.l8_ks4l06lar5ed{list-style-type:square}.c110{padding-top:12.0pt;padding-bottom:2.0pt}.c248{color:#000000;font-size:14pt;font-family:Arial}.c17{padding-left:0pt;line-height:1.15;direction:ltr;margin-left:36.0pt}.l8_i6k7tcnlqb33{list-style-type:square}.l3_rkrm9ccg4gox{list-style-type:disc}.l2_i6k7tcnlqb33{list-style-type:square}.l4_q0e83uldnukt{list-style-type:circle}.l5_iga4vsnx3glc{list-style-type:square}.l8_w2ihiuqqmabr{list-style-type:square}.c13{padding-top:18.0pt;padding-bottom:4.0pt}.c14{color:#000000;font-size:14pt;font-family:Arial;font-weight:bold}.l3_iga4vsnx3glc{list-style-type:disc}.l3_q0e83uldnukt{list-style-type:disc}.l5_lpg74ogzhdxq{list-style-type:square}.l3_lpg74ogzhdxq{list-style-type:disc}.l6_ks4l06lar5ed{list-style-type:disc}.l5_x3k4kaigsb55{list-style-type:square}.l0_lpg74ogzhdxq{list-style-type:disc}.c215{color:#000000;font-size:18pt;font-family:Arial}.c212{padding-top:11.0pt;padding-bottom:2.0pt}.l5_ks4l06lar5ed{list-style-type:square}.c109{color:#000000;font-size:12pt;font-family:Arial;font-weight:bold}.l7_b08vwc9c31ho{list-style-type:circle}.l1_ks4l06lar5ed{list-style-type:circle}.c211{font-weight:bold}.l7_x3k4kaigsb55{list-style-type:circle}.l2_8d8nn8m8oov7{list-style-type:square}.l8_lpg74ogzhdxq{list-style-type:square}.l8_cl86faxf7bw5{list-style-type:square}.l2_x3k4kaigsb55{list-style-type:square}.l3_ks4l06lar5ed{list-style-type:disc}.l7_q0e83uldnukt{list-style-type:circle}.l1_b08vwc9c31ho{list-style-type:circle}.l6_q0e83uldnukt{list-style-type:disc}.l0_x3k4kaigsb55{list-style-type:disc}.l0_w2ihiuqqmabr{list-style-type:disc}.c4{color:#000000;font-size:11pt;font-family:Arial}.c3{line-height:1.15;text-indent:0pt;text-align:center;direction:ltr}.l3_8d8nn8m8oov7{list-style-type:disc}.l0_rkrm9ccg4gox{list-style-type:disc}.c9{line-height:1.15;text-indent:0pt;direction:ltr}.l1_w2ihiuqqmabr{list-style-type:circle}.l7_cl86faxf7bw5{list-style-type:circle}.l5_b08vwc9c31ho{list-style-type:square}.l5_q0e83uldnukt{list-style-type:square}.c1{padding-top:24.0pt;line-height:1.15;text-indent:0pt;text-align:center;direction:ltr;padding-bottom:6.0pt}.c2{color:#000000;font-style:italic;font-size:11pt;font-family:Arial}.l2_lpg74ogzhdxq{list-style-type:square}.c0{color:#000000;font-size:24pt;font-family:Arial;font-weight:bold}.l4_ks4l06lar5ed{list-style-type:circle}.l7_w2ihiuqqmabr{list-style-type:circle}&lt;/style&gt;&lt;br /&gt;&lt;div class="c1"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; font-style: italic; line-height: 16px;"&gt;A review of implementation and deployment strategies for GUI applications&lt;/span&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.k51wmexrok9q"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;The overall GUI implementation space:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2SmQ5nKUI/AAAAAAAAJE4/ud9dQ2aFds8/s1600/drawing0.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2SmQ5nKUI/AAAAAAAAJE4/ud9dQ2aFds8/s400/drawing0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c13 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.h0m1f08qpkhu"&gt;&lt;/a&gt;&lt;span class="c14"&gt;Desktop&lt;span id="goog_1885890726"&gt;&lt;/span&gt;&lt;span id="goog_1885890727"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_x3k4kaigsb55"&gt;&lt;li class="c17 l0_x3k4kaigsb55" value="1"&gt;&lt;span class="c4"&gt;more secure due to limited access, not using well-known ports&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_x3k4kaigsb55"&gt;&lt;span class="c4"&gt;easier implementation of advanced UI interactivity features&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_x3k4kaigsb55"&gt;&lt;span class="c4"&gt;requires installation (unless using WebStart; see below)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_x3k4kaigsb55"&gt;&lt;span class="c4"&gt;possible to distribute load: business logic components run locally, no web browser required (see architecture drawings)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_x3k4kaigsb55"&gt;&lt;span class="c4"&gt;more control over context (i.e. no browser compatibility issues, no platform issues if Windows-only)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_x3k4kaigsb55"&gt;&lt;span class="c4"&gt;implementation platforms:&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l1_3e4nzscpssnx"&gt;&lt;li class="c29 l1_3e4nzscpssnx" value="1"&gt;&lt;span class="c4"&gt;Sun/Oracle Java Virtual Machine (JVM) based&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l2_3e4nzscpssnx"&gt;&lt;li class="c33 l2_3e4nzscpssnx" value="1"&gt;&lt;span class="c4"&gt;Java/&lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FSwing_(Java)&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHq7wXXB7qR2p_wcZj3WOKfPjU1Xw"&gt;Swing&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c33 l2_3e4nzscpssnx"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.scala-lang.org%2Fnode%2F25&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNE3LGRfRbxdSB7XUpCeZBIlVYxNKA"&gt;Scala&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;/Swing &lt;/span&gt;&lt;/li&gt;&lt;li class="c33 l2_3e4nzscpssnx"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavafx%2Foverview%2Findex.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNG6SPUj78cgRHVU9Ic5CNqDG-hgig"&gt;JavaFX&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; (Sun/Oracle alternative to Flex)&lt;/span&gt;&lt;/li&gt;&lt;li class="c33 l2_3e4nzscpssnx"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGriffon_(framework)&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFCj8_Zn9UFppqyvNbYq3CAEKFjRg"&gt;Groovy/Griffon&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;/Swing (Rails-like framework for Swing) &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l1_3e4nzscpssnx"&gt;&lt;li class="c29 l1_3e4nzscpssnx" value="2"&gt;&lt;span class="c4"&gt;Microsoft .Net-based: any &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCLI_language&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNF-gjOTVh7eggRXRHSrfe-MSOl5-Q"&gt;CLI language&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_3e4nzscpssnx"&gt;&lt;span class="c4"&gt;Adobe AIR-based: &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.adobe.com%2Fproducts%2Fflash%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFKPeJTX9JBqUKHEgq0MSR4-eJodg"&gt;Flash&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; or &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FAdobe_Flex&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHkKVSXcvIsKNUguTDsNfE5nuRnig"&gt;Flex&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c55"&gt;&lt;span class="c4"&gt;(Visual issues between these are addressed below.)&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c57"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.gr6aaosrd53w"&gt;&lt;/a&gt;&lt;span class="c14"&gt;Non-browser based Web App (Java Web Start)&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_lpg74ogzhdxq"&gt;&lt;li class="c17 l0_lpg74ogzhdxq" value="1"&gt;&lt;span class="c4"&gt;requires web server for initial installation&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;subsequent executions local&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;crosses lines between Applet (in-browser app) and Application (desktop)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;implementation is Swing or JavaFX&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;full interactivity as in desktop app&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;could use heavy-weight client to integrate portions of backend&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;use light-weight client calling a higher-level API on web server&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_lpg74ogzhdxq"&gt;&lt;span class="c4"&gt;Ref: &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavase%2Farchitecture-138566.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHXaTgLpyrxkxiCIeDmRf7WIhUiWg"&gt;http://www.oracle.com/technetwork/java/javase/architecture-138566.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c57 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.vy4bnku558a6"&gt;&lt;/a&gt;&lt;span class="c14"&gt;Browser-based Web App - with Plugin&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_i6k7tcnlqb33"&gt;&lt;li class="c17 l0_i6k7tcnlqb33" value="1"&gt;&lt;span class="c4"&gt;offers rich interactivity, near desktop&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_i6k7tcnlqb33"&gt;&lt;span class="c4"&gt;avoids browser issues&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_i6k7tcnlqb33"&gt;&lt;span class="c4"&gt;requires web server for download&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_i6k7tcnlqb33"&gt;&lt;span class="c4"&gt;could distribute load by running business logic in client (JVM plugin), or use higher-level API on web server&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_i6k7tcnlqb33"&gt;&lt;span class="c4"&gt;implementation platforms:&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l1_b08vwc9c31ho"&gt;&lt;li class="c29 l1_b08vwc9c31ho" value="1"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FMicrosoft_Silverlight&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNGmgipUe2YsN67ivvuxVZFhzYfrpw"&gt;Microsoft Silverlight&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;: zillions of CLI languages&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_b08vwc9c31ho"&gt;&lt;span class="c4"&gt;Adobe Flash: &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.adobe.com%2Fproducts%2Fflash%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFKPeJTX9JBqUKHEgq0MSR4-eJodg"&gt;Flash&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; or &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FAdobe_Flex&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHkKVSXcvIsKNUguTDsNfE5nuRnig"&gt;Flex&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_b08vwc9c31ho"&gt;&lt;span class="c4"&gt;JVM: any jvm language supporting Swing&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c57 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.ca5c20dsbgah"&gt;&lt;/a&gt;&lt;span class="c14"&gt;Browser-based Web App - no plugin&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_rkrm9ccg4gox"&gt;&lt;li class="c17 l0_rkrm9ccg4gox" value="1"&gt;&lt;span class="c4"&gt;generally less rich interactivity&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_rkrm9ccg4gox"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FAjax_(programming)&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNF4W8yOwWxvnUOCGzq5OXsleBaI5g"&gt;AJAX&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; for partial updating&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_rkrm9ccg4gox"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FComet_(programming)&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNG9b0bHJVN2kyn8-bJy_r5bEsYpOQ"&gt;Comet&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; for server-push&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c9 c110"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.lsp27kh24ecm"&gt;&lt;/a&gt;&lt;span class="c109"&gt;Web App, no plugin - JVM-generation of pages&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_3zn51axt3zbj"&gt;&lt;li class="c17 l0_3zn51axt3zbj" value="1"&gt;&lt;span class="c4"&gt;requires app server with business-logic code&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_3zn51axt3zbj"&gt;&lt;span class="c4"&gt;relying on framework provided client-side interaction (JavaScript)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_3zn51axt3zbj"&gt;&lt;span class="c4"&gt;implementation platforms:&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l1_cl86faxf7bw5"&gt;&lt;li class="c29 l1_cl86faxf7bw5" value="1"&gt;&lt;span class="c4"&gt;Java/JSP (Struts, etc.)&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_cl86faxf7bw5"&gt;&lt;span class="c4"&gt;Java/&lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=https%3A%2F%2Fcdcdeapps.cde.state.co.us%2FDataDictionary&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNGftu-OrbGun1SkvzSD8KubLVkwHQ"&gt;JSF&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_cl86faxf7bw5"&gt;&lt;span class="c4"&gt;Scala/Lift - what we have now&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_cl86faxf7bw5"&gt;&lt;span class="c4"&gt;Scala/Other (See Appendix A)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c110 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.cknsyscbj0kg"&gt;&lt;/a&gt;&lt;span class="c109"&gt;Browser-based Web App - no plugin, “stand alone” pages&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_iga4vsnx3glc"&gt;&lt;li class="c17 l0_iga4vsnx3glc" value="1"&gt;&lt;span class="c4"&gt;requires web server supporting a high-level API (e.g. a REST API)&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_iga4vsnx3glc"&gt;&lt;span class="c4"&gt;requires larger code base in JavaScript, either:&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol class="l1_ks4l06lar5ed"&gt;&lt;li class="c29 l1_ks4l06lar5ed" value="1"&gt;&lt;span class="c4"&gt;hand coded: optionally with framework such as &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FJquery&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFHOvWuHeT_T2QQrvdy_s6fCOQHlA"&gt;jQuery&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; and its plugin family&lt;/span&gt;&lt;/li&gt;&lt;li class="c29 l1_ks4l06lar5ed"&gt;&lt;span class="c4"&gt;generated: as in via Google Web Toolkit (&lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGoogle_Web_Toolkit&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNG97EvA2aKOmNR28oLgMG8DbBbfmg"&gt;GWT&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;) Code in Java, compile to JavaScript&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c9"&gt;&lt;span class="c141"&gt;Visual Issues&lt;/span&gt;&lt;/div&gt;&lt;div class="c110 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.9rkarabz7wo"&gt;&lt;/a&gt;&lt;span class="c109"&gt;Desktop&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_w2ihiuqqmabr"&gt;&lt;li class="c17 l0_w2ihiuqqmabr" value="1"&gt;&lt;span class="c4"&gt;JVM - Swing: traditional ‘native’ widget/form applications with roughly the same &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.taranfx.com%2Fbest-java-swing-look-and-feel-themes-professional-casual-top-10%2520&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNE2Oy8MMCKSuS4ivgu__dfcdYXhvg"&gt;appearance&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_w2ihiuqqmabr"&gt;&lt;span class="c4"&gt;JVM - JavaFX: much more graphic &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fjavafx.com%2Fsamples%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNGFBszmPXhLLK4nRK8CfVQEhRFE3Q"&gt;design&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_w2ihiuqqmabr"&gt;&lt;span class="c4"&gt;.Net - native Windows L&amp;amp;F&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_w2ihiuqqmabr"&gt;&lt;span class="c4"&gt;AIR - Flash or Flex &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.flashcomponents.net%2Fcomponents%2Fadobe_flex.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNF5KTVAXSOzYMXktgWkKxrgWKl8Cw"&gt;components&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c110 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.b4vk60vgdem6"&gt;&lt;/a&gt;&lt;span class="c109"&gt;Web Apps with plugins essentially look like desktop apps&lt;/span&gt;&lt;/div&gt;&lt;div class="c110 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.r1oqpki5ahd2"&gt;&lt;/a&gt;&lt;span class="c109"&gt;Web Apps - without plugins&lt;/span&gt;&lt;/div&gt;&lt;ol class="l0_8d8nn8m8oov7"&gt;&lt;li class="c17 l0_8d8nn8m8oov7" value="1"&gt;&lt;span class="c4"&gt;jQuery - &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fplugins.jquery.com%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNEAdWQlwA6h_Uy3y5xn_V1WGcTMCw"&gt;http://plugins.jquery.com/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_8d8nn8m8oov7"&gt;&lt;span class="c4"&gt;GWT: &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fadvanced-gwt.sourceforge.net%2Fdemo%2Findex.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFS7iI8k7PZogPGEVFe3YgDrUM4Mw"&gt;http://advanced-gwt.sourceforge.net/demo/index.html&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; and &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://code.google.com/apis/visualization/documentation/gallery/gauge.html"&gt;http://code.google.com/apis/visualization/documentation/gallery/gauge.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="c17 l0_8d8nn8m8oov7"&gt;&lt;span class="c4"&gt;HTML5: &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fhtml5gallery.com%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHEcOJEqQJA1SIYIF1NuUpRNghaVQ"&gt;http://html5gallery.com/&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; [N.B. there browser issues here - as in partial I.E. support]&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="c9 c13"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.4z374slmsfup"&gt;&lt;/a&gt;&lt;span class="c141"&gt;Alternative Dimensions&lt;/span&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.2uz7ek2gvb6"&gt;&lt;/a&gt;&lt;span class="c14"&gt;App server vs. web server&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_uOrl5Fl3mls/TG2Sm2BTR-I/AAAAAAAAJE8/CddlLMgkGVU/s1600/drawing1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://1.bp.blogspot.com/_uOrl5Fl3mls/TG2Sm2BTR-I/AAAAAAAAJE8/CddlLMgkGVU/s400/drawing1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; line-height: 16px;"&gt;The top, left box is a more traditional Swing application. &amp;nbsp;The web server would not be an app server, meaning it would not need to run a JVM. &amp;nbsp;It exists primarily to deliver the applet and its jar files.&lt;/span&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;span class="c14"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.a53uhslnlyzd"&gt;&lt;/a&gt;&lt;span class="c14"&gt;App server with page generator (like JSP or equivalent)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2SnDUY2tI/AAAAAAAAJFA/S91TQRkq1A8/s1600/drawing2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2SnDUY2tI/AAAAAAAAJFA/S91TQRkq1A8/s400/drawing2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; line-height: 16px;"&gt;In this scenario, the web pages are generated from templates and values are filled in by querying the backend business logic at page generation time. &amp;nbsp;The JavaScript code in the page manages the AJAX calls to update the pages.&lt;/span&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.snflsqzene3i"&gt;&lt;/a&gt;&lt;span class="c14"&gt;App server with no web framework&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2Snslo5lI/AAAAAAAAJFE/pcKmPWoPK9E/s1600/drawing3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2Snslo5lI/AAAAAAAAJFE/pcKmPWoPK9E/s400/drawing3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="c57 c9"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; line-height: 16px;"&gt;In this scenario, the web pages are not generated from templates and in that sense are ‘static’. The page values are filled in by querying the backend business logic at page rendering time. &amp;nbsp;The JavaScript code in the page manages the AJAX calls to update the pages, but the knowledge of the page structure is not known by the server. &amp;nbsp;All clients use a “simplified” API such as the REST API outlined below. &amp;nbsp;No internals of the back-end system are exposed, just the data model.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c13"&gt;&lt;span class="c141"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c13"&gt;&lt;span class="c141"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c13"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.nyviumvtqoiz"&gt;&lt;/a&gt;&lt;span class="c141"&gt;Conclusions and recommendations&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;The app server with no web framework is clearly the most flexible architecture. &amp;nbsp;The API is simple and a variety of clients support it. &amp;nbsp;For that reason, many applications are moving to this type of implementation. &amp;nbsp;This architecture achieves greater separation of concerns in that the server has no knowledge of the client. &amp;nbsp;It is straightforward to implement the server-side and requires much less code, therefore putting less load on its host. &amp;nbsp;This architecture does not limit the client-side implementation, although it may require a team member who knows JavaScript.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;None of these solutions are an order of magnitude better or worse than any other. &amp;nbsp;Any of the outlined implementation plans could work. &amp;nbsp;Each optimizes a different combination of platform support, skills usage, visual and design sophistication, etc.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c13"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.xjyuw8okjnn7"&gt;&lt;/a&gt;&lt;span class="c141"&gt;Misc Issues&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c212"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.4uhujof3gq1v"&gt;&lt;/a&gt;&lt;span class="c4 c211"&gt;Authentication&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;To accomplish userid and password authentication in a REST-world, you would pass userid and password via an https request to an API which would validate them and return an authorization token for future API calls.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c13"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.irfdo8u6hyd"&gt;&lt;/a&gt;&lt;span class="c211 c215"&gt;Appendix A. - Scala Web Frameworks&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FLift_(web_framework)&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNEp3TOiFx5cESOGQx0HUNFZJUI1ZA"&gt;Lift&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;Lift has been under development since 2007 (http://liftweb.net/team.html) and is used by such large sites as foursquare.com (&lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.scala-lang.org%2Fnode%2F5130&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNH8DQkH1lYA6a7Fu9OO-_S3dUMetA"&gt;http://www.scala-lang.org/node/5130&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;Cons: mentioned above&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;Pros: provided support for Ajax, Comet, client-side graphs (Flot)&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fscalate.fusesource.org%2Fdocumentation%2Fssp-reference.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNGbdxT_Wtz0FT-nndMmkrjVA5P5_Q"&gt;SSP&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; (Scala Server Pages): &lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;More basic framework; may avoid server-side memory issues, would have to roll our own support for Ajax, Comet.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwiki.github.com%2Fpk11%2Fpinky%2F&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNG16TFeAPZ9EjIz57-QoYCtFwkfCw"&gt;Pinky&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;: REST/MVC glue web framework built on top of Guice and Guice Servlet 2.0. &lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c215 c211"&gt;Appendix B - REST API&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;A &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FRepresentational_State_Transfer&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHSBD18jKx8PDl8OAQbc0RzCNHiDA"&gt;REST&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;-notation API passes all arguments in a URL call over HTTP. &amp;nbsp;The result is returned generally in XML or &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FJSON&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNEWzohaAQtX_zVUJZWk99h0wkr5qA"&gt;JavaScript Object Notation&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt; (JSON). &amp;nbsp;A domain model which is hierarchic is easily supported and mapped to a set of URL calls.&lt;/span&gt;&lt;/div&gt;&lt;div class="c9 c249"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=723145211531638205&amp;amp;postID=1207440686582282581" name="h.tsyr0gmh82a"&gt;&lt;/a&gt;&lt;span class="c211 c248"&gt;Additional Background Notes:&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;Scala has been under development and in use since 2001 (&lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwww.scala-lang.org%2Fnode%2F25&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNE3LGRfRbxdSB7XUpCeZBIlVYxNKA"&gt;http://www.scala-lang.org/node/25&lt;/a&gt;&lt;/span&gt;&lt;span class="c4"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="c9"&gt;&lt;span class="c4"&gt;REST and JSON is an evolving area of development.. c.f. &lt;/span&gt;&lt;span class="c31"&gt;&lt;a href="http://asserttrue.blogspot.com/2010/08/jsop-idea-whose-time-has-come.html"&gt;http://asserttrue.blogspot.com/2010/08/jsop-idea-whose-time-has-come.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="c9"&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/723145211531638205-1207440686582282581?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/1207440686582282581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=1207440686582282581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/1207440686582282581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/1207440686582282581'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2010/08/olmargin0padding0pmargin0.html' title='GUI Development'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uOrl5Fl3mls/TG2SmQ5nKUI/AAAAAAAAJE4/ud9dQ2aFds8/s72-c/drawing0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-5677774881781280054</id><published>2009-12-25T21:23:00.000-08:00</published><updated>2009-12-25T21:29:41.949-08:00</updated><title type='text'>Google Data API, Google App Engine and Scala/Lift</title><content type='html'>Recently I decided to bite off this chunk of coding. What followed really emphasized and reinforced the title of this blog.  It was quite frustrating at times, frequently interesting and in the end, rewarding. I did finally get most everything to work, so here are my notes...&lt;br /&gt;&lt;br /&gt;The objective of the particular web site I did was to have the user enter a handful of values via the web page, run a model calculation based on those values and display the results.  Prior to my involvement, my colleague had done all the modeling in Excel and VB. His next step was to export the data to XML files and re-code the calculations in Java.&lt;br /&gt;&lt;br /&gt;My first step was to make the site run with Scala and Lift and let the Java code read the XML files.  No problem.&lt;br /&gt;&lt;br /&gt;Step 2: host the app somewhere.  I had read a lot about Google App Engine (GAE) and knew people who had good luck with it.  Great idea.&lt;br /&gt;&lt;br /&gt;First roadblock: I had read GAE doesn't support static data files, but that's no problem there's the GData API, and all these XML files came from spreadsheets anyway, so how hard could it be?&lt;br /&gt;&lt;br /&gt;First sidetrack: instead of reading static files and short of migrating to the GData API, it seemed I should be able to read XML files from the Jar files: ClassLoader.getResource("xmlfile_name").  I spent many hours and never did get this to work!&lt;br /&gt;&lt;br /&gt;At this point it became clear - the GAE support for Java seems to be WAY behind the Python support/documentation/functionality/etc.&lt;br /&gt;&lt;br /&gt;GoogleData API&lt;br /&gt;It seems there are several variations on this, but the REST API model seems to be quite adequate.  There are however a handful of glitchs/gotchas it seems.&lt;br /&gt;&lt;br /&gt;1) I created a user which had only view authority on a spreadsheet.  Unfortunately, it could *not* read that spreadsheet with the REST api.&lt;br /&gt;2) Everything comes back as a string.  This is not too bad, but it seems a more "robust" API would provide a bit more flexibility.&lt;br /&gt;3) The column headings are used as the key to a map of the values in each row.  This is a decent strategy, however I would like access to the actual value in the header, not the munged value used in the key.  Again, not a complete deal-killer.&lt;br /&gt;&lt;br /&gt;Google App Engine&lt;br /&gt;I did get everything running just fine with the Gdata api within those constraints.  Now it was time to deploy.  I had read several people deployed with no problem and sure enough, there are a handful of apps running with Scala/Lift.&lt;br /&gt;&lt;br /&gt;Would mine deploy?  Of course not.  It generated a couple stack traces indicating problems in the LiftFilter, but seemingly in the configuration of the logging.  Might that be just a 'warning'?  You would think so, but NO.  What the heck?  Well, 5 combo boxes aren't that big a deal, so I rewrote them in JSPs and it deployed just fine.  As always, appetite grows while dining and the client wanted the drop downs to repopulate based on certain selections.  No problem - but wait! That was why I wanted to use Lift in the first place!  Ack.  The long and the short of it was all I had to do was get a more recent version of Lift (specifically 1.1-SNAPSHOT), and it deployed just fine!&lt;br /&gt;&lt;br /&gt;Miscellaneous Glitches&lt;br /&gt;Because it is a proprietary application, I set the security of the main site to be limited to the registered users of a domain I had authorized in Google Apps.  This works quite well - the user is redirected to a login page, then to the web site.  Cool.  Now I added a page to allow an admin user to reload the app.  The documentation describes a really easy way to do that.  The fine print I didn't digest the first time around is that the members in the admin role are those users defined as admins of the application.  Oops.  I'm the admin of the application and I created it from my main Google account which is NOT in the aforementioned domain.  Oh, I can add admins, so email has been sent inviting another user I created in that domain.  Now, where did that email go?&lt;br /&gt;&lt;br /&gt;Pleasant Surprise&lt;br /&gt;All the while I was developing the app, I was wondering about releasing new versions after it was in production. I only uploaded code a couple times before I encountered the concept that GAE has the idea of versions of your application.  Several versions can be stored on the server and run independently and simultaneously! Well done, GOOG.&lt;br /&gt;&lt;br /&gt;Bottom line: Google App Engine and GData API are a good way to go. Better if you're using Python, which is not a bad choice.  I just have a lot of legacy Java code, so I'm really liking Scala and Lift.  Now I know, those are GAE-compatible also, so life is good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-5677774881781280054?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/5677774881781280054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=5677774881781280054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/5677774881781280054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/5677774881781280054'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/12/google-data-api-google-app-engine-and.html' title='Google Data API, Google App Engine and Scala/Lift'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-2653517490908035615</id><published>2009-11-04T07:49:00.000-08:00</published><updated>2009-11-04T09:27:20.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala gui'/><title type='text'>Another Reason to look at Scala for GUI</title><content type='html'>&lt;span class="Apple-style-span" style="font-family:'Times New Roman';font-size:100%;"&gt;It's just a simple thing - a form GUI to edit domain objects stored in XML. We even have a schema to describe those docs pretty well. Certain tags have one of a pre-defined list of values ("restriction" in XML schema terms). To edit this, a drop-down list is a very handy thing.  How would you populate that? Well an enum sure looks like an attractive thing and these days in Java, enums have come a long way so that you can give the enum a handful of properties.&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;So I copied each set of restricted values out of the XSD file into a Java file and created enums - dandy! The first small problem we created for ourselves is that the restricted values have dashes. Gosh, as enum identifiers dashes look a whole lot like minus signs. So now I have to map the XML value to the enum value somehow.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;pre&gt;&lt;br /&gt;    enum SensorType {&lt;br /&gt;      accelerator,&lt;br /&gt;      altimeter&lt;br /&gt;    }&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;But it's very easy to populate the combo box:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;inputSensorCombo.setModel(new DefaultComboBoxModel(SensorType.values()));&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;So I have to add the mapper, but while I'm at it I would like to have a different&lt;br /&gt;display value in the combo box that has blanks!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Still not a big problem - create the enum class with a display value and XML tag value:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';font-size:small;"&gt;&lt;pre&gt;&lt;br /&gt;enum SensorType {&lt;br /&gt;    accelerator("Accelerator", "accelerator"),&lt;br /&gt;    altimiter("Altimiter", "altimiter");&lt;br /&gt;    final String displayValue;&lt;br /&gt;    final String xmlTagValue;&lt;br /&gt;    SensorType(String displayValue, String xmlTagValue) {&lt;br /&gt;       this.displayValue = displayValue;&lt;br /&gt;       this.xmlTagValue = xmlTagValue&lt;br /&gt;    }&lt;br /&gt;    @Override&lt;br /&gt;    public String toString() {&lt;br /&gt;       return displayValue;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;With the toString override, populating the combo box is still the same.  Pretty good, yeah?  Now, I have about 4 of those. We're OO so just make a base class, right? Sorry.  As 'syntactic sugar' enum already extends Enum, so we're SOL.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Bummer.  Let's try Scala.... next post.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-2653517490908035615?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/2653517490908035615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=2653517490908035615' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/2653517490908035615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/2653517490908035615'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/11/another-reason-to-look-at-scala-for-gui.html' title='Another Reason to look at Scala for GUI'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-7729518488776006283</id><published>2009-08-11T08:41:00.000-07:00</published><updated>2009-08-11T08:47:27.245-07:00</updated><title type='text'>Do developers know branding?</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;I think we learn branding or marketing "spin" at an early age.  Here's an amusing post in Toni Epple's blog showing he clearly has: &lt;a style="color: rgb(0, 0, 0);" href="http://eppleton.sharedhost.de/blog/wp-trackback.php?p=834" rel="bookmark"&gt;"122 Platform Exercises New &amp;amp; Free - First-come, first-served!"&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-7729518488776006283?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/7729518488776006283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=7729518488776006283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/7729518488776006283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/7729518488776006283'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/08/do-developers-know-branding.html' title='Do developers know branding?'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-3090137304070163179</id><published>2009-05-23T16:50:00.000-07:00</published><updated>2009-05-23T17:38:14.639-07:00</updated><title type='text'>The evolution of SCM or Why I would like any teams I'm on to use Git</title><content type='html'>Back in the olden days of Source Code Management (SCM) there was &lt;a href="http://en.wikipedia.org/wiki/Source_Code_Control_System"&gt;SCCS&lt;/a&gt; and the original Unix things.  These depended on developers checking out code with a LOCK.  Because, after all, if you didn't have a lock and you changed things, badness would follow.&lt;br /&gt;&lt;br /&gt;Well, then along came CVS and out went the idea of locking.  Why? Merging became easy - in fact CVS would do it for you.  Ok sure, sometimes there are conflicts and you have to merge yourself... but in fact, this is rare (at least for small to medium teams I've been on).&lt;br /&gt;&lt;br /&gt;So then we upgraded to Subversion - not really substantially different than CVS - still lock-free central repository.&lt;br /&gt;&lt;br /&gt;In this world (at least on the projects I've been on) you always check in against the trunk - i.e. the main line of code.  Branching the code is still icky and to be avoided.&lt;br /&gt;&lt;br /&gt;Now, along comes Git.  (N.B. this discussion may apply to Mercurial also, i have no experience with that, but I know it's popular in many Java (i.e. Snoracle) circles).  I don't have tons of experience with Git yet, and I may have forgotten the wonderful things the guys from Everlater.com came over to @iVolunteer to teach us (http://tr.im/gitevrl8r) - BUT I'm convinced of the Git-goodness!&lt;br /&gt;&lt;br /&gt;There are two basic revolutionary aspects to it, from what I can tell:&lt;br /&gt;1) no central repository.  In some sense you use convention over configuration to determine who has the "central repository".  Yes, you need to take backups somewhere.  Yes, you need to figure out which repository to check out from for doing a build.  However, the good news is that this can be *anybody* "in the network".  Because everybody has a copy of the whole history (more or less), *anybody* can do the build.&lt;br /&gt;2) local repository.  This means several things, not the least of which is that if you're developing code you can check in locally and not break the build.  How does that work?  You have the whole repository.  But what about everybody else's code?  You have all the history you've requested from them.  If you haven't "pulled" from their local repository, yes, you're hosed.  So pull it and then do a build.  Or have them pull from you and do a build - it just doesn't matter - and that's the beauty of it.  So just as CVS got rid of the notion of merging being hard, Git gets rid of the notion that branching is hard.&lt;br /&gt;&lt;br /&gt;Variations on a theme:&lt;br /&gt;- sure, it's nice to have a publicly accessible, backed up, repository.  That's where Github comes in (and presumably whereever you want to install the equivalent.  But wait, doesn't that make it just like SVN?  Well, ok - yes, to some degree.&lt;br /&gt;- there is much finer granularity of changes.  because you can check in locally, and then I can pull from you, I can't get changes from someone that I might want to integrate with before (possilby) screwing up the whole thing.&lt;br /&gt;- and even finer, (this may be a GitX thing) you can check in just *some* changes to a file.  I had occasion where I changed a properties file (IIRC) and wanted to check in the new properties, but NOT the hard coded path to my specific files.  I checked in just some of the changes to the file - sweet.&lt;br /&gt;&lt;br /&gt;now back to figuring out how to update and check in...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-3090137304070163179?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/3090137304070163179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=3090137304070163179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3090137304070163179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3090137304070163179'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/05/evolution-of-scm-or-why-i-would-like.html' title='The evolution of SCM or Why I would like any teams I&apos;m on to use Git'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-5652013467705006236</id><published>2009-04-13T10:40:00.001-07:00</published><updated>2009-04-13T11:16:34.246-07:00</updated><title type='text'>It's TOO great a time to be a geek!</title><content type='html'>... especially if you can't decide what to do first.  I was about to Tweet:&lt;br /&gt;&lt;blockquote&gt;STILL looking 4 desktop or web client that shows msg thread: TweetDeck- click on "in reply to" Nambu shows *future* replies. Huh?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Last time I whined about that or similar, the reply I got (you know who you are!) was why not do one (write a client) yourself?  OK, OK - i will.  But that's the problem: I'm taking the Stanford class on iPhone development (&lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php"&gt;http://www.stanford.edu/class/cs193p/cgi-bin/index.php&lt;/a&gt;), where a big homework assignment is to write a Twitter client, but that's 4 weeks starting 4/20.&lt;br /&gt;&lt;br /&gt;But, wait - Dave Briccetti published a cool sample app showing how to do this in Scala (&lt;a href="http://briccetti.blogspot.com/2009/03/simple-twitter-client-bay-area-scala.html"&gt;http://briccetti.blogspot.com/2009/03/simple-twitter-client-bay-area-scala.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;And of course, there's the JavaFX version - TwitterFX (&lt;a href="http://kenai.com/projects/twitterfx"&gt;http://kenai.com/projects/twitterfx&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;But that's after the iVolunteer project I signed up to help, and my day job!&lt;br /&gt;&lt;br /&gt;Bottom line: Less Twitter *reading* and more Twitter *doing*!&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-5652013467705006236?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/5652013467705006236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=5652013467705006236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/5652013467705006236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/5652013467705006236'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/04/its-too-great-time-to-be-geek.html' title='It&apos;s TOO great a time to be a geek!'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-3046046250820603739</id><published>2009-01-27T09:19:00.000-08:00</published><updated>2009-01-27T10:08:56.765-08:00</updated><title type='text'>Java WebStart success?</title><content type='html'>Just maybe, I'm on the verge of success gaining the Holy Grail:  automatic continuous integration of a Java WebStart application!  What are the pieces?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maven and Ant&lt;/li&gt;&lt;li&gt;Artifactory&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hudson&lt;/li&gt;&lt;li&gt;Jetty&lt;/li&gt;&lt;li&gt;JNLP servlet&lt;/li&gt;&lt;/ul&gt;Whew!  Some details on each piece...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ant and Maven&lt;/span&gt;&lt;br /&gt;I like Maven for the convention it brings (as in Convention over Configuration).  The repositories and versioning of dependencies are wonderful.  The bad news is that a WebStart application isn't the traditional JAR or WAR build that Maven knows about.  (N.B. - I may come back to this, since using the JNLP servlet, it *could* be a WAR file.)  The good news would seem to be that of course, there a couple plugins that do neat WebStart things - including building the JNLP file from the dependencies.  You know, DRY!  The first one from CodeCrate offers great promise - handle the simple case!  Cool.  Well, it's a fail straightaway since it can't seem to find the dependencies at all and gets a ClassNotFoundExeception.  Bummer.  So I go for the full Monty - &lt;a href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/"&gt;Maven Webstart Plugin&lt;/a&gt; .  There's a "cookbook recipe" which shows a "Getting started" page.  But no examples for the simple case - they go straight to WAR bundles. :(  And the Maven jar signing plugin will only sign the main artifact - not all the dependencies.  Double fail.&lt;br /&gt;Ant to the rescue!  Fortunately, Ant knows how to sign jars and Hudson will run multiple steps in the build, so it is easy to mix Ant and Maven.  Ant will sign the dependency jars and Maven will build the rest of the project.  The only loss is not generating the JNLP from the dependencies.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Artifactory, Hudson and Jetty&lt;/span&gt;&lt;br /&gt;Both of these are handy web-based tools.  Each is easy to install and configure - UNLESS you want password protection.  My first thought is to bundle both into a Tomcat instance.  Should be easy enough - both give instructions on that.  Password protecting Tomcat sites should be easy enough.  OK, start with Artifactory.  Endless headaches, fails, NullPointerException, etc.  Finally come across a suggestion to never use pre-installed Tomcat instances on Linux boxes.  Oh!  OK - download and install Tomcat 6.0.18 - works great!  The password protection works.  Now, just have to add the Hudson webapp.  FAIL - OutOfMemoryError out the gazoo.   Having used Jetty before with good success, I revert to separate Jetty installations - one for Artifactory, one for Hudson.  Even with password protection!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JNLP Servlet&lt;/span&gt;&lt;br /&gt;Providing links to a JNLP file and having it link all its resources works fine.  Just one problem: the JNLP has the codebase in it, so at build/deploy time you have to know where you're deploying to.  A bit of a problem if you want to build and deploy to a test server, then promote to production.  But wait, the JNLP Servlet to the rescue: it filters the JNLP and drops in the proper codebase for you.  Nice!  Now let's see - where's the JNLP servlet?&lt;br /&gt;The JnlpDownloadServeltGuide from the Sun JavaSE 6 TechNotes says: "The servlet is packaged into the &lt;tt&gt;jnlp-servlet.jar&lt;/tt&gt; file, which can be   found in the SDK under &lt;code&gt;samples/jnlp/servlet/"  &lt;/code&gt;OK - I've got lots of JDK/JRE installations.&lt;br /&gt;&lt;code&gt;find /usr/java -name samples&lt;/code&gt;&lt;br /&gt;Nothing.  Hmm...  Oh, update 11 is out - let's download that.  And there's a nice document in the Java Web Start Reference pages called "Packaging JNLP Applications in a Web Archive" - sweet.  That's interesting, there's a "sample" directory in this JDK.  Oh, even a "jnlp" directory under that.  Cool - cooking with gas now.  Follow all the instructions about deploying, etc.  FAIL - java.lang.ClassNotFoundException: com.sun.javaws.servlet.JnlpDownloadServlet&lt;br /&gt;WTF?&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;jar -tvf WEB-INF/lib/jnlp-servlet.jar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Oh look!  All of them are "jnlp.sample" package, not "com.sun.javaws"!  Thanks a lot. So change the servlet definition in the web.xml.  Finally - success!&lt;br /&gt;&lt;br /&gt;The only remaining piece is to have Maven or Ant copy the proper files to the Jetty webapp directory.  How hard can that be?&lt;br /&gt;&lt;code&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/723145211531638205-3046046250820603739?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/3046046250820603739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=3046046250820603739' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3046046250820603739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3046046250820603739'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2009/01/java-webstart-success.html' title='Java WebStart success?'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-8442670211665144733</id><published>2008-11-11T08:18:00.000-08:00</published><updated>2008-11-11T08:29:07.970-08:00</updated><title type='text'>Why Swing UIs are so hard...</title><content type='html'>I'll tell you why - ok, well at least with issue I'm having now, which seems to be a common issue - LAYOUT.&lt;br /&gt;&lt;br /&gt;How do you nicely lay out components?  I've been reasonably happy with the layout tools NetBeans puts in for you.  But I have a main window with 9 sub-panels, almost like portlets.  Not all are the same size - and I want to have the user re-size them.  Splitters? No, not the JSplitPane - too much overhead, can only split 2 sides.  Enter the MultiSplitPane from SwingLabs - quite nice! An arbitrary grid layout even with custom split bars.  BUT - how to specify a nice division.  Well it provides "weight" - that's where the extra space goes.  But what about the initial size?  It uses each component's "preferred size" - seems like a good idea.  But how do the components set their preferred size?  This gets to the basic issue:&lt;br /&gt;&lt;br /&gt;Layout - Bottom up or top down?&lt;br /&gt;I attempted to have a component (tree control) set its preferred size based on the text and font it is assigned.  Seems like a fine idea with good control, precision, etc.  Nope!  NullPointerException - the graphics aren't assigned at constructor time.  Put in nice code:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;  String name = net.name;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  FontRenderContext frc = ((Graphics2D)this.getGraphics()).getFontRenderContext();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  TextLayout tl = new TextLayout(name, networkTree.getFont(), frc);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  setPreferredSize(new Dimension((int)(tl.getBounds().getWidth()*1.5), 0));&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;NullPointerException at the line with getGraphics.&lt;br /&gt;&lt;br /&gt;Top down...&lt;br /&gt;Seems like Swing should learn from HTML/CSS - why can't a table support column widths in percentages?  Seems like a simple enough thing - so I'm off to try banging that into MultiSplitPane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-8442670211665144733?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/8442670211665144733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=8442670211665144733' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8442670211665144733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8442670211665144733'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2008/11/why-swing-uis-are-so-hard.html' title='Why Swing UIs are so hard...'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-1539491877669099351</id><published>2008-10-09T10:32:00.000-07:00</published><updated>2008-10-09T10:46:29.793-07:00</updated><title type='text'>Better Swing through dynamic JVM languages...</title><content type='html'>The holy grail (?) - applying lessons learned in Web App development to Swing/desktop development.  We have Python, Ruby, Groovy and now Scala on the JVM.  Shouldn't they bring something to the party in terms of making my life easier to make Swing apps - which is &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; very tedious.&lt;br /&gt;&lt;br /&gt;A couple good news items on this front-&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Griffon for Groovy&lt;/span&gt; - This project shows some &lt;span style="font-style: italic;"&gt;great&lt;/span&gt; promise!  I hadn't been a big Groovy fan mostly because if it looks so much like Java, why not use Java?  But then I realize a large impediment to starting up with Python or Ruby or Scala is the learning curve.  On closer examination, it seems perhaps Groovy gets the benefits of a dynamic language while still in the overall "framework" of Java.  That would be nice.  One might say, 'but without the "buzz" it won't get the vast libraries of Python'  - true, except for the extent to which it can just use the vast array of Java libraries.  Is there an impedance mismatch?  Don't know.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monkeybars for JRuby&lt;/span&gt; - I just came across this project yesterday. (See http://groups.google.com/group/monkeybars) It seems to have a lot of the right objectives.  The interesting thing is that there is no Ruby API for Swing components - you do the actual Swing components in a Java class and the Ruby code introspects the bytecode to manipulate stuff.  Well, plausible I guess.&lt;br /&gt;&lt;br /&gt;But interestingly, I've still not come across any Python-Swing or Scala-Swing toolkit/frameworks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-1539491877669099351?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/1539491877669099351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=1539491877669099351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/1539491877669099351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/1539491877669099351'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2008/10/better-swing-through-dynamic-jvm.html' title='Better Swing through dynamic JVM languages...'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-6634273887375619820</id><published>2008-10-09T10:20:00.000-07:00</published><updated>2008-10-09T10:32:04.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java swing desktop'/><title type='text'>Singletons gone bad - again</title><content type='html'>I've been successful at using the swing framework, org.jdesktop.application classes in particular.  I have a handful of applications sharing a rather large code base.  Now however, of course we want to launch application B from application A.  It actually works, but the problem is now that the Application singleton became B instead of A and when the objects in the A application go to use their resource map or action map, the get application B which of course isn't an A, so ClassCastException results.  Ugh.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Option A&lt;/span&gt;: don't use ResourceMap and ActionMap.&lt;br /&gt;I've already headed in this direction because of NetBeans' issues around keeping track of which class is the true application when it is generating code - so that wouldn't be all bad.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Option B&lt;/span&gt;: create one master application perhaps deriving from a new class MultipleFrameApplication extended from SingleFrameApplication.  It would know how to create a new JFrame, etc.  Arguments could be passed in to specify which "real" application to run - which in this case would mean which view to show first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Option C&lt;/span&gt;: pass application A to the new view for application B.  But somewhere we need a new JFrame, etc.&lt;br /&gt;&lt;br /&gt;I have a related issue in that my model and helper (controller?) classes have common base classes and the models are singletons.  So when application B launches, I'm not sure I want a whole new B model which would replicate the base classes of model A.&lt;br /&gt;&lt;br /&gt;Hmm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-6634273887375619820?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/6634273887375619820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=6634273887375619820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6634273887375619820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6634273887375619820'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2008/10/singletons-gone-bad-again.html' title='Singletons gone bad - again'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-8146246032731898183</id><published>2008-05-06T10:20:00.000-07:00</published><updated>2008-05-06T10:25:54.840-07:00</updated><title type='text'>NetBeans (6.1) lost my code!</title><content type='html'>Things were going so well... I had created a Java Desktop application, got a desktop pane going, a dialog and an internal pane.  It was now time to take a step back, refactor a little and etc.&lt;br /&gt;&lt;br /&gt;I renamed my project, created a project group and BOOM!  No more code.  After a day or so reading about various frameworks, etc. and figuring out NetBeans 6.1 I got the program running in about an afternoon.  Now I have nothing.&lt;br /&gt;And now I have to Join Netbeans.org to post a message about this.  Forget about it!  My joining wiki.netbeans.org apparently wasn't good enough.  My subscription to nbannounce was not good enough.  FUGGET ABOUTIT!&lt;br /&gt;&lt;br /&gt;The GUI builder was fairly good - but I'm going back to IntelliJ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-8146246032731898183?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/8146246032731898183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=8146246032731898183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8146246032731898183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8146246032731898183'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2008/05/netbeans-61-lost-my-code.html' title='NetBeans (6.1) lost my code!'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-567042856907540203</id><published>2007-11-06T11:57:00.001-08:00</published><updated>2007-11-06T12:02:31.795-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Frustrating: GWT InvocationException</title><content type='html'>I am having some success with GWT - but here's one that took me a couple hours to figure out.  I created an asynchronous RPC service.  Pretty much straight from the "book".  Wouldn't work - wouldn't work.  Tore everything back to the bare bones.  (OK - the service was taking a user-defined class as an argument and returning a list.)  I changed it to take a String and return a String.  Still always got the InvocationException - with no cause.  Finally also ripped the RemoteServiceServlet back to the basics -- did I mention I implemented the init and service methods to allow setting up other stuff I needed?  Lo and behold it started working!  Doh! &lt;br /&gt;In the simple minded version I originally wrote it wasn't going to actually service anything, just initialize.  By calling super.service(request, response) things went much better.  Sometimes it IS just the simple problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-567042856907540203?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/567042856907540203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=567042856907540203' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/567042856907540203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/567042856907540203'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/frustrating-gwt-invocationexception.html' title='Frustrating: GWT InvocationException'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-4115359318956503241</id><published>2007-11-06T11:54:00.000-08:00</published><updated>2007-11-06T11:56:57.079-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='IntelliJ'/><title type='text'>Interesting: IntelliJ</title><content type='html'>My IDE travels have taken me back to IntelliJ for a tour with the EAP version of IntelliJ 7.0.  So far - very nice!  Great Maven integration.  Great GWT integration!  Only locked up on me once - I had three projects open and went to debug one of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-4115359318956503241?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/4115359318956503241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=4115359318956503241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/4115359318956503241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/4115359318956503241'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/interesting-intellij.html' title='Interesting: IntelliJ'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-3575120205855372986</id><published>2007-11-05T12:52:00.000-08:00</published><updated>2007-11-05T12:55:15.346-08:00</updated><title type='text'>Frustrating: Java on Mac OSX</title><content type='html'>As you probably know, Leopard came out recently.  Lots of us have been waiting to upgrade.  But it turns out that one of the things *NOT* coming in Leopard is Java 6!  Java 6 has been out for other platforms for quite a while.  Apple used to be way behind, then caught up, but now is dropping behind again!  I got a note from another news group that there is a grass-roots movement going on to demonstrate to Apple that there is a LOT of interest in this.  It is in that spirit that I post this secret message to Apple: 13949712720901ForOSX.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-3575120205855372986?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/3575120205855372986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=3575120205855372986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3575120205855372986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/3575120205855372986'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/frustrating-java-on-mac-osx.html' title='Frustrating: Java on Mac OSX'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-6713059850305628635</id><published>2007-11-01T15:31:00.000-07:00</published><updated>2007-11-01T15:34:13.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>More Frustrating: Eclipse</title><content type='html'>Why does a "Dynamic Web Project" require javax.persistence?  And it seems, therefore can't be deployed to the HTTP Preview (which is Jetty under the covers, right?)?  And what is different between HTTP Preview and HTTP Server?&lt;br /&gt;&lt;br /&gt;Only two facets are defined on the project: "Dynamic Web Project" and "Java", neither of which it will let me remove.  I really *don't * want persistence...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-6713059850305628635?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/6713059850305628635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=6713059850305628635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6713059850305628635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6713059850305628635'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/more-frustrating-eclipse.html' title='More Frustrating: Eclipse'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-6458905490226396800</id><published>2007-11-01T09:19:00.000-07:00</published><updated>2007-11-01T09:21:21.451-07:00</updated><title type='text'>Interesting: Why's (Poignant) Guide to Ruby</title><content type='html'>If you're interested in languages, learning languages, or Ruby - you have to check this out.&lt;br /&gt;&lt;a href="http://www.poignantguide.net/ruby/"&gt;http://www.poignantguide.net/ruby/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-6458905490226396800?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/6458905490226396800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=6458905490226396800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6458905490226396800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/6458905490226396800'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/interesting-whys-poignant-guide-to-ruby.html' title='Interesting: Why&apos;s (Poignant) Guide to Ruby'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-8896023734935962581</id><published>2007-11-01T09:03:00.000-07:00</published><updated>2007-11-01T09:17:37.663-07:00</updated><title type='text'>Frustrating: Subversion / Interesting: Bash</title><content type='html'>So in the process of messing around with IDEs, I used NetBeans (most likely) to check out my project from Subversion.  No problem - I edit my code, actually get my JSP page to work.  Let me check it in and deploy!  We're sorry - you can't check that in - Permission Denied.  We're using svn+ssh protocol and the remote user is wrong - it is my local userid which is not the remote userid.  Ok, how could that happen?  And what to do?&lt;br /&gt;&lt;br /&gt;Turns out the URL is stored in .svn/entries - just have to edit it.  Sed to the rescue.&lt;br /&gt;&gt; find . -name entries -exec sed /host/s//user@host/ {} &gt; {} \;&lt;br /&gt;Ran fine - no change.  All 'entries' files are read-only.&lt;br /&gt;&gt; find . -name entries -exec chmod u+w {} \;&lt;br /&gt;Re-run sed.  No change.  Redirect is going somewhere else.  Seem the second brace pair is not replaced with the file name.  So put the sed command into a script.  ~/bin/runsed.sh:&lt;br /&gt;sed /host/s//user@host/ $1 &gt; $1&lt;br /&gt;Ok, let me try this on one file...&lt;br /&gt;&gt; ~/bin/runsed.sh src/main/java/.svn/entries&lt;br /&gt;&gt; ls -l src/main/java/.svn/entries&lt;br /&gt;rw-r--r-- 0 entries&lt;br /&gt;Zero!??  Oops.  Change runsed.sh:&lt;br /&gt;sed /host/s//user@host/ $1 &gt; $1.fix&lt;br /&gt;Re-run fine:&lt;br /&gt;&gt; find . -name entries -exec ~/bin/runsed.sh {} \;&lt;br /&gt;Now I just have all these entries.fix files. Let's get rid of the old ones:&lt;br /&gt;&gt; find . -name entries -exec rm -f {} \;&lt;br /&gt;Hmm... now if the curly braces only expand once, we're going to need a new bash script... And I recall there's a bunch of clever stuff bash will do with variables and file names... oh - here it is: "${1%\.fix}" will get rid of that...&lt;br /&gt;~/bin/mvname.sh:&lt;br /&gt;mv $1 ${1%\.fix}&lt;br /&gt;&gt; find . -name entries.fix -exec ~/bin/mvname.sh {} \;&lt;br /&gt;Put them back to r/o:&lt;br /&gt;&gt; find . -name entries -exec chmod u-w {} \;&lt;br /&gt;&lt;br /&gt;Done!  Subversion now works again! Phew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-8896023734935962581?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/8896023734935962581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=8896023734935962581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8896023734935962581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8896023734935962581'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/frustrating-subversion-interesting-bash.html' title='Frustrating: Subversion / Interesting: Bash'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-355090272458872174</id><published>2007-11-01T08:59:00.000-07:00</published><updated>2007-11-01T09:01:54.020-07:00</updated><title type='text'>Interesting: Artifactory</title><content type='html'>We all know, and I'm even having some luck convincing people how cool Maven is... but there is that issue of libraries not published in repositories that have to be installed by hand.  Ok, and there is the issue of everybody having their own repository and installing all those in each one.  But wait - Artifactory to the rescue!&lt;br /&gt;&lt;br /&gt;I just installed it - and it just works!  Way cool.  And a browser even!  And even better, what a cool interface... an AJAX-ish tree, dialogs, progress bars...wow! How did they do that? Looks like Wicket.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-355090272458872174?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/355090272458872174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=355090272458872174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/355090272458872174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/355090272458872174'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/interesting-artifactory.html' title='Interesting: Artifactory'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-8821728958380279057</id><published>2007-11-01T08:54:00.001-07:00</published><updated>2007-11-01T09:02:27.086-07:00</updated><title type='text'>Frustrating: NetBeans 6.0 Beta</title><content type='html'>So I've heard great things about NetBeans - especially that it is now doing Ruby (as I hear on the JavaPosse podcast).  I'll give it a try.&lt;br /&gt;&lt;br /&gt;Plus: the Maven integration is way ahead of Eclipse.&lt;br /&gt;Con: after doing a Maven build, the errors don't seem to get updated in the editors - i.e. the editor and the project still show errors even though the Maven build went fine (internal or external)&lt;br /&gt;&lt;br /&gt;Con: the cursor disappears regularly - the IDE isn't hung; the mouse still works; just no keystrokes.  After restarting NB, it works fine... for a while.  (I'm on Mac OSX 10.4.10)&lt;br /&gt;&lt;br /&gt;I used to be an IntelliJ user - it was fantastic.  Let me go see if I can still get the EAP version for free...  Wait - what's this in the comments?  Artifactory... cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-8821728958380279057?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/8821728958380279057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=8821728958380279057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8821728958380279057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/8821728958380279057'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/frustrating-netbeans-60-beta.html' title='Frustrating: NetBeans 6.0 Beta'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-723145211531638205.post-906757203009171982</id><published>2007-11-01T08:45:00.000-07:00</published><updated>2007-11-01T15:36:23.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Frustrating: Eclipse</title><content type='html'>I have been using Eclipse for several years now and it has treated me generally very well.  There are so many plugins that the only real hassle has been the few occasions where the plugins collide.  However, since appetite grows while dining - I have recently come very close to declaring a divorce! Why?&lt;br /&gt;&lt;br /&gt;Upgrading to a J2EE project&lt;br /&gt;One cool thing about Eclipse is being able to deploy a web app and debug your servlets, etc.  Eclipse knows how to run Tomcat (and others) and deploy your web app to that server.  The trick to all this is that your &lt;span style="font-weight: bold;"&gt;project&lt;/span&gt; must be a 'Dynamic Web Project' (in Eclipse 3.3) or thereabouts.  Fine.  The problem arises when an existing project grows into a web project.  No! We're sorry - you can't add the 'Dynamic Web Project'(DWP) facet to a POJP (Plain Old Java Project).  No problem - I'll just make a new project that is a DWP.  Now let me get the code from Subversion - let's see: run "Team-&gt;Share Project".  We're sorry, you must specficy a NEW subversion folder.  But I want the one that's already there!&lt;br /&gt;[Actually I just remembered there's now something like "Import from SVN"]&lt;br /&gt;Ok - yes, you can create a new project which is "Check out existing project from SVN" AND even run the "New project wizard" on it to make it a dynamic web project, or whatever you need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/723145211531638205-906757203009171982?l=infrustroftwares.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://infrustroftwares.blogspot.com/feeds/906757203009171982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=723145211531638205&amp;postID=906757203009171982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/906757203009171982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/723145211531638205/posts/default/906757203009171982'/><link rel='alternate' type='text/html' href='http://infrustroftwares.blogspot.com/2007/11/frustrating-eclipse.html' title='Frustrating: Eclipse'/><author><name>Mark Chance</name><uri>https://profiles.google.com/103118717545174498585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-2g96MUv1-gU/AAAAAAAAAAI/AAAAAAAAJok/3jwWcj0HKro/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
