<?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:blogger='http://schemas.google.com/blogger/2008' 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-10087099</id><updated>2024-09-08T06:53:57.640-07:00</updated><category term="android"/><category term="peer2"/><category term="peersquared"/><category term="ror"/><category term="routes rails parameters"/><title type='text'>Software Musings - Mind on Rails.</title><subtitle type='html'>A set of articles, or possible just comments on the details of software development, project management, and the eternal controversy of &#39;build-here&#39; vs. 3rd party technology...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10087099.post-9060617779739013670</id><published>2010-05-05T08:11:00.001-07:00</published><updated>2010-05-05T08:11:57.872-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="peer2"/><category scheme="http://www.blogger.com/atom/ns#" term="peersquared"/><title type='text'>peer²</title><content type='html'>&lt;div style=&quot;padding-bottom: 15px; margin-top: 15px; margin-bottom: 15px;&quot;&gt;&lt;div style=&quot;width: 310px; margin-left: auto; margin-right: auto;&quot;&gt; &lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0&quot; width=&quot;310&quot; height=&quot;466&quot; id=&quot;swfplayer&quot; align=&quot;middle&quot;&gt; &lt;param name=&quot;allowScriptAccess&quot; value=&quot;sameDomain&quot; /&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;false&quot; /&gt; &lt;param name=&quot;movie&quot; value=&quot;http://www.peer2.com/swf/player.swf&quot; /&gt;&lt;param name=&quot;flashvars&quot; value=&quot;serverName=www.peer2.com&amp;networkId=4&amp;amp;userId=1243&quot; /&gt;&lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#999999&quot; /&gt;    &lt;embed src=&quot;http://www.peer2.com/swf/player.swf&quot; quality=&quot;high&quot; bgcolor=&quot;#999999&quot; width=&quot;310&quot; height=&quot;466&quot; name=&quot;swfplayer&quot; align=&quot;middle&quot; allowScriptAccess=&quot;sameDomain&quot; allowFullScreen=&quot;false&quot; type=&quot;application/x-shockwave-flash&quot; flashvars=&quot;serverName=www.peer2.com&amp;networkId=4&amp;amp;userId=1243&quot; pluginspage=&quot;http://www.adobe.com/go/getflashplayer&quot; /&gt;&lt;/object&gt;&lt;/div&gt; &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/9060617779739013670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/9060617779739013670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/9060617779739013670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/9060617779739013670'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2010/05/peer.html' title='peer²'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-3481820691927095745</id><published>2010-01-25T06:18:00.001-08:00</published><updated>2010-01-25T06:20:23.064-08:00</updated><title type='text'>HttpCommons and Ror</title><content type='html'>I finally got everything to work - in case this helps anyone else:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;    httpClient.getParams().setParameter(&quot;http.socket.timeout&quot;,&lt;br /&gt;                    new Integer(90000)); // 90 second&lt;br /&gt;            httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,&lt;br /&gt;                    HttpVersion.HTTP_1_0);&lt;br /&gt;            httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET,&lt;br /&gt;                    &quot;UTF-8&quot;);&lt;br /&gt;           &lt;br /&gt;            post = new HttpPost(new URI(url));&lt;br /&gt;&lt;br /&gt;            Charset chars = Charset.forName(&quot;UTF-8&quot;);&lt;br /&gt;            StringBody user_id = new StringBody(&quot;32432&quot;, chars);&lt;br /&gt;           &lt;br /&gt;            MultipartEntity multipartContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);&lt;br /&gt;            multipartContent.addPart(&quot;media_entry[media]&quot;, new FileBody(file));&lt;br /&gt;            multipartContent.addPart(&quot;media_entry[user_id]&quot;, user_id);&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;            post.setEntity(multipartContent);&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;               &lt;br /&gt;            HttpResponse response = httpClient.execute(post);&lt;br /&gt;            response.getEntity().getContent().close();&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;does the trick.&lt;br /&gt;&lt;br /&gt;The important part is the forcing of the HTTP/1.0 protocol, since most rails web servers don&#39;t support chunked-encoding.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/3481820691927095745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/3481820691927095745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/3481820691927095745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/3481820691927095745'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2010/01/httpcommons-and-ror.html' title='HttpCommons and Ror'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-1415530583084277280</id><published>2010-01-23T09:34:00.000-08:00</published><updated>2010-01-23T10:06:33.699-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="ror"/><title type='text'>Android and RoR Rest Services</title><content type='html'>In case this helps anyone else:&lt;br /&gt;When you are doing multipart uploads from Android to Rails, you need to make sure that you tell the MultipartEntry to be Browser compatible:&lt;br /&gt;&lt;br /&gt;   &lt;blockquote&gt;MultipartEntity multipartContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);&lt;br /&gt;            multipartContent.addPart(&quot;media_entry[media]&quot;, new FileBody(file));&lt;br /&gt;            multipartContent.addPart(&quot;media_entry[user_id]&quot;, sb1);&lt;/blockquote&gt;and now I&#39;ll get back to our new project.  More to come when we release an alpha version.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/1415530583084277280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/1415530583084277280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/1415530583084277280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/1415530583084277280'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2010/01/android-and-ror-rest-services.html' title='Android and RoR Rest Services'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-5357662689119595608</id><published>2008-01-30T08:04:00.001-08:00</published><updated>2008-01-30T08:05:07.205-08:00</updated><title type='text'>Nothing new... so just wanted to thank</title><content type='html'>This guy, who started my morning off with a very simple solution:&lt;br /&gt;http://www.planetrubyonrails.org/tags/view/cookies&lt;br /&gt;&lt;br /&gt;Thank you Rspec and thank you planetrubyonrails.org...</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/5357662689119595608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/5357662689119595608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/5357662689119595608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/5357662689119595608'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2008/01/nothing-new-so-just-wanted-to-thank.html' title='Nothing new... so just wanted to thank'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-4253009836029516096</id><published>2008-01-22T19:02:00.000-08:00</published><updated>2008-01-23T12:20:12.777-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="routes rails parameters"/><title type='text'>Rails Routes Hell</title><content type='html'>I have spent the last day in the seventh level of Rails hell (or something like that... it&#39;s been a while since I&#39;ve read my Dante). Quite simply, I have been trying to have routes send a url in the form /cgi-bin/query?command=5 to a different controller/action based on the command parameter.&lt;br /&gt;&lt;br /&gt;To be honest, I&#39;d prefer to just remove the asinine code in the first place, but given that I don&#39;t have time to rewrite a fairly large client, it would be a great deal easier if I could just do a simple url rewrite.&lt;br /&gt;&lt;br /&gt;Well, since I did work a solution out, I&#39;ll post it here, but good God (what&#39;s with my theological allusions today?) - if you have a better way, please tell me.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;module ActionController&lt;br /&gt;module Routing&lt;br /&gt;&lt;br /&gt;class Route&lt;br /&gt;&lt;br /&gt;TESTABLE_REQUEST_METHODS = [:command]&lt;br /&gt;&lt;br /&gt;def recognition_conditions&lt;br /&gt;result = [&quot;(match = #{Regexp.new(recognition_pattern).inspect}.match(path))&quot;]&lt;br /&gt;conditions.each do method, value&lt;br /&gt;if TESTABLE_REQUEST_METHODS.include? method&lt;br /&gt;result &lt;&lt; method =&quot;&quot;&gt; request.method,&lt;br /&gt;:command =&gt; request.query_parameters[&#39;command&#39;]&lt;br /&gt;}&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;and then in my controller:&lt;br /&gt;map.connect &#39;cgi/query&#39;, :action =&gt; &#39;homepage&#39;, :controller =&gt; &#39;home&#39;, :conditions =&gt; { :command =&gt; /1/ }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This works, but isn&#39;t there are a good way of doing this without have to extend Rails internals? It just seems like there should be an easier way. I read Jamis articles, and while I learnt a great deal about the routes system, I still didn&#39;t get how to do any better that this.&lt;br /&gt;&lt;br /&gt;http://weblog.jamisbuck.org/2006/10/4/under-the-hood-route-recognition-in-rails&lt;br /&gt;&lt;br /&gt;and his routing trick plugin...&lt;br /&gt;http://www.workingwithrails.com/railsplugin/4789-routing-tricks.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/4253009836029516096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/4253009836029516096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/4253009836029516096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/4253009836029516096'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2008/01/rails-routes-hell.html' title='Rails Routes Hell'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-115517869739029966</id><published>2006-08-09T19:56:00.000-07:00</published><updated>2008-01-23T12:17:43.381-08:00</updated><title type='text'>SyncML</title><content type='html'>Well, since I can&#39;t say that I post here on a regular basis, I will at least attempt to mark some things that I find interesting:&lt;br /&gt;&lt;br /&gt;www.scheduleworld.com&lt;br /&gt;&lt;br /&gt;This is a nifty little tool which allows you to sync all of your devices and program together by taking advantage of the many SyncML clients out there. While for the moment, google and others do not provide a SyncML, this little website meshes it all together...&lt;br /&gt;&lt;br /&gt;And if you need SyncML clients for anything ( iPod included):&lt;br /&gt;http://www.funambol.com/opensource/</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/115517869739029966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/115517869739029966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/115517869739029966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/115517869739029966'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/08/syncml.html' title='SyncML'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113946366186177775</id><published>2006-02-08T21:34:00.000-08:00</published><updated>2008-01-23T12:17:15.328-08:00</updated><title type='text'>Mobile Phone Servers</title><content type='html'>Ok.. so now there is apparently a sudden realization in the community that, yes, you can run a server on a mobile phone.&lt;br /&gt;http://www.mopocket.com/2006/02/use_your_phone_as_a_web_server.php&lt;br /&gt;&lt;br /&gt;Now, I am really sorry to rain on the parade here, but this is hardly a newsworthy item in itself. The fact that someone ported Apache is rather fun... but that is about it. And besides, the concept is hardly new: Symbian released on for their communicator servies sometime about 4(?) years ago.&lt;br /&gt;&lt;br /&gt;I am, however, going to ignore the prior art and concentrate on what it might provide:&lt;br /&gt;http://mobilesociety.typepad.com/mobile_life/2006/02/this_is_a_draft.html&lt;br /&gt;&lt;br /&gt;NO, NO, and NO.... sorry guys. Why would I possibly make a web server on my mobile, which may have internet outages due to lack of Wifi and GSM? How about just the boring old central web server, and lots of client ( e.g. your notebook, desktop and mobile phone) connecting to this. In terms of real time update, you can simply have the devices check every minute for updates and pull new information, or use a push approach which tries to contact the mobile devices/notebook/desktop whenever there is some new data.... this is not rocket science here guys.&lt;br /&gt;&lt;br /&gt;I&#39;ll be honest - Blackberry has a better infrastruture that multiple web hosts.&lt;br /&gt;&lt;br /&gt;Sorry to be so down on this hype.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113946366186177775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113946366186177775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113946366186177775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113946366186177775'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/02/mobile-phone-servers.html' title='Mobile Phone Servers'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113946046448891688</id><published>2006-02-08T20:38:00.000-08:00</published><updated>2008-01-23T12:16:08.097-08:00</updated><title type='text'>I hate Symbian C++</title><content type='html'>Well... i have been hating it for some time now.&lt;br /&gt;I have finally achieved something, which for all intents and purposes should be a very simple task: to record audio and muck around a little with the content.&lt;br /&gt;&lt;br /&gt;I have finally managed, but damn I wish there were more documentation on this stuff.&lt;br /&gt;In case you happen to be working on this stuff: find the Audio_Streaming_Example.Take a look at it, and understand that in most new versions of symbian, the buffers only get filed with 320 bytes, regardless of how large the buffer is.&lt;br /&gt;Also - make sure that you have an Active Objects timer running. Running this stuff from a console app is virtually impossible.&lt;br /&gt;&lt;br /&gt;Oh - and if you don&#39;t ingest the object, the timer may stop - i am not clear on whether it always stops, but this is very worth noting. If you happen to be sending stuff over http,be careful, since it may garble the recording if you send anything too large.&lt;br /&gt;&lt;br /&gt;So much fun...</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113946046448891688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113946046448891688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113946046448891688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113946046448891688'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/02/i-hate-symbian-c.html' title='I hate Symbian C++'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113847480371965153</id><published>2006-01-28T10:45:00.000-08:00</published><updated>2008-01-23T12:15:17.658-08:00</updated><title type='text'>The future of Mobile Phones</title><content type='html'>Since it is virtually impossible for me to keep up a regular scheduling for posting to this list, I thought that I would try a new experiment: to simply write about what I think about everyday, what I code for everyday, and what I write papers about every other week or so: mobile phones, their software, and the way they have affected society.&lt;br /&gt;&lt;br /&gt;Yesterday, I picked up a book called The Mobile Connection by Richard Ling. Most of the book is a vast overview of statistics, academic references and recap of social uses of mobile phones which you probably already know about. That is not, however, meant to be a disparaging remark - it successfully captures a vast set of data that is scattered around, misquoted, and often misunderstood by many people in the community, including the so-called pundits.&lt;br /&gt;&lt;br /&gt;The most interesting idea in the book, however, is not the main theme of the book. Richard Ling proposes that society was fundamentally modified by the wristwatch/time keeping devices, and that the way we view the notion of the schedule and the meeting is based on this idea. He also argues that mobile phones, given their instantatious nature and ubiquity, provide a solution for last minute changes/ad hoc meeting/ and non-specific meeting setups. The examples themselves are self-evident, until you start really thinking about the implications of what he is talking about. An example of mobile phone meetings (you&#39;ve probably had a similar conversation today):&lt;br /&gt;A: Want to meet up tonight?&lt;br /&gt;B: Sure. How about around 10.&lt;br /&gt;A: ok - i&#39;ll give you a call.&lt;br /&gt;&lt;br /&gt;Later on in the evening, A and B may work out what to actually do, and where to do meet. Now, if we imagine this as an application, this could be translated into a software system which does the following:&lt;br /&gt;&lt;br /&gt;We define a meeting as being at 10ish and having certain particpants.&lt;br /&gt;At 10ish, most of us are in the same location, or available for a remote meeting, so our mobile phones warn us that the meeting starts soon. We continue working, not wishing to waste time standing around waiting for people. When everyone is ready, the phone tells us, and either directs us to go to the conference room, or dials in.&lt;br /&gt;&lt;br /&gt;This system can accomodate anything from delays due to traffic, or people missing from the meeting. THe system can take over and herd people into the rooms.&lt;br /&gt;&lt;br /&gt;Any thoughts?&lt;br /&gt;&lt;br /&gt;&lt;iframe style=&quot;WIDTH: 120px; HEIGHT: 240px&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; src=&quot;http://rcm.amazon.com/e/cm?t=softwaremusin-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1558609369&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000ff&amp;amp;bc1=000000&amp;amp;bg1=ffffff&amp;amp;f=ifr&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113847480371965153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113847480371965153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113847480371965153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113847480371965153'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/01/future-of-mobile-phones.html' title='The future of Mobile Phones'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113817272968496554</id><published>2006-01-24T23:01:00.000-08:00</published><updated>2006-01-24T23:05:29.683-08:00</updated><title type='text'></title><content type='html'>Nice way to encourage users to download software:&lt;br /&gt;http://www.cameraphonereport.com/2006/01/op3_discusses_s.html&lt;br /&gt;&lt;br /&gt;just provide a library... although I thought that handango already did that.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113817272968496554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113817272968496554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817272968496554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817272968496554'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/01/nice-way-to-encourage-users-to.html' title=''/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113817232447313978</id><published>2006-01-24T22:57:00.000-08:00</published><updated>2008-01-23T12:11:58.103-08:00</updated><title type='text'>To sleep, perchance to dream</title><content type='html'>This is a fantastic idea:&lt;br /&gt;http://www.engadget.com/2006/01/23/axbo-alarm-clock-wakes-you-when-youre-ready/&lt;br /&gt;&lt;br /&gt;I am still bewildered by the fact that American kids gets so little sleep in highschool. I was talking to some people that claim that most get less than 6 hours a night... i didn&#39;t do stuff that stupid until...well, right now.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113817232447313978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113817232447313978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817232447313978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817232447313978'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/01/to-sleep-perchance-to-dream.html' title='To sleep, perchance to dream'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-113817202540666207</id><published>2006-01-24T22:49:00.000-08:00</published><updated>2008-01-23T12:11:24.911-08:00</updated><title type='text'>The mobile world</title><content type='html'>Once again , I have been remiss in posting here, so I thought that I would begin with a summary of some of the interesting things that I have found over the past few months.&lt;br /&gt;&lt;br /&gt;Nathan Eagles&#39; work on social software still fascinates me:&lt;br /&gt;http://reality.media.mit.edu/&lt;br /&gt;&lt;br /&gt;There is some interesting work being done in Finland... although it is very much a platform, rather than a concrete new idea:&lt;br /&gt;http://www.cs.helsinki.fi/group/context/&lt;br /&gt;&lt;br /&gt;and... i only recently discovered the following site... sometimes I am slow.&lt;br /&gt;http://www.engadget.com/</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/113817202540666207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/113817202540666207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817202540666207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/113817202540666207'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2006/01/mobile-world.html' title='The mobile world'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-111331765830643881</id><published>2005-04-12T07:49:00.000-07:00</published><updated>2008-01-23T12:10:29.223-08:00</updated><title type='text'>The bigger the phone, the better</title><content type='html'>I have just had the opportunity to play/work with two of the new Nokia smartphones: the 7710 and the Communicator 9500.&lt;br /&gt;&lt;br /&gt;Now, first off, I would like to make it clear that these two phones are targeted to very different markets, but still share many communalities.&lt;br /&gt;&lt;br /&gt;The 7710 is a &#39;cool&#39; phone with stereo headphones, FM radio ( called Visual Radio), and is generally targeted as a general replacement for everything that ails you; the Communicator, is as many of you know, a all-in-one communication device for the business user who needs to email/surf the web and generally stay in touch around the world.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/111331765830643881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/111331765830643881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111331765830643881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111331765830643881'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/04/bigger-phone-better.html' title='The bigger the phone, the better'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-111237196189913686</id><published>2005-04-01T07:45:00.000-08:00</published><updated>2008-01-23T12:09:29.535-08:00</updated><title type='text'>New job</title><content type='html'>Today is the 3rd day at my new job - and so far, it is a real break from my last gig (can a 2.5 year position be called a gig?) The code base is an order of magnitude cleaner than the last codebase, is driven by hibernate, spring, and struts and was done more or less correctly, with no massivly visible lacunae.&lt;br /&gt;&lt;br /&gt;To all future managers of software groups - your team wants to make good code. Your team wants to make good code for a good reason, and it is not an abstract geeky reason, although the two are often correlated. Good code leads to fast development and fast learning.&lt;br /&gt;&lt;br /&gt;At my last company, it took me several months to get up to speed with enough of the code base to make additions to the system. At my new company, it took me about 3 hours before I was coding and being productive. That is a lot of money the company saved by giving their coders time to fix broken code. Right now, my old company is desperately trying to train someone to even understand their system... good luck.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/111237196189913686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/111237196189913686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111237196189913686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111237196189913686'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/04/new-job.html' title='New job'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-111237029466546697</id><published>2005-04-01T07:37:00.000-08:00</published><updated>2008-01-23T12:08:00.449-08:00</updated><title type='text'>AOP and caching</title><content type='html'>I was recently developing a new AJAX based system for picking a drug from a long list of potentials (this sounds a lot more fun/dodgy/illegal than it really was). Specifically, there are two drop down lists - picking an element from the first select list makes the page look up the entry from the server.&lt;br /&gt;&lt;br /&gt;In itself, this is rather unexciting, but i got a chance to code in what is IMHO a rather elegant manner:&lt;br /&gt;&lt;br /&gt;I used JSON for the javascript-server client communication, and spring+hibernate for all server side interaction. Now, at this point, we are still talking a decent implementation. The part that I really liked was using AOP for method level caching.&lt;br /&gt;&lt;br /&gt;Since the response time of the system needs to be as close to seamless as possible, I needed to make sure that round-trips to the database happened as infrequently as possible. There are, of course, two ways this can be accomplished: the first would be to code a caching mechanism at the service layer, and the second was to use AOP to put it in declaritavly after the rest of the code worked.&lt;br /&gt;&lt;br /&gt;I looked around for a few minutes on the spring web site and found a couple of EHCache based method caches, stuck them into my working application, and presto: the time delay that had been due to database look-up was entirely removed. It actually seemed faster than normal javascript.&lt;br /&gt;&lt;br /&gt;AOP, when used correctly, is a truly beautiful technology. On a side note, a friend and I did some performance testing of reflection in JDK 1.4 and 1.5.  End result: don&#39;t worry about it, unless you are in a endless loop. I will post more about that later.</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/111237029466546697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/111237029466546697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111237029466546697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111237029466546697'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/04/aop-and-caching.html' title='AOP and caching'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-111099171365478655</id><published>2005-03-16T08:41:00.000-08:00</published><updated>2008-01-23T12:05:08.867-08:00</updated><title type='text'>Spring is great; Spring sucks</title><content type='html'>In general, I have found Spring to be an invaluable framework for my development tasks. It provides fairly elegant APIs for most useful things, and does them well. Occasionally, however, you can get really stuck. I wasted several hours ( possibly days) trying to fix the following problem:&lt;br /&gt;I upgraded to Tomcat 5.0.28 and somehow all my Spring applications stopped working. Specifically, i could not get a datasource to save my life, and this being a database driven web system, I was left in the proverbial mud (if that is indeed a proverb.  I&#39;m a software developper, not a sage).&lt;br /&gt;It turns out that there is parameter ( little documented as far as I can tell) called &quot;resourceRef&quot;. Now, I haven&#39;t really explored exactly what it does, but as far as I can tell, it simply appends &quot;java:comp/env/&quot; to the beginning of the jndi name. This in itself wouldn&#39;t have been such a big deal - and I would have probably thought to look there earlier, had the template file which I have been using ( copied from Spring, I believe) had the following text:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have since removed that comment.&lt;br /&gt;javax.naming.NameNotFoundException: Name jdbc is not bound in this Context&lt;br /&gt;at org.apache.naming.NamingContext.lookup(NamingContext.java:768)&lt;br /&gt;at org.apache.naming.NamingContext.lookup(NamingContext.java:151)&lt;br /&gt;at org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)&lt;br /&gt;at javax.naming.InitialContext.lookup(InitialContext.java:347)&lt;br /&gt;at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:123)&lt;br /&gt;at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:85)&lt;br /&gt;at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:121)&lt;br /&gt;at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:71)&lt;br /&gt;at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:85)&lt;br /&gt;at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:124)&lt;br /&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1073)&lt;br /&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:343)&lt;br /&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:260)&lt;br /&gt;at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:221)&lt;br /&gt;at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145)&lt;br /&gt;at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285)&lt;br /&gt;at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:317)&lt;br /&gt;at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:131)&lt;br /&gt;at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:224)&lt;br /&gt;at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:150)&lt;br /&gt;at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:48)&lt;br /&gt;at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3827)&lt;br /&gt;at org.apache.catalina.core.StandardContext.start(StandardContext.java:4343)&lt;br /&gt;at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)&lt;br /&gt;at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)&lt;br /&gt;at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)&lt;br /&gt;at org.apache.catalina.core.StandardHostDeployer.addChild(StandardHostDeployer.java:903)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;at java.lang.reflect.Method.invoke(Method.java:324)&lt;br /&gt;at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:216)&lt;br /&gt;at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:256)&lt;br /&gt;at org.apache.commons.digester.Rule.end(Rule.java:276)&lt;br /&gt;at org.apache.commons.digester.Digester.endElement(Digester.java:1058)&lt;br /&gt;at org.apache.catalina.util.CatalinaDigester.endElement(CatalinaDigester.java:76)&lt;br /&gt;at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)&lt;br /&gt;at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)&lt;br /&gt;at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)&lt;br /&gt;at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)&lt;br /&gt;at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)&lt;br /&gt;at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)&lt;br /&gt;at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)&lt;br /&gt;at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)&lt;br /&gt;at org.apache.commons.digester.Digester.parse(Digester.java:1567)&lt;br /&gt;at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:488)&lt;br /&gt;at org.apache.catalina.core.StandardHost.install(StandardHost.java:863)&lt;br /&gt;at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:483)&lt;br /&gt;at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)&lt;br /&gt;at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)&lt;br /&gt;at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)&lt;br /&gt;at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)&lt;br /&gt;at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)&lt;br /&gt;at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)&lt;br /&gt;at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)&lt;br /&gt;at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)&lt;br /&gt;at org.apache.catalina.core.StandardService.start(StandardService.java:480)&lt;br /&gt;at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)&lt;br /&gt;at org.apache.catalina.startup.Catalina.start(Catalina.java:556)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;at java.lang.reflect.Method.invoke(Method.java:324)&lt;br /&gt;at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)&lt;br /&gt;at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/111099171365478655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/111099171365478655' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111099171365478655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111099171365478655'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/03/spring-is-great-spring-sucks.html' title='Spring is great; Spring sucks'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-111040672256626677</id><published>2005-03-09T14:14:00.000-08:00</published><updated>2008-01-23T12:02:24.425-08:00</updated><title type='text'>JSON and Spring</title><content type='html'>Not that this is necessarily the best place to post, but here it goes:&lt;br /&gt;&lt;br /&gt;I can case you are trying to use Spring and JSON and happen to not be able to modify an existing servlet/jsp page to accomplish your goal, there is a work around:&lt;br /&gt;&lt;br /&gt;public class NDCJSONSessionFilter extends OncePerRequestFilter {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected void doFilterInternal(&lt;br /&gt;HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HttpServletRequest req = (HttpServletRequest)request;&lt;br /&gt;HttpServletResponse res = (HttpServletResponse)response;&lt;br /&gt;&lt;br /&gt;// Find the JSONRPCBridge for this session or create one&lt;br /&gt;// if it doesn&#39;t exist. Note the bridge must be named &quot;JSONRPCBridge&quot;&lt;br /&gt;// in the HttpSession for the JSONRPCServlet to find it.&lt;br /&gt;HttpSession session = req.getSession(true);&lt;br /&gt;JSONRPCBridge json_bridge = null;&lt;br /&gt;json_bridge = (JSONRPCBridge) session.getAttribute(&quot;JSONRPCBridge&quot;);&lt;br /&gt;&lt;br /&gt;if(json_bridge == null) {&lt;br /&gt;json_bridge = new JSONRPCBridge();&lt;br /&gt;session.setAttribute(&quot;JSONRPCBridge&quot;, json_bridge);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;WebApplicationContext context = WebApplicationContextUtils&lt;br /&gt;.getRequiredWebApplicationContext(getServletContext());&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;FONT-STYLE: italic&quot;&gt;IService &lt;/span&gt;service = (&lt;span style=&quot;FONT-STYLE: italic&quot;&gt;IService &lt;/span&gt;)context.getBean(&quot;service&quot;);&lt;br /&gt;&lt;br /&gt;json_bridge.registerObject(&quot;Service&quot;, service);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-- this will allow you use JSON if you happen to be limited by something like by the use of velocity templates, etc.&lt;br /&gt;&lt;br /&gt;This probably not useful to anyone else, but just in case. Oh, and does anyone know how I can put code in a blog??</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/111040672256626677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/111040672256626677' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111040672256626677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/111040672256626677'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/03/json-and-spring.html' title='JSON and Spring'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10087099.post-110979558300640533</id><published>2005-03-02T05:33:00.000-08:00</published><updated>2008-01-23T12:01:20.392-08:00</updated><title type='text'>Object-Relational mapping</title><content type='html'>You may have overheard the question before, whispered clandestinely between curious developpers.  &#39;What is the point of using a object-relational tool - why not just use JDBC?&#39; They ask.  &#39;We know the database, and we can create the objects as we need them.&#39;  Let me posit some answers.&lt;br /&gt;&lt;br /&gt;In order to address this question, we need to understand the full scope of a persistence layer.&lt;br /&gt;&lt;br /&gt;1.) Transparent and/or low impact enabling of persistence on objects.&lt;br /&gt;2.) Caching of objects&lt;br /&gt;3.) Querying of objects&lt;br /&gt;4.) Mapping of database to the objects and usually vice-versa&lt;br /&gt;&lt;br /&gt;A lot of developers out there end up gradually evolving a home-grown and usual only partially functional persistence layer -- piece by piece, layer by layer.&lt;br /&gt;&lt;br /&gt;At my current company, we have gone through 2 or 3 different persistence mechanisms over three years, with each one leaving a long trail of problems. This reflects general trends in software development over the past few years, although our codebase does seem to be a few years behind the industry-wide trends.&lt;br /&gt;&lt;br /&gt;In the first stage, the code base was written using what is typically called a Table access mechanism, i.e., with a more or less 1-to-1 correspondence between the database structure and that of the data access objects. The relationships between tables are embodied in the SQL at the code level ( i.e. straight-forward JDBC for data retrieval and recording.)&lt;br /&gt;&lt;br /&gt;The second generation (and, really the final generation, the third having never really received full traction in the company) comprises an evolutionary approach to persistence. This involves the following stages:&lt;br /&gt;&lt;br /&gt;1.) Creating a set of classes similar to the classes above for loading/saving of individual classes&lt;br /&gt;2.) Creating a single mechanism for loading of certain classes based on a unique ID structure (i.e. each class type has a corresponding ID type which is passed to the loader)&lt;br /&gt;3.) Implementing caching for each loader.&lt;br /&gt;4.) Getting the objects to manage their loading (e.g. have classes load database connections in the model)&lt;br /&gt;5.) Creating a separate system for the saving of data.&lt;br /&gt;&lt;br /&gt;Now, each of these evolutions came about as a new requirement came in, and the reason that a complete persistence system was never implemented was because it was never absolutely necessary to have a complete persistence domain at any one time. One can see, however, that in the end, the final result is a limited and rather poorly designed persistence mechanism. This, at least partially, illustrates why it is useful to think about the long-term picture before patching a limited system.&lt;br /&gt;&lt;br /&gt;This addresses at least 3 of the properties listed above, but does not address the querying property. This came about later, when we were doing real-time analysis of data. Since we have a complex object model, including who created the data, who currently owned the data, etc -- altogether over 40 interconnected classes, ignoring sub-domain specific classes and data tables -- we often found ourselves performing complex queries across the datasets. The manner in which these queries were written down evolved over time, until they came to be written in a language that had a strange resemblance and HQL. Unfortunately, by the time this came about, we had written at least 3 different libraries for efficiently producing SQL queries, with the final version being only very slightly different from HQL.&lt;br /&gt;&lt;br /&gt;The reasons that these changes were not foreseen (or perhaps just ignored) revolve a great deal around the politics of the company and its reluctance to use new technologies. However, at a deeper level it is a common mistake to evolve a design based on a small problem domain and not grasp the whole picture of where the code is heading. In our case, this had a great deal more to do with the quasi-burlesque view of our software as being a different from all other software projects, from the manner in which it was conceived, to its functionality, and finally to it capabilities, but these are topics for another day.&lt;br /&gt;&lt;br /&gt;Since this is my first blog, I would appreciate comments ( if anyone happens to read this) with regards to the content: is this too little detail, is it stating the obvious, and does anyone really care? Did this help in the least bit to clarify why O/R layers are actually useful and not just some bizarre metadata-driven form of intellectual masturbation that allows architects to defend their constantly evolving realm?</content><link rel='replies' type='application/atom+xml' href='http://softwaremusings.blogspot.com/feeds/110979558300640533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10087099/110979558300640533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/110979558300640533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10087099/posts/default/110979558300640533'/><link rel='alternate' type='text/html' href='http://softwaremusings.blogspot.com/2005/03/object-relational-mapping.html' title='Object-Relational mapping'/><author><name>anthonyj</name><uri>http://www.blogger.com/profile/05832038056786727450</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUKztLafgt6CS2Wh_Dx6_nnjOZ7_NJZ4zL4QNCanSgdyvKlohhbreqyjVwJeK3evAVYnqix3NRTnlvtersV5UY6lkJp2ESDqUcrpiEc5PI4udAK_0zGz7i-XlKvmc02Fc/s220/n706585_31583760_1558.jpg'/></author><thr:total>0</thr:total></entry></feed>