tag:blogger.com,1999:blog-43362662576390135042009-04-01T08:34:04.215-07:00Code Elementscoding and community in Portland, OregonSam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-4336266257639013504.post-14062124274911243972009-03-20T17:38:00.000-07:002009-03-20T17:39:00.533-07:00SOLR : very impressive lucene based search tool<p>Very impressed with Solr and the development community behind it. <a href="http://lucene.apache.org/solr/">http://lucene.apache.org/solr/</a></p> <p>1.5 days of research, submitted bug and resulting immediate patch and I have a fully funtional search engine for a project at work.</p> <p>If you&#39;ve ever thought it would be nice to have your very own google type appliance, I highly recommend you check out solr and the underlying IR engine: lucene.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-1406212427491124397?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-91918832665929172732009-03-20T10:23:00.000-07:002009-03-20T11:04:54.172-07:00Passing the Turing TestOne of the books I am currently reading is "<a href="http://www.amazon.com/Introduction-Neural-Networks-Java-2nd/dp/1604390085/">An Introduction to Neural Networks</a>". The introductory chapter covered the <a href="http://en.wikipedia.org/wiki/Turing_test">Turing Test</a> and the fact that no computer has ever come close to passing it. The context of the chapter was about the limitations of the computer to house and efficiently access a db of <span style="font-style: italic;">human knowledge</span> in order to answer the questions as a human would.<br /><br />A thought occurred to me. Are humans becoming more <span style="font-style: italic;">computer-like</span> in the way we interact with each other? In this day and age, many of us interact with computers more than we do with humans. I'm doing it write now as I write this. We gain a great deal of our knowledge as a result of direct contact with computer systems and much of our 'human to human' interaction are proxied through computer systems (twitter, IM, email, etc) and we adapt out language on those systems accordingly. <br /><br />For instance, a human could ask another human:<br /><span style="font-weight: bold;">"Hey Sam, are you attending OSCON this year?"</span> <br /><br />The equivilent tweet might be:<br /><span style="font-weight: bold;">"@samkeen are you </span><span style="font-weight: bold;">attending</span><span style="font-weight: bold;"> #oscon2009"</span><br /><br />And some line of computer code might be:<br /><span style="font-family: courier new; font-weight: bold;">if(samkeen.attending('oscon2009')) {</span><br /><span style="font-family: courier new; font-weight: bold;"> #take some action;</span><br /><span style="font-family: courier new; font-weight: bold;">}</span><br /><br />From this you could conclude that the Tweet syntax is bridging the gap between <span style="font-style: italic;">programming code</span> and <span style="font-style: italic;">human</span> dialogue.<br /><br />If it is true that the way we attain, and share knowledge is becoming more <span style="font-style: italic;">computer-like</span>, will that not someday allow a computer system to pass the Turing Test. Or in that case would it be the human passing the Turing Test?<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-9191883266592917273?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-37772402909647143382009-03-18T15:16:00.001-07:002009-03-18T15:16:42.838-07:00Trying out bloggers mobile interface<p class="mobile-photo"><a href="http://2.bp.blogspot.com/_8T802zGyjH4/ScFyy1G3zII/AAAAAAAAANs/TbrZUtFxDuI/s1600-h/1237414299075-702841.jpg"><img src="http://2.bp.blogspot.com/_8T802zGyjH4/ScFyy1G3zII/AAAAAAAAANs/TbrZUtFxDuI/s320/1237414299075-702841.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5314655252848823426" /></a></p><p>Adding some message body to see where it ends up.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-3777240290964714338?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com1tag:blogger.com,1999:blog-4336266257639013504.post-56444345715315756242009-03-10T14:53:00.000-07:002009-03-10T14:55:03.497-07:00kindle2 web browser<a href="http://4.bp.blogspot.com/_8T802zGyjH4/SbbhcZwKBDI/AAAAAAAAAME/HWNSBujtuTw/s1600-h/86.jpg"><img src="http://4.bp.blogspot.com/_8T802zGyjH4/SbbhcZwKBDI/AAAAAAAAAME/HWNSBujtuTw/s320/86.jpg" alt="" style="margin: 0px 10px 10px 0pt; clear: both; float: left;" border="0" /></a> Very happy with my Kindle2 so far as a book reader. I enjoy reading tech books and my wife uses it for novels.<div>I've started playing with the experimental web browser and have found it to be very useful. As expecting it has trouble with graphics but for mobile oriented sites it has proved quite handy, especially since I have access through 3G.</div><div>Shown here is m.twitter.com<br /></div><div style="clear: both; text-align: left;"><a href="http://picasa.google.com/blogger/" target="ext"><img src="http://photos1.blogger.com/pbp.gif" alt="Posted by Picasa" style="border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="middle" border="0" /></a></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-5644434571531575624?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-87262260632183939312008-12-03T11:05:00.000-08:002008-12-03T11:07:41.181-08:00Winter Coders Social 2008This year's Winter Coders Social is set to go. Come join the party this Tuesday, December 9th at Cubespace.<br /><br />Details: <a href="http://calagator.org/events/1250456151" target="_blank">http://calagator.org/events/<wbr>1250456151</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-8726226063218393931?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-62637321369424753032008-11-19T12:21:00.000-08:002008-11-19T12:27:00.547-08:00GD imagettftext broken on Leopard/mac portsSpent the better part of the morning battling PHP/GD. I needed to overlay text on an image, something I can recall doing in the past without issue. Not this morning though. Everytime the code got to 'imagettftext' it would result in a WSOD. After much troubleshooting and Google'ng I found <a href="http://bugs.php.net/bug.php?id=45437">this</a> mention in the PHP bug db which then pointed to the root of the cause: The macports 'freetype' lib. The solution for fixing that is <a href="http://lists.macosforge.org/pipermail/macports-users/2008-July/010921.html">here</a>.<br /><br />hope this helps others<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-6263732136942475303?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-12082814122882115832008-11-13T18:58:00.000-08:002008-11-14T07:09:39.121-08:00Augmenting Web Services with SMS and XMPPThis talk was centered around adding channels of communication such as SMS and XMPP to existing HTTP web services.<br />A project called <a href="http://code.google.com/p/extapi">Extapi</a>, is a small web app that manages this coordination between multiple channels and services.<br />here are the <a href="http://www.slideshare.net/samkeen/augmenting-web-services-with-sms-and-xmpp-presentation/">slides</a> for my presentation given on November 14th 2008 at <a href="http://phpworks.mtacon.com/">PHP|Works</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-1208281412288211583?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-28825976907998885472008-11-13T06:14:00.000-08:002008-11-13T06:21:34.862-08:00AT PHP WorksIn Atlanta for the php|works conference.<br />Listening to the Keynote from Kevin Dangoor (founder of turbo gears). He's discussing successfully fostering open source projects.<br />Looking forward to meeting new folks with PHP and/or Python backgrounds<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-2882597690799888547?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-7012289458751207702008-09-05T15:03:00.000-07:002008-09-05T23:16:28.241-07:00Speaking at this years PHPWorks in AtlantaVery excited that the talk I submitted to <a href="http://phpworks.mtacon.com/">php|works</a> was accepted. I'll be <a href="http://phpworks.mtacon.com/c/schedule/talk/d2s3/2">speaking</a> at the Atlanta conference on my continuing work with combining XMPP and SMS with existing web API's<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-701228945875120770?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-58259546899926225142008-08-13T11:08:00.000-07:002008-08-21T21:53:02.638-07:00Shizzow's public announcment<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://shizzow.com/"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_8T802zGyjH4/SKMl3BopUOI/AAAAAAAAAHY/KfEuouVJWlM/s400/shizzow_280_wide.gif" alt="" id="BLOGGER_PHOTO_ID_5234068819196596450" border="0" /></a><br />One of my side projects has turned into a full blown startup. Shizzow.com will be officially announced at today's <a href="http://upcoming.yahoo.com/event/941687/">Lunch 2.0</a> at cube space. It's been a pleasure working with the other fine <a href="http://shizzow.com/about">folks</a> on this project and I'm looking forward to the future.<br />Thanks to Silicon Florist for all the <a href="http://siliconflorist.com/2008/08/11/shizzow-knows-portland-oregon-now-get-to-know-shizzow/">press</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-5825954689992622514?l=codeelements.com'/></div>Sam Keenhttp://www.blogger.com/profile/15101345962704243937noreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-23057432407065683752008-07-22T17:11:00.000-07:002008-08-21T21:51:51.523-07:00Accessing Trimet Arrival Times with SMSI discovered the Portland Trimet <a href="http://developer.trimet.org/">API</a> about a month ago and was very inspired by the amount of real-time information available and the ease of accessing it through their web service. One feature of the service is that for a given stop id you can get the arrival times for the buses/trains for that stop. These are not the scheduled times but rather the real-time estimated arrival time based on the known GPS coordinates of the actual vehicles on their routes.<br />You can get to this data through IVR system by dialing 503-238-RIDE or on the <a href="http://trimet.org/arrivals/index.htm">web.</a><br /><br />In the mean time, I have also been working with extending existing APIs with additional access such as SMS and XMPP (jabber). So it was natural to take on this trimet service as my first proof of concept.<br />For SMS access, you simple text "pdxt {stop_id}" to the short code DOTORG (368674)<br /><br />so for example, for the stop 8334 (Pioneer Square South MAX Station Eastbound), you would text...<br /><br /><span style="font-style: italic;">"<span style="font-weight: bold;">pdxt 8334</span></span>" to <span style="font-weight: bold;">DOTORG (368674)</span><br /><br />The result is shown below (with the same request through the web for comparison)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-U2xCN0FOWI/SIgGQRdLEoI/AAAAAAAAAGE/ciqDTVtPZP4/s1600-h/IMG_1248.JPG"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp2.blogger.com/_-U2xCN0FOWI/SIgGQRdLEoI/AAAAAAAAAGE/ciqDTVtPZP4/s320/IMG_1248.JPG" alt="" id="BLOGGER_PHOTO_ID_5226434244196897410" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-U2xCN0FOWI/SIphRlxEMfI/AAAAAAAAAGM/8quXcHgwaRo/s1600-h/Picture+1.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_-U2xCN0FOWI/SIphRlxEMfI/AAAAAAAAAGM/8quXcHgwaRo/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5227097272340460018" border="0" /></a><br /><p style="clear: both; font-style: italic; text-align: center;"><span style="font-size:85%;">There is slight differences in the times since it is difficult to coordinate the SMS and web request precisely.</span></p><p style="clear: both;">In my trials, response times for SMS were in the 5-10 second range which for me is acceptable.<br /></p><p style="clear: both;">I'll next be working on an XMPP (Jabber) wrapper around the service so you will then be able to access the service with an IM client (which many phones now have). XMPP will give the same mobility benefits of SMS but removes the 155 char limit for the returned text allowing for more information to be included in the returned message.</p><p style="clear: both;">Once I have completed SMS and XMPP around this service, I plan to refactor the technique so it can be easily applied to other services. I will also document the steps I took to integrate with SMS and XMPP. Look for that on google code soon.</p><p style="clear: both;"><br /></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-2305743240706568375?l=codeelements.com'/></div>Sam Keennoreply@blogger.com1tag:blogger.com,1999:blog-4336266257639013504.post-8807154875575762232008-06-24T11:25:00.000-07:002008-06-24T11:38:15.788-07:00Just Testing the WatersI am considering moving my blog here (from the wordpress I host currently)<br /><br />I like blogger since I will no longer have to do blog software updates, something I never seem to get time for.<br /><br />I discovered <a href="http://code.google.com/p/syntaxhighlighter/">SyntaxHighlighter</a>, so now that requirement is taken care of.<br /><br /><textarea name="code" class="php"><br /><?php if($blogger->maint_effort < $wpress->maint_effort &amp;&amp; $blogger->highlighting) {<br /> $blogger->use();<br />}<br /></textarea><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-880715487557576223?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-41283692247712238472008-04-18T09:50:00.000-07:002008-07-01T15:24:38.974-07:00Startupalooza<p>Exciting event coming up at the end of March. <a href="http://www.startupalooza.org/">Startupalooza</a> is gaining steam, building quite the list of product demo’s (including <a href="http://fyreball.com/beta">Fyreball</a>, my current employer). The event designed to be Those who have walked the path, sharing their knowledge and experiences with those interested in beginning startups. This is not a typical startup event where the goal is to impress VC’s in the crowd (though I’m sure a few will be lurking).</p> <p>Event is: Saturday, March 29, 2008, 2:00 PM - 7:00 PM</p> <p>RSVP at <a href="http://upcoming.yahoo.com/event/349225/">Upcoming</a></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-4128369224771223847?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-64266887049359122032008-03-04T15:31:00.000-08:002008-07-01T15:26:35.463-07:00Ignite Portland 2<p>Looks much bigger (550+ registered) and better this go around. I went to Ignite 1 and had an excellent time. Can’t wait to see how it goes this time.</p> <p>Happening Feb 5, 2008 : doors open at 5:15pm at the Bagdad.</p> <p>Ignite Portland <a href="http://www.igniteportland.com/">home page</a></p> <p>register here: <a href="http://upcoming.yahoo.com/event/390164/">http://upcoming.yahoo.com/event/390164/</a></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-6426688704935912203?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-50108493927154898672008-01-10T11:02:00.000-08:002008-07-01T15:27:28.410-07:00“Portland On Fire” Profiling Local Individuals<a href="http://www.portlandonfire.com/" title="PortlandOnFire">Portland On Fire</a> is a site launched by <a href="http://www.portlandonfire.com/ravenzachary/">Raven Zachary</a> on the first day of 2008. It’s goal is to give a quick bio of local folks, showing what they’ve done and what they are currently up to. It is starting with people in the tech and arts sector but the hope is that it expands out to all corners of the Portland talent pool.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-5010849392715489867?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-44273013150869009882007-12-07T16:37:00.000-08:002008-07-01T15:29:04.100-07:00Book Review: PHP In Action<p><strong>Authors</strong>: Dagfinn Reiersol, Marcus Baker, Chris Shiflett<br />2007 Manning Publications<br />525 pages</p> <p>This book is geared toward the intermediate PHP developer who wants to bring in aspects of OOP, Testing and Refactoring to help improve the quality of the code they write. It is split into four parts; Basic Tools and Concepts, Testing and Refactoring, Building the Web Interface, and Databases and Infrastructure.</p> <p>In addition to PHP, I have decent amount of experience with Java and Java web frameworks such as Struts. So as I worked through this book much of the content was familiar to me but from a Java perspective. It was enlightening to see the authors express these same concepts from a PHP perspective. The fact that many times (not always), the implementation in PHP is more concise and elegant that the Java alternative really shows of the power of a dynamically typed language such as PHP. Also the fact that PHP was bred from the beginning to be a web development language gives it a definate advantage in the web arena.<br />The authors are honest though, they haven’t simply painted implementing OO, TDD, and Refactoring as completelty painless. For instance in the testing portion they’ve devoted quite a bit of time to showing the difficulties of testing (especially in a Web environment). Such as the need for mock objects and the difficulty in keeping mocks “real enough” so they fail and pass as the real object would. This full disclosure is key for readers to estimate if the extra effort of a concept is worth the benefits for their particual situation.</p> <p>Overall this is great book for the intended audience. It is not “black and white” about the solutions it proposes. Reasonable alternatives are given and the pros and cons of each are expressed. For those with extensive OO experience, some portions of the book may seem trivial but overall it is still worth a “quick scan” to see the specifics of PHP implementations of general OO concepts.</p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-4427301315086900988?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-11306391477164195302007-08-01T20:50:00.000-07:002008-07-01T15:30:08.183-07:00Book Review: Practical Rails Social Networking Sites<p><strong> Title:</strong> Practical Rails Social Networking Sites<br /><strong>Author:</strong> Alan Bradburne<br /><strong>ISBN:</strong> 1590598415<br /><strong>ISBN-13:</strong> 9781590598412<br />421 pages<br /><strong>Published:</strong> Jun 2007</p> <p>So far my web development background has mainly consisted of Java (J2EE) and PHP. I just started playing with Ruby and now Ruby on Rails. I’ve worked through a few of the tutorials linked from www.rubyonrails.org. So essentially I had two or three ‘proof of concept’ sites with models consisting of two to three tables each. So of course at that point I wanted to ramp it up and build a ‘real’ site but that leap from demo site to a production ready, real world site can be a tough one to make. “Practical Rails Social Networking Sites” can certainly help you in that undertaking.</p> <p>During the span of the book, Alan leads you through building an actual web application with many of the Web 2.0 features you would expect. When you are through with this book, you will have a simple “content management system”, user authentication with groups, RSS feeds, blogging with an API and user created themes, forums, photo gallery with tagging, email and mailing list, XFN support, Google maps and Flickr API integration, and views for mobile devices. So, as you can see, you learn how to build just about everything a social site needs. The author does a good job of using leading edge features of Rails and web development in general to build the components for the site. One that I was very happy to see was REST or “Representational State Transfer”. Rails Restful Routes are used throughout the book and you soon learn to appreciate them as they further simplify the routing of requests from the view, through the controller, and to the model.</p> <p>For the most part the end of each chapter has a substantial section devoted to testing what was implemented previously in the chapter. I was good to see this emphasis on unit and functional testing as I know what value it brings to the scalability and maintainability of an application. Plus it is so easy to write tests in Rails, there is little excuse not to do so.</p> <p>After you’ve worked through the examples in the book and have a substantial, working social web app, the final chapter will lead you through the process of deploying your work to a production environment. This chapter is compact but certainly gets you enough info and pointers to get you deployed and into a strategy for scaling and optimizing.</p> Overall I really liked this book. It gets right down to business and utilizes many of the leading edge Rails best practices to get an impressive amount of work done in very short order, but this is Rails after all<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-1130639147716419530?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-16693644586740544572007-07-27T14:44:00.000-07:002008-07-04T10:06:39.383-07:00OSCON 2007 Recap<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-U2xCN0FOWI/SG5WRp8MedI/AAAAAAAAAAM/rXZDgbPbMd4/s1600-h/oscon-pdxphpbooth-ocpcrew.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_-U2xCN0FOWI/SG5WRp8MedI/AAAAAAAAAAM/rXZDgbPbMd4/s320/oscon-pdxphpbooth-ocpcrew.jpg" alt="" id="BLOGGER_PHOTO_ID_5219203879485077970" border="0" /></a><br /><p>Just finished up my 2007 ‘<em>OSCON Experience</em>‘ I attended the conference on Tuesday and Wednesday and we had our PDXPHP both in the exhibit hall as last year, but in addition I helped to organize the OSCamp room.</p><p>Spent most of my time in the exhibit hall this year. I only made it to one OSCON session + 2-3 OSCamp sessions. Still had a good time though. I was able to catch up with folks I typically only see at OSCON in addition to hanging out with local friends. There were no shortage of after parties this year. It seemed you had your pick of 3-4 parties a night. People were really zombiefied by the end of Thursday (I know I was).</p><br /><br style="clear:both;" /><br /><p style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_-U2xCN0FOWI/SG5Wwm2xt6I/AAAAAAAAAAc/BaTIEr2rctI/s1600-h/oscon2007-jive-afterparty.jpg"><img style="cursor: pointer;" src="http://bp3.blogger.com/_-U2xCN0FOWI/SG5Wwm2xt6I/AAAAAAAAAAc/BaTIEr2rctI/s320/oscon2007-jive-afterparty.jpg" alt="" id="BLOGGER_PHOTO_ID_5219204411232991138" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_-U2xCN0FOWI/SG5W-wu5E6I/AAAAAAAAAAk/ubi44wTGE1U/s1600-h/oscon2007-zend-mysql-afterparty.jpg"><img style="cursor: pointer;" src="http://bp0.blogger.com/_-U2xCN0FOWI/SG5W-wu5E6I/AAAAAAAAAAk/ubi44wTGE1U/s320/oscon2007-zend-mysql-afterparty.jpg" alt="" id="BLOGGER_PHOTO_ID_5219204654402442146" border="0" /></a></p><p><br /></p> <p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_-U2xCN0FOWI/SG5XJfFc9cI/AAAAAAAAAAs/QNkNBALx8i8/s1600-h/oscamp2007-olpc.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_-U2xCN0FOWI/SG5XJfFc9cI/AAAAAAAAAAs/QNkNBALx8i8/s320/oscamp2007-olpc.jpg" alt="" id="BLOGGER_PHOTO_ID_5219204838643791298" border="0" /></a>OSL was nice enough to give a demo of the OLPC to the OSCAMP crowd. Getting the device (and Brad from OSL) out of the loud, crowded exhibit hall enabled the OSCamp’s to get a real close look at it and ask all the questions they wanted.</p> <p><br /></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-1669364458674054457?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-79401979210877345222007-07-20T10:18:00.000-07:002008-07-01T15:33:06.472-07:00360Flex Comming to Seattle<p>Flex seems to be on fire as of late. I really like the theme behind the efforts over at <a href="http://360conferences.com/blog/2007/04/about-us.html">360Conferences</a>.</p> <p>For more info on the event, visit <a href="http://www.360flex.com/" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">www.360flex.com</a></p> <p>“<em>The gist is, we’re bringing together the best Flex has to offer, in a community setting where developers can hang out, share ideas, share problems, in general come together and leave with more knowledge and more contacts and friends than when they arrived. Our last event in San Jose was a phenomenal success, this one is shaping up to be better than that.</em></p> <p><em>Additionally we keep the price low, at 360.00 for 3 days, so that even those developers and engineers without an expense account can attend.</em>“</p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-7940197921087734522?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-43413120848707654032007-07-20T08:03:00.000-07:002008-07-01T15:34:01.951-07:00OSCamp 2007<p>I sort of just fell into organizing the camp this year but it is really starting to shape up. Didn’t take too much effort and O’Reilly was extremely easy to work with. They were nice enough to kick in for grub, projector rental, and brainstorm / collaboration type office supplies (and those are not cheap when you have to purchase them from the Convention Center $$$)</p> <p>So what is OSCamp:</p> <p><em>OSCAMP is in the spirit of <a href="http://barcamp.org/" class="url outside">BarCamp</a> and other <a href="http://en.wikipedia.org/wiki/Unconference" class="url outside">Unconferences</a>. This <a href="http://www.archive.org/download/Ryanne-BarCampSF816/Ryanne-BarCampSF816.mov" class="url outside">clip</a> from BarCamp SF provides a great video summary of the spirit of a BarCamp. This year it will be held on <strong>July 25-26</strong> as part of O’Reilly’s <a href="http://conferences.oreillynet.com/os2007/" class="url outside">OSCon2007</a>. </em></p> Be sure to head over to oscamp.org and register (if you have not already registered for OSCON). OSCamp is free and open to the public (After you register<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-4341312084870765403?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-43685535685823550042007-07-05T23:18:00.000-07:002008-07-04T11:40:40.059-07:00Explanation of Open Source (for the non-geek)<p>I gave this presentation to a local Portland Tech Requiting firm. They see more and more demand for applicants with skills in various open source technologies so they wanted a better understanding of its origins and current trends with an emphasis on PHP.</p> <p><a href="http://sam.sjk.googlepages.com/what-is-opensource.pdf" title="Slides">Slides</a> (pdf)<br /><a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license"><br /><img src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png" alt="Creative Commons License" style="border-width: 0pt;" /></a><br />This work is licensed under a<br /><a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license">Creative Commons Attribution-Share Alike 3.0 United States License</a>.</p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-4368553568582355004?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-35583409151035591792007-07-03T08:54:00.000-07:002008-07-01T21:49:52.200-07:00Building Administration Interfaces with XUL<p>I’m starting to work with mozilla and XUL again. I’ll be posting that work soon, But in the meantime I found this presentation I did back in 2005. [<a href="http://pdxphp.org/meetings/2005/febuary" title="pdxphp">original post</a>] I remember that is when I first stumbled across this strange but useful XmlHTTPRequest object and wondered if it’s use would find its way to the mainstream.</p> <p>Took a traditional HTML admin interface for a PHP web application and transformed it into a Mozilla XUL interface. Goal is to demonstrate the benefits of using XUL to create Rich Client Application interfaces into your web apps when you have the ability to mandate the browser used (such as an admin interface).</p> <p>Links and resources:</p> <ul><li><a href="http://xul.codeelements.com/pdxphp/src/php/" target="_blank">Working Demo</a> (mozilla browsers only)</li><li><a href="http://xul.codeelements.com/pdxphp/phpdoc/index.html" target="_blank">Documentation and Source Code</a> (didn’t go too crazy on the docs, but you can see all the source code by viewing the files section of the tree on the left).</li></ul><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-3558340915103559179?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-58453548359401528342007-06-07T23:12:00.000-07:002008-07-01T21:51:16.404-07:00Microformats: Path to Sematic Web?<p>In the past I have looked into technologies promising to lead us to the promised land of <a href="http://en.wikipedia.org/wiki/Semantic_Web">Semantic Web</a>. RDF and OWL are a couple of examples. Though they are powerful and capable formats they are a bit of a chore to come up to speed on and not to easy to implement into something usable and scalable. You see folks using them to solve specific problems in niche and primarily vertical scopes but you don’t seem to see signs of any widespread adoption by the masses.</p> <p>Then comes along Microformates. From what I’ve read, <a href="http://en.wikipedia.org/wiki/XHTML_Friends_Network" title="XHTML Friends Network">XFN</a> is what evolved into the first microformat. Today there are many more useful formats. MF’s are sort of a grassroots effort to stitch semantics into the content being published to the web by those who do much of the publishing. Some of the microfomat goals are to solve specific real world problems, start as simple as possible, and reuse existing, widely adopted standards. These concepts make microformats very easy to pick up and start utilizing immediately.</p> <p>Links I found useful</p> <ul><li>Tantek Çelik <a href="http://microformats.org/code/hcard/creator">Hcard</a> creator</li><li>Firefox <a href="https://addons.mozilla.org/en-US/firefox/addon/4106">Operator</a> add-on (leader of the pack for the FF microformat add-ons)</li><li>A <a href="http://allinthehead.com/hkit">PHP</a> microformat lib</li><li>A <a href="http://blog.labnotes.org/2005/11/20/microformat-parser-for-ruby/">Ruby</a> microformat lib</li><li>Get your mf data out to the <a href="http://pingerati.net/">world</a></li><li>some sites utilizing mf’s (<em>hint</em>: install <a href="https://addons.mozilla.org/en-US/firefox/addon/4106">Operator</a> first) <ul><li><a href="http://corkd.com/">cork’d</a></li><li><a href="http://upcoming.yahoo.com/event/178057/">Upcoming</a></li><li>Eventful</li><li><a href="http://tech.yahoo.com/">Tech.Yahoo</a></li></ul> </li></ul><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-5845354835940152834?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-40350859793775403622007-05-19T14:09:00.000-07:002008-07-04T10:11:14.502-07:00When Adventurous Coders get Bored<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_-U2xCN0FOWI/SG5ZVdU_UuI/AAAAAAAAAA8/ZsXVqpuIsL4/s1600-h/vm-vm.jpg"><img style="cursor: pointer;" src="http://bp0.blogger.com/_-U2xCN0FOWI/SG5ZVdU_UuI/AAAAAAAAAA8/ZsXVqpuIsL4/s320/vm-vm.jpg" alt="" id="BLOGGER_PHOTO_ID_5219207243353772770" border="0" /></a><br /><br /><p> I convinced a friend to try this, hopefully space/time fabric was unaffected.</p> <p>One more rule for the universe</p> <p>…</p> <ul><li><em>You may not travel faster than the speed of light</em></li><li><em>You may not power on a virtual machine in a virtual machine</em></li></ul><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-4035085979377540362?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0tag:blogger.com,1999:blog-4336266257639013504.post-17937824597995458432007-05-06T15:09:00.000-07:002008-07-04T10:21:05.935-07:00Amazon Simple Storage Service [S3]<h2>What is S3??</h2> <p>Simple Storage Service: Is a web service that allows any developer to gain access to highly scalable, very reliable, inexpensive storage space. Your data is replicated to multiple servers at multiple data centers.</p> <h2>How to get started</h2> <p>Go to Amazon’s <a href="http://www.amazon.com/gp/browse.html?node=3435361">AWS</a> page, then to the <a href="http://www.amazon.com/S3-AWS-home-page-Money/b/ref=sc_fe_l_2/102-3892210-9249704?ie=UTF8&amp;node=16427261&amp;no=3435361&amp;me=A36L942TSJ2AJA">S3</a> page and sign up (check out the other services while you are there)</p> <p>Pricing (From Amazon’s <a href="http://www.amazon.com/S3-AWS-home-page-Money/b/ref=sc_fe_l_2/102-3892210-9249704?ie=UTF8&amp;node=16427261&amp;no=3435361&amp;me=A36L942TSJ2AJA">site</a>…)</p> <blockquote><p><em>Pricing</em></p> <p><em>…</em></p> <p><em>New Pricing (effective June 1st, 2007)</em></p> <p><em><strong>Storage</strong><br />$0.15 per GB-Month of storage used</em></p> <p><em><strong>Data Transfer</strong><br />$0.10 per GB - all data uploaded</em></p> <p><em>$0.18 per GB - first 10 TB / month data downloaded<br />$0.16 per GB - next 40 TB / month data downloaded<br />$0.13 per GB - data downloaded / month over 50 TB</em></p> <p><em>Data transferred between Amazon S3 and Amazon EC2 is free of charge</em></p> <p><em><strong>Requests</strong><br />$0.01 per 1,000 PUT or LIST requests<br />$0.01 per 10,000 GET and all other requests*<br />* No charge for delete requests</em></p> <p><em>Storage and bandwidth size includes all file overhead</em></p></blockquote> <p>I looked around the web for similar services (hard to find someone that posts prices), and for 180 gig’s of reduntantly stored data, it was in the $200/month price range.</p> <p>The same 180Gb on S3 would be</p> <p>$27 to store for 30 days</p> <p>$18 to xmit (the entire 180Gb) to S3</p> <p>In addition to price, with S3, you are in full control of <strong>how</strong> and <strong>when</strong> you put and/or get your data.</p> <h2>Only pay for what you actually use</h2> <p>One of the niceties about S3 (and the other Amz web services) is that you pay just for what you use.</p> <p><em>Didn’t use that service last month:</em> <strong>Pay $0.</strong></p> <p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_-U2xCN0FOWI/SG5ao9W5UZI/AAAAAAAAABE/rNNV_RZeMPE/s1600-h/usage-report-11.png"><img style="cursor: pointer;" src="http://bp0.blogger.com/_-U2xCN0FOWI/SG5ao9W5UZI/AAAAAAAAABE/rNNV_RZeMPE/s320/usage-report-11.png" alt="" id="BLOGGER_PHOTO_ID_5219208677880844690" border="0" /></a></p> <p>This allows you to ‘tinker’ all you want for mere pennies</p> <h2>Amazon S3 - Objects</h2> <h2> What is an Object?</h2> <p><strong><em>Object</em></strong> is the term we use in S3 for the ‘thing’ (file/data) you want to store.<br />Once an object is stored in S3, it contains the original data (contents of the file), plus a given amount of meta-data (name/value pairs).</p> <p>You can add your own metadata but some of the standards are ‘<em>Last-Modified</em>‘ and ‘<em>Content-Type</em>‘</p> <p>A given Object can be from 1byte to 5GBs</p> <h2>Amazon S3 - Buckets</h2> <h2>Why Buckets?</h2> <p>Buckets provides a unique namespace for management of objects contained in the bucket</p> <p>Bucket namespaces are Global across all of S3 (all users of S3. Similar concept as ‘<em>domain names</em>‘)</p> <p>An S3 account is allowed 100 buckets</p> <h2>Amazon S3 - Keys</h2> <h2>Key</h2> <p>A key is the unique identifier for an <strong><em>object</em></strong> within a <strong><em>bucket</em></strong></p> <h2>Locating an object</h2> <p>Any Object can be located by its [<em>bucket + key</em>] using a <a href="http://www.xfront.com/REST-Web-Services.html">RESTful</a> formatted URL</p> <pre> <em>http://s3.amazonaws.com/foo-products/2006/may/1845.prd</em></pre> <p><em><br /></em></p> <p><em>foo-products</em> is the <strong>bucket</strong> &amp; <em>2006/may/1845.prd</em> is the <strong>Key</strong></p> <h3>S3 - Authentication</h3> <p>Most requests to S3 require authentication, this ensures that you don’t get charged for operations you didn’t authorize, and that nobody else sees your private data.</p> <p>You can grant various access models (acl) for an <strong>Object</strong> or an entire <strong>Bucket</strong></p> <ul><li>private</li><li>public-read</li><li>public-read-write</li><li>authenticated-read</li></ul> <p>To set the ACL, when you PUT the Object to S3, you set a x-amz-acl header. For example…</p> <pre>x-amz-acl: public-read</pre> <p>ACl defaults to private if not set on the PUT</p> <h2>S3: Putting it all Together</h2> <h2>How do you speak to S3?</h2> <p>At this point, all interaction is done with the HTTP protocol (the current exception is that you can retrieve objects using http or BitTorrent).</p> <p>So, creating a program to interact with S3 is just a matter of creating HTTP requests and reading HTTP responses. Something PHP is quite capable of (especially with a little help from PEAR <a href="http://pear.php.net/package/HTTP_Request">HTTP_Request</a> and <a href="http://pear.php.net/package/Crypt_HMAC/">Crypt_HMAC</a>)</p> <h2>First get an account and your Keys</h2> <ul><li><strong>Access Key ID:</strong> You add this to any requests to S3. Essentially it is your unique identifier that tells S3 a given request is targeted for your account.</li><li><strong>Secret Access Key:</strong> For requests to S3 for Objects with acl’s that require authentication (i.e. <em>private</em>, <em>authenticated-read</em>), you ’sign’ your request with this <strong>secret</strong> key.</li></ul> <p>The following code examples are based on what is in the Amazon S3 developer <a href="http://docs.amazonwebservices.com/AmazonS3/2006-03-01/gsg/">docs</a></p> <h2>Create a Bucket</h2> <pre class="aws-code"># create bucket request<br /><br />PUT /[bucket-name] HTTP/1.0<br />Date: Wed, 08 May 2007 08:45:09 GMT<br />Authorization: AWS [aws-access-key-id]:[header-signature]<br />Host: s3.amazonaws.com<br /><br /># create bucket response<br /><br />HTTP/1.1 200 OK<br />x-amz-id-2: VjzdTviQorQtSjcgLshzCZSzN+7CnewvHA+6sNxR3VRcUPyO5fmSmo8bWnIS52qa<br />x-amz-request-id: 91A8CC60F9FC49E7<br />Date: Wed, 08 Mar 2006 04:06:15 GMT<br />Location: /[bucket-name]<br />Content-Length: 0<br />Connection: keep-alive<br />Server: AmazonS3</pre> <h2>Put Objects in your Bucket</h2> <pre class="aws-code"># put object request<br /><br />PUT /[bucket-name]/[key-name] HTTP/1.0<br />Date: Wed, 08 Mar 2006 04:06:16 GMT<br />Authorization: AWS [aws-access-key-id]:[header-signature]<br />Host: s3.amazonaws.com<br />Content-Length: 14<br />x-amz-meta-title: my title<br />Content-Type: text/plain<br /><br />this is a test<br /><br /># put object response<br /><br />HTTP/1.1 200 OK<br />x-amz-id-2: wc15E1LUrjDZhNtT4QZtsbtadnOMKGjw5QTxkRDVO1owwbA6YoiqJJEuKShopufw<br />x-amz-request-id: 7487CD42C5CA7524<br />Date: Wed, 08 Mar 2006 04:06:16 GMT<br />ETag: "54b0c58c7ce9f2a8b551351102ee0938"<br />Content-Length: 0<br />Connection: keep-aliveServer: AmazonS3</pre> <h2>Retrieve Objects from your bucket</h2> <pre># get object request</pre> <pre>GET /[bucket-name]/[key-name] HTTP/1.0<br />Date: Wed, 08 Mar 2006 04:06:18 GMT<br />Authorization: AWS [aws-access-key-id]:[header-signature]<br />Host: s3.amazonaws.com</pre> <pre># get object response</pre> <pre>HTTP/1.1 200 OK<br />x-amz-id-2: FbGpiykb9oJEdJd0bcfwkL6S3lc06X0y7XSeA/GWyRdvlNEZ0irthljxKoeGFfB6<br />x-amz-request-id: 9298531013923634<br />Date: Wed, 08 Mar 2006 04:06:18 GMT<br />Last-Modified: Wed, 08 Mar 2006 04:06:16 GMT<br />ETag: "54b0c58c7ce9f2a8b551351102ee0938"<br />x-amz-meta-title: my title<br />Content-Type: text/plain<br />Content-Length: 14<br />Connection: keep-alive<br />Server: AmazonS3</pre> <pre>this is a test</pre> <h2>S3 - The PHP way</h2> <h2>Implementing an API to S3 with PHP</h2> <h2>Prerequisites</h2> <p>You’ll need the <strong>PEAR</strong> libraries <strong>Crypt_HMAC</strong> &amp; <strong>HTTP_Request</strong> (<em>at least things are much easier if you have these</em>)</p> <pre># sudo pear install Crypt_HMAC<br />pear.php.net" to update<br />downloading Crypt_HMAC-1.0.1.tgz ...<br />Starting to download Crypt_HMAC-1.0.1.tgz (2,149 bytes)<br />....done: 2,149 bytes<br />install ok: channel://pear.php.net/Crypt_HMAC-1.0.1</pre> <pre>sam$ sudo pear install HTTP_Request<br />pear.php.net" to update<br />downloading HTTP_Request-1.4.0.tgz ...<br />Starting to download HTTP_Request-1.4.0.tgz (15,262 bytes)<br />.....done: 15,262 bytes<br />downloading Net_URL-1.0.14.tgz ...<br />Starting to download Net_URL-1.0.14.tgz (5,173 bytes)<br />...done: 5,173 bytes<br />downloading Net_Socket-1.0.7.tgz ...<br />Starting to download Net_Socket-1.0.7.tgz (5,419 bytes)<br />...done: 5,419 bytes<br />install ok: channel://pear.php.net/Net_URL-1.0.14<br />install ok: channel://pear.php.net/Net_Socket-1.0.7<br />install ok: channel://pear.php.net/HTTP_Request-1.4.0</pre> <h2>Creating the API</h2> <p>At this point all you really need to do is create a function for each needed interaction with S3 (or better yet, a PHP Object with a method for each). So something like…</p> <pre>createBucket()</pre> <pre>putObject()</pre> <pre>getObject()</pre> <pre>getBucketListing()</pre> <pre> ...</pre> <p>These functions are going to be creating http requests and reading http responses. Sometimes this can be a bit tricky (one missing ‘\n’ and you’re screwed), so leverage what what other have done befor you. The Amazon web services <a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=46">site</a> has some good examples but in particular, I would recommend you look at ‘<a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=482">Test Utility for Amazon S3 in PHP</a>‘ which does a good job of demo’ing most of the S3 functionality using PHP.</p><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-U2xCN0FOWI/SG5bLLsu_1I/AAAAAAAAABM/nrBpOrUD5zM/s1600-h/example-php-s3-1.png"><img style="cursor: pointer;" src="http://bp2.blogger.com/_-U2xCN0FOWI/SG5bLLsu_1I/AAAAAAAAABM/nrBpOrUD5zM/s320/example-php-s3-1.png" alt="" id="BLOGGER_PHOTO_ID_5219209265846091602" border="0" /></a></p><p>I used this code as a starting point to develop a very simple ‘Rsync’ type application for Amazon S3.<span style="text-decoration: underline;"><br /></span></p><p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_-U2xCN0FOWI/SG5bhMBVlOI/AAAAAAAAABU/9Vbe9Pc_FUY/s1600-h/s3-sync-1.png"><img style="cursor: pointer;" src="http://bp1.blogger.com/_-U2xCN0FOWI/SG5bhMBVlOI/AAAAAAAAABU/9Vbe9Pc_FUY/s320/s3-sync-1.png" alt="" id="BLOGGER_PHOTO_ID_5219209643889628386" border="0" /></a><span style="text-decoration: underline;"></span></p> <span style="text-decoration: underline;"></span> <h2>Resources</h2> <ul><li><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=123&amp;categoryID=48">Documentation from Amazon</a></li><li><a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=482&amp;categoryID=47">Example PHP implementation</a></li><li>Who’s Using S3 <a href="http://www.amazon.com/Success-Stories-AWS-home-page/b/ref=sc_fe_c_0_16427261_3/102-3892210-9249704?ie=UTF8&amp;node=182241011&amp;no=16427261&amp;me=A36L942TSJ2AJA">here</a> and <a href="http://solutions.amazonwebservices.com/connect/kbcategory.jspa?categoryID=66">here</a></li><li>My <a href="http://code.google.com/p/s3-sync/">Rsync App</a> (Proof of Concept at this point)</li></ul><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336266257639013504-1793782459799545843?l=codeelements.com'/></div>Sam Keennoreply@blogger.com0