<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10160217</id><updated>2011-09-10T15:38:42.964-05:00</updated><category term='programming'/><title type='text'>bluke</title><subtitle type='html'>Blog (n): A person with nothing to say writing for people with nothing to do.&lt;br/&gt;
Blog + Luke : Bluke.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>64</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10160217.post-2436991377208001161</id><published>2011-04-15T14:04:00.002-05:00</published><updated>2011-04-15T14:04:40.606-05:00</updated><title type='text'>301 Moved Permanently</title><content type='html'>&lt;a href="http://groovecoder.com"&gt;http://groovecoder.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2436991377208001161?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2436991377208001161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2436991377208001161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2436991377208001161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2436991377208001161'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2011/04/301-moved-permanently.html' title='301 Moved Permanently'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-1254935612625681491</id><published>2010-05-24T13:08:00.007-05:00</published><updated>2010-05-24T13:31:49.066-05:00</updated><title type='text'>quick blurb on NoSQL</title><content type='html'>I've spent about as much time thinking about this as NoSQL developers spend thinking about their schema, but here it is anyway.&lt;br /&gt;&lt;br /&gt;At SourceForge I'm presently developing and maintaining a few different systems using all kinds of web tech's and languages - PHP, python, solr, Postgres, MySQL, and mongo. One thing I'm noticing is that the mongo systems are something of a breeze to write, and then a real challenge to maintain - especially debugging. Our mongo experts mostly say that the tooling for mongo is just 'immature.' I'm sure they're right, but that also points toward what I think might be a fundamental difference in the two modes of development.&lt;br /&gt;&lt;br /&gt;AFAIK, there aren't any "old" NoSQL systems around? Mongo is only out since 2007, and Cassandra since 2008? We started using mongo early 2009, and even just one year out it feels so much more painful to maintain than our Postgres or MySQL systems that have been around since 1999! My theory is that NoSQL sacrifices maintenance and future development effort for the sake of startup development. I even made a neat drawing:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Fa_U5q7fBBY/S_rDEmp6JtI/AAAAAAAAAHA/HzWpTb8kA5U/s1600/schema_vs_nosql.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 200px;" src="http://1.bp.blogspot.com/_Fa_U5q7fBBY/S_rDEmp6JtI/AAAAAAAAAHA/HzWpTb8kA5U/s400/schema_vs_nosql.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5474902780885477074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Initially mongo seems to save on effort until the first valley - initial launch. At this point, the system launches and typically starts interacting with other systems and with users - data requirements change towards reality, which means &lt;span style="font-weight:bold;"&gt;code&lt;/span&gt; - i.e., function and logic - changes, not just model. In our environment, all other systems that use the data must also change their code which seems harder than the originating code. The code and the data are so intermixed that seemingly any and every change in either domain makes knock-on effects that have to be addressed.&lt;br /&gt;&lt;br /&gt;In a typical schema data system, we front-load a bit of data modeling effort. After launch, when we get new and changing data requirements we typically address the schema changes that might be involved, and may have to write a data migration/transformation script. But beyond that, it seems we don't have to worry about data integrity or any other knock-on effects. We can change some data-access or model classes and be on our way.&lt;br /&gt;&lt;br /&gt;So, am I just an old crusty developer shouting at these NoSQL kids to "get off my lawn!" ? Or has anyone else noticed this too? Maybe it's just the heterogeneous mix of NoSQL + schema that's killing me. Just seems like such a pain for not enough benefit?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-1254935612625681491?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/1254935612625681491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=1254935612625681491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1254935612625681491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1254935612625681491'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2010/05/quick-blurb-on-nosql.html' title='quick blurb on NoSQL'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Fa_U5q7fBBY/S_rDEmp6JtI/AAAAAAAAAHA/HzWpTb8kA5U/s72-c/schema_vs_nosql.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-5490995615800856784</id><published>2010-01-26T11:35:00.005-06:00</published><updated>2010-01-26T12:21:27.349-06:00</updated><title type='text'>a rant about ranting</title><content type='html'>Disclaimer: this post is totally my own opinion and does not reflect anything from SourceForge at all. that's why it's here on this blog.&lt;br /&gt;&lt;br /&gt;I'm angry and want to shoot my mouth off - perfect opportunity for a long-lost blog.&lt;br /&gt;&lt;br /&gt;We - i.e., &lt;a href="http://sourceforge.net"&gt;SourceForge&lt;/a&gt; are getting some crap for &lt;a href="https://sourceforge.net/blog/clarifying-sourceforgenets-denial-of-site-access-for-certain-persons-in-accordance-with-us-law/"&gt;blocking sanctioned countries from our site&lt;/a&gt;. That's fine - I'm actually ticked off about it too. And many people out there are making sound and solid comments about the action - not just the ones defending SourceForge; there are some good solid critical comments too.&lt;br /&gt;&lt;br /&gt;But then you have people who say something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Sourceforge, you suck! You suck so badly, I’ll hereby guarantee you that I’ll not only recommend *anybody* stay the heck away from you scumbags, I’ll actively let everybody know that you’re the scum of the earth. Shame on you! Shame!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;With love from &lt;a href="https://sourceforge.net/users/pyalot"&gt;pyalot&lt;/a&gt;. Well pyalot, since we're all good to judge and criticize each other, let's get started ...&lt;br /&gt;&lt;br /&gt;So you are Florian Bösch. Okay Florian, let's see &lt;a href="http://ch.linkedin.com/in/pyalot"&gt;here&lt;/a&gt; ... you've worked at &lt;a href="http://www.esystor.com/"&gt;Systor&lt;/a&gt;(?), &lt;a href="http://www.accenture.com"&gt;Accenture&lt;/a&gt;, and &lt;a href="http://www.dws.com"&gt;DWS&lt;/a&gt;. Systor &lt;a href="http://www.esystor.com/shop/IPS002.asp?LClssCd=000&amp;LClssNm=&amp;MClssCd=&amp;MClssNm="&gt;doesn't seem too keen on open-source&lt;/a&gt;?, &lt;a href="http://www.dws.com/EN/search/?SearchTerm=open%20source"&gt;nor does DWS&lt;/a&gt;. Ah, looks like &lt;a href="http://www.accenture.com/Global/Technology/Open_Source/default.htm"&gt;Accenture has some good open source work&lt;/a&gt;; but what's this?! It's right alongside &lt;a href="http://www.accenture.com/Global/Technology/Microsoft_Solutions/default.htm"&gt;Microsoft&lt;/a&gt; and &lt;a href="http://www.accenture.com/Global/Technology/Enterprise_Solutions/Oracle_Solutions/default.htm"&gt;Oracle&lt;/a&gt; solutions?! OMFG! You are the scum of the earth for working with them! GRARRR!&lt;br /&gt;&lt;br /&gt;Or, if I take an extra minute, I find you're actually &lt;a href="http://pyalot.blogspot.com/"&gt;a stand-up guy&lt;/a&gt; and &lt;a href="http://dev.codeflow.org/"&gt;developer&lt;/a&gt; and &lt;a href="http://bitbucket.org/pyalot/"&gt;a good contributor to open-source&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Couple lessons here:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;we're not anonymous on the internet anymore; I found all of this info on Florian starting from his sf.net user page&lt;/li&gt;&lt;br /&gt;&lt;li&gt;when we only look at a single facet of any news story or party, we get a very distorted view&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I actually sympathize with Florian's sentiments - blocking access from countries goes against the FLOSS ideal. But at the end of the day, SourceForge is a US company under US law. And if we're not law experts we should probably speak our opinion quietly or not at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-5490995615800856784?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/5490995615800856784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=5490995615800856784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/5490995615800856784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/5490995615800856784'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2010/01/rant-about-ranting.html' title='a rant about ranting'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-8719676636586292869</id><published>2009-07-21T01:28:00.004-05:00</published><updated>2009-07-21T01:34:04.855-05:00</updated><title type='text'>OSCON quotes - day 1</title><content type='html'>I want to share quotes I overhear at OSCON 2009. Most of these are from fellow SourceForgers ...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I'm a fan of the minimalist beauty of the electronic device.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your API is not a beautiful fucking snowflake.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I am as asymptotically close to clean as possible.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You're going to be happy about not being happy.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'm German, we know how to deal with crowds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It doesn't matter, you eat it with rice and bread.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I fucked the grower to get this shit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It's amazing what you can fit up your ass with a little practice.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I don't like my balls soaked in sugar syrup.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;People shouldn't call each other tar pit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There's nothing you can think of with an olive that I haven't already video'd and sold on the internet.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Is this the placenta thing?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;All eating human flesh stories start with, "I was going to med school."&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-8719676636586292869?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/8719676636586292869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=8719676636586292869' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/8719676636586292869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/8719676636586292869'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2009/07/oscon-quotes-day-1.html' title='OSCON quotes - day 1'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-5853799243883077016</id><published>2009-02-06T16:04:00.015-06:00</published><updated>2009-02-06T16:49:11.173-06:00</updated><title type='text'>Test-Driven [Design|Development]</title><content type='html'>Today I learned to appreciate Test-Driven &lt;span style="font-weight: bold;"&gt;Design&lt;/span&gt; a little bit more. Here's the story.&lt;br /&gt;&lt;br /&gt;I'm writing some RSS feeds that will contain extensions and other non-RSS elements using XML Namespaces. I'm using Zend_View and Zend_Feed and I thought the best place to put the namespace would of course be at the top of my default.rss.phtml template file - that way I can register all the namespaces at once at the top of the feed. Instead of writing the test first, I wrote the code first. Took maybe 10-20m and seems to work fine:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;rss content=&amp;quot;http://purl.org/rss/1.0/modules/content/&amp;quot; &lt;br /&gt;doap=&amp;quot;http://usefulinc.com/ns/doap#&amp;quot; &lt;br /&gt;sf=&amp;quot;http://sf.net/api/sfelements.rdf#&amp;quot; &lt;br /&gt;foaf=&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot; &lt;br /&gt;rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot; &lt;br /&gt;version=&amp;quot;2.0&amp;quot;&amp;gt;&lt;br /&gt;....&lt;br /&gt;&amp;lt;/rss&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then I go to write the test. Lo and behold - it's a big pain in the ass to consume the feed using SimpleXML.&lt;br /&gt;&lt;br /&gt;It's easy enough to create a SimpleXML element out of the feed, but I can't create SimpleXML elements from the content:encoded XML data:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;content:encoded&amp;gt;&lt;br /&gt;&amp;lt;!--[CDATA[&amp;lt;doap:version&amp;gt;&lt;br /&gt;&amp;lt;doap:name&amp;gt;Project 1.1 - Foobaj&amp;lt;/doap:name&amp;gt;&lt;br /&gt;&amp;lt;doap:created&amp;gt;1202221896&amp;lt;/doap:created&amp;gt;&lt;br /&gt;&amp;lt;doap:helper&amp;gt;&lt;br /&gt;&amp;lt;foaf:person&amp;gt;&lt;br /&gt;&amp;lt;foaf:name&amp;gt;admin1&amp;lt;/foaf:name&amp;gt;&lt;br /&gt;&amp;lt;foaf:homepage resource=&amp;quot;http://lcrouch-703.sb.sf.net/users/admin1&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;foaf:mbox_sha1sum&amp;gt;6dd817a0f71590a68131a5e83b1bd73944654e8d&amp;lt;/foaf:mbox_sha1sum&amp;gt;&lt;br /&gt;&amp;lt;/foaf:Person&amp;gt;&lt;br /&gt;&amp;lt;/doap:helper&amp;gt;&lt;br /&gt;&amp;lt;doap:file-release&amp;gt;proj1.file1.tgz&amp;lt;/doap:file-release&amp;gt;&lt;br /&gt;&amp;lt;sf:download-count&amp;gt;0&amp;lt;/sf:download-count&amp;gt;&lt;br /&gt;&amp;lt;/doap:Version&amp;gt;]]--&amp;gt;&lt;br /&gt;&amp;lt;/content:encoded&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Because all the namespaces used in the DOAP class aren't in the content. Argh! My first thought is to screw SimpleXML and do a raw string search/parse in the test. But then I had my epiphany: "If I were an actual client of this feed, I would want to be able to parse it easily with SimpleXML or with any other XML library."&lt;br /&gt;&lt;br /&gt;I ended up pushing the xml namespace declarations right down into the appropriate elements - where I now think they are *supposed* to be:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;content:encoded&amp;gt;&lt;br /&gt;&amp;lt;!--[CDATA[&amp;lt;doap:version &lt;br /&gt;doap=&amp;quot;http://usefulinc.com/ns/doap#&amp;quot; &lt;br /&gt;sf=&amp;quot;http://lcrouch-703.sb.sf.net/api/sfelements.rdf#&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;doap:name&amp;gt;Project 1.1 - Foobaj&amp;lt;/doap:name&amp;gt;&lt;br /&gt;&amp;lt;doap:created&amp;gt;1202221896&amp;lt;/doap:created&amp;gt;&lt;br /&gt;&amp;lt;doap:helper&amp;gt;&lt;br /&gt;&amp;lt;foaf:person &lt;br /&gt;foaf=&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot; &lt;br /&gt;rdf=&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;foaf:name&amp;gt;admin1&amp;lt;/foaf:name&amp;gt;&lt;br /&gt;&amp;lt;foaf:homepage resource=&amp;quot;http://lcrouch-703.sb.sf.net/users/admin1&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;foaf:mbox_sha1sum&amp;gt;6dd817a0f71590a68131a5e83b1bd73944654e8d&amp;lt;/foaf:mbox_sha1sum&amp;gt;&lt;br /&gt;&amp;lt;/foaf:Person&amp;gt;&lt;br /&gt;&amp;lt;/doap:helper&amp;gt;&lt;br /&gt;&amp;lt;doap:file-release&amp;gt;proj1.file1.tgz&amp;lt;/doap:file-release&amp;gt;&lt;br /&gt;&amp;lt;sf:download-count&amp;gt;0&amp;lt;/sf:download-count&amp;gt;&lt;br /&gt;&amp;lt;/doap:Version&amp;gt;]]--&amp;gt;&lt;br /&gt;&amp;lt;/content:encoded&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Voila - SimpleXML starts parsing everything very easily.&lt;br /&gt;&lt;br /&gt;This is one of the biggest boons for Test-Driven Development - the effects it has on the way you &lt;span style="font-weight:bold;"&gt;design&lt;/span&gt; your code. If I had not tested my code as an actual client would use it, I would have produced some pretty shoddy feeds with useless XML namespacing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-5853799243883077016?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/5853799243883077016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=5853799243883077016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/5853799243883077016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/5853799243883077016'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2009/02/test-driven-designdevelopment.html' title='Test-Driven [Design|Development]'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-4469144053309339872</id><published>2009-01-23T09:44:00.002-06:00</published><updated>2009-01-23T10:00:43.657-06:00</updated><title type='text'>Leave the editor open</title><content type='html'>I've been trying to adopt some practices from &lt;a href="http://oreilly.com/catalog/9780596519780/"&gt;The Productive Programmer&lt;/a&gt;. Mostly by using more keyboard shortcuts and productivity tools like &lt;a href="http://docs.blacktree.com/quicksilver/what_is_quicksilver"&gt;Quicksilver&lt;/a&gt;, &lt;a href="http://jumpcut.sourceforge.net/"&gt;Jumpcut&lt;/a&gt;, etc.&lt;br /&gt;&lt;br /&gt;Yesterday and today I realized a productivity tactic that isn't in the book - just leave your work open when you "go home" for the night. Don't close the program. In fact, don't even close any files, tabs, or any background programs either. Just save everything and walk away.&lt;br /&gt;&lt;br /&gt;The effectiveness of this trick is related to &lt;a href="http://www.joelonsoftware.com/articles/fog0000000339.html"&gt;something Joel wrote about a while back&lt;/a&gt; ...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;For me, just getting started is the only hard thing. An object at rest tends to remain at rest. There's something incredible heavy in my brain that is extremely hard to get up to speed, but once it's rolling at full speed, it takes no effort to keep it going. Like a bicycle decked out for a cross-country, self-supported bike trip -- when you first start riding a bike with all that gear, it's hard to believe how much work it takes to get rolling, but once you are rolling, it feels just as easy as riding a bike without any gear.&lt;br /&gt;Maybe this is the key to productivity: just getting started. Maybe when pair programming works it works because when you schedule a pair programming session with your buddy, you force each other to get started.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In the bike metaphor, leaving all your work open is like leaving the bike poised on a down-hill slope. All you have to do is get back to it and hop on. If I sit down at a blank desktop, I'm more likely to open my email, read my RSS feeds, open work email, and THEN, finally, open my code editors. If I sit down in front of a code editor, I'm likely to start editing code immediately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-4469144053309339872?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/4469144053309339872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=4469144053309339872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4469144053309339872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4469144053309339872'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2009/01/leave-editor-open.html' title='Leave the editor open'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3235594337298866891</id><published>2009-01-09T09:14:00.009-06:00</published><updated>2009-01-09T09:57:30.041-06:00</updated><title type='text'>Seven things that probably you may not know about me</title><content type='html'>&lt;a href="http://duodraco.wordpress.com/2009/01/09/seven-things-that-probably-you-may-not-know-about-me/"&gt;Anderson tagged me&lt;/a&gt;, so I'll give this a try, though I'm going to have a tough time finding 7 other people who haven't been tagged already.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I have a black belt&lt;/strong&gt; in the hodge-podge kick-boxing-jujutsu-taekwondo-karate style of fighting they teach at Apollo's Karate.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I have an identical twin brother, and 2 older brothers&lt;/strong&gt;, one of whom is also a PHP developer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I am &lt;a href="http://emergingcatholic.blogspot.com/"&gt;emerging Catholic&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I brew my own beer.&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I love soccer.&lt;/strong&gt; I try to play every weekend. Also, GO &lt;a href="http://www.liverpoolfc.tv/"&gt;REDS&lt;/a&gt;!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I can speak conversational Russian.&lt;/strong&gt; I also speak a little French, a tiny bit of German and Portuguese, and I'm starting to learn Spanish. I'm only fluent in English though. :(&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;I landed my job at SourceForge after I made &lt;a href="http://sourceforge.net/projects/ajaxmytop"&gt;an OSS project there&lt;/a&gt;.&lt;/strong&gt; So go make one yourself! :)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I'll tag ...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://btetc.blogspot.com/"&gt;Matt Crouch&lt;/a&gt;&lt;/strong&gt; - above-mentioned brother.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://teedubya.blogspot.com/"&gt;Travis West&lt;/a&gt;&lt;/strong&gt; - SourceForge colleague and long-time friend.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://steven.bitsetters.com/"&gt;Steven Osborn&lt;/a&gt;&lt;/strong&gt; - developer from Vidoop who helped me run the &lt;a href="http://tulsaphp.net"&gt;Tulsa PHP User Group&lt;/a&gt; until he ditched us for Portland. ;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.findmotive.com/"&gt;Noah Everett&lt;/a&gt;&lt;/strong&gt; - Tulsa PHP developer I met thru TPUG; he created and maintains &lt;a href="http://twitpic.com"&gt;twitpic&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://bradvernon.com/"&gt;Brad Vernon&lt;/a&gt;&lt;/strong&gt; - Tulsa PHP + Ruby developer I met thru TPUG.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.vancelucas.com/"&gt;Vance Lucas&lt;/a&gt;&lt;/strong&gt; - Another PHP developer here in Oklahoma. Met him at &lt;a href="http://techfests.com/Tulsa/2008/default.aspx"&gt;Tulsa Tech Fest 2008&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.rafaeldohms.com.br/pt/"&gt;Rafael Dohms&lt;/a&gt;&lt;/strong&gt; - PHP developer in Brazil; he saved my ass at &lt;a href="http://www.phpconf.com.br/"&gt;PHP Conference Brasil '08&lt;/a&gt; when he found a DVI-VGA adapter for me to present my keynote.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;So tagging it back to Brazil, from whence I was tagged. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3235594337298866891?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3235594337298866891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3235594337298866891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3235594337298866891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3235594337298866891'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2009/01/seven-things-that-probably-you-may-not.html' title='Seven things that probably you may not know about me'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-8852645096680960679</id><published>2009-01-08T13:54:00.019-06:00</published><updated>2009-01-09T09:56:37.141-06:00</updated><title type='text'>Unit-testing ZF Controllers without Zend_Test</title><content type='html'>I've read a couple articles and blog posts recently talking about &lt;a href="http://phpimpact.wordpress.com/2008/12/27/phpunit-testing-zend-framework-controllers/"&gt;Zend_Test&lt;/a&gt; and/or &lt;a href="http://phpimpact.wordpress.com/2008/12/27/phpunit-testing-zend-framework-controllers/"&gt;testing Zend Framework Controllers&lt;/a&gt;. Particularly for controller testing, I'm kinda surprised how much plumbing code people are using. I recently started testing some Zend_Controller code (from ZF 1.5 even!) at SourceForge and did not do nearly that much plumbing.&lt;br /&gt;&lt;br /&gt;Basically, I want to test the controller code in isolation from the front controller, the router, the dispatcher, the views, etc. All I to do is set up a request object, invoke the action methods of the controllers, and then assert against the variables assigned to the view. For these tests, I don't care about the output of the view templates themselves - I just want to know the controllers are putting the right variables into the view object.&lt;br /&gt;&lt;br /&gt;It turns out this is actually pretty simple. I made a custom test case:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:450px; background-color:#EEEEEE; border:1px solid #CCCCCC; font-family: monospace; font-size: .8em; overflow:auto;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Sfx_Controller_TestCase extends Sfx_TestCase&lt;br /&gt;{&lt;br /&gt;    protected $_request;&lt;br /&gt;    protected $_response;&lt;br /&gt;    protected $_controller;&lt;br /&gt;    &lt;br /&gt;    public function setUp()&lt;br /&gt;    {&lt;br /&gt;        parent::setUp();&lt;br /&gt;                &lt;br /&gt;        // set up smarty view and restful view helper&lt;br /&gt;        $viewRenderer = new Sfx_Controller_Action_Helper_TestViewRenderer();&lt;br /&gt;        Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);&lt;br /&gt;&lt;br /&gt;        $this-&gt;_request = new Zend_Controller_Request_Http();&lt;br /&gt;        $this-&gt;_response = new Zend_Controller_Response_Cli();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Sfx_TestCase contains all my bootstrap code. However, the only thing I do in bootstrap is set include path and set up a default db adapter for Zend_Db_Table. I don't do anything with Zend_Controller_Front. So this may as well extend straight from PHPUnit_Framework_TestCase. I'm not sure why others are claiming you have to use Zend_Controller_Front to test ZF Controllers - you don't.&lt;br /&gt;&lt;br /&gt;I wrote and use Sfx_Controller_Action_Helper_TestViewRenderer (&lt;a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_ViewRenderer"&gt;and proposed it as a core class&lt;/a&gt;) to simply create an empty Zend_View object into which the controllers can assign variables. Here's the whole class:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:450px; background-color:#EEEEEE; border:1px solid #CCCCCC; font-family: monospace; font-size: .8em; overflow:auto;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Sfx_Controller_Action_Helper_TestViewRenderer extends Zend_Controller_Action_Helper_ViewRenderer&lt;br /&gt;{&lt;br /&gt;    public function initView()&lt;br /&gt;    {&lt;br /&gt;        if (null === $this-&gt;view) {&lt;br /&gt;            $this-&gt;setView(new Zend_View());&lt;br /&gt;        }&lt;br /&gt;        // Register view with action controller (unless already registered)&lt;br /&gt;        if ((null !== $this-&gt;_actionController) &amp;&amp; (null === $this-&gt;_actionController-&gt;view)) {&lt;br /&gt;            $this-&gt;_actionController-&gt;view       = $this-&gt;view;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With only this much plumbing, I'm able to test the Controllers in isolation - no worrying about routes, dispatchers, plugins, helpers, nor view templates - like so:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:450px; background-color:#EEEEEE; border:1px solid #CCCCCC; font-family: monospace; font-size: .8em; overflow:auto;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ProjectControllerTest extends Sfx_Controller_TestCase&lt;br /&gt;{    &lt;br /&gt;    private function __constructProjectController()&lt;br /&gt;    {&lt;br /&gt;     return new ProjectController($this-&gt;_request, $this-&gt;_response);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function test_indexAction_fetches_all_projects()&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;_controller = $this-&gt;__constructProjectController();&lt;br /&gt;        $this-&gt;_controller-&gt;indexAction(); // assigns 'resources' to view&lt;br /&gt;        $this-&gt;assertNotNull($this-&gt;_controller-&gt;view-&gt;resources);&lt;br /&gt;        $this-&gt;assertEquals(27,count($this-&gt;_controller-&gt;view-&gt;resources));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function test_indexAction_new_since_fetches_only_new_projects()&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;_request-&gt;setParam('new_since',1205880839);&lt;br /&gt;        $this-&gt;_controller = $this-&gt;__constructProjectController();&lt;br /&gt;        $this-&gt;_controller-&gt;indexAction();&lt;br /&gt;        $projects = $this-&gt;_controller-&gt;view-&gt;resources;&lt;br /&gt;        $this-&gt;assertEquals(4,count($projects));&lt;br /&gt;        foreach($projects as $project){&lt;br /&gt;            $this-&gt;assertGreaterThan(1205880839, $project-&gt;create_time);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function test_indexAction_limit_limits_projects()&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;_request-&gt;setParam('changed_since', 1205880839);&lt;br /&gt;        $this-&gt;_request-&gt;setParam('order_by','changed_since');&lt;br /&gt;        $this-&gt;_request-&gt;setParam('limit', 5);&lt;br /&gt;        $this-&gt;_controller = $this-&gt;__constructProjectController();&lt;br /&gt;        $this-&gt;_controller-&gt;indexAction();&lt;br /&gt;        $projects = $this-&gt;_controller-&gt;view-&gt;resources;&lt;br /&gt;        $this-&gt;assertEquals(5,count($projects));&lt;br /&gt;        $prevChangeTime = 0;&lt;br /&gt;        foreach($projects as $project){&lt;br /&gt;            $this-&gt;assertGreaterThanOrEqual($prevRegTime, $project-&gt;change_time);&lt;br /&gt;            $prevChangeTime = $project-&gt;change_time;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I'm finding this to be a much simpler and easier way of testing ZF Controllers than the other articles I've been reading. Now if you &lt;span style="font-weight:bold;"&gt;want&lt;/span&gt; to test everything in the front controller dispatch process and the view templates, I think Zend_Test is the best bet, but I've not used it yet so I can't be sure. The above classes work fine for what I do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-8852645096680960679?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/8852645096680960679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=8852645096680960679' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/8852645096680960679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/8852645096680960679'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2009/01/unit-testing-zf-controllers-without.html' title='Unit-testing ZF Controllers without Zend_Test'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-4995094524091876244</id><published>2008-12-24T13:03:00.004-06:00</published><updated>2009-01-06T16:13:56.389-06:00</updated><title type='text'>Kiva.org</title><content type='html'>&lt;SCRIPT type="text/javascript" src="http://www.kiva.org/banners/bannerBlock.php?busId=81277" language="javascript"&gt;&lt;/SCRIPT&gt;&lt;br /&gt;&lt;a href="http://www.kiva.org/about"&gt;Kiva.org&lt;/a&gt; is a remarkable organization in at least a couple ways - they employ &lt;a href="http://en.wikipedia.org/wiki/Micro-finance"&gt;micro-finance&lt;/a&gt; principles to aid entrepreneurs in developing countries, and they make excellent use of online technology to do so. We highlighted them in my &lt;span style="font-style:italic;"&gt;International Aid and Development&lt;/span&gt; class in college.&lt;br /&gt;&lt;br /&gt;I really like that they're using the &lt;a href="http://longtail.com/"&gt;Long Tail&lt;/a&gt; on both the lending side &lt;span style="font-weight:bold;"&gt;and&lt;/span&gt; the receiving side of micro-finance. I also like some of their cool web features - the portable badge above, and their use of &lt;a href="http://developers.facebook.com/connect.php"&gt;Facebook Connect&lt;/a&gt; to syndicate their activity to Facebook.&lt;br /&gt;&lt;br /&gt;One of our good friends gave us a $25 gift certificate to Kiva and I think it's one of the best gifts we've ever received. I've admired Kiva for a while but have never spent the time or effort to get involved with it; this small amount is really inspiring me to do more.&lt;br /&gt;&lt;br /&gt;UPDATE: Wow. When I picked my loan recipient, Margaret, she had 0% of her requested loan. In the 1-2 hours it took to get this blog post up, she received 100% of it. Go Kiva! Go Margaret!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-4995094524091876244?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/4995094524091876244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=4995094524091876244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4995094524091876244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4995094524091876244'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/12/kivaorg.html' title='Kiva.org'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2619330342469901771</id><published>2008-12-15T18:44:00.003-06:00</published><updated>2008-12-15T19:00:47.413-06:00</updated><title type='text'>ZF Rest classes</title><content type='html'>Holy crap. I forgot that way back after Tulsa Tech Fest &lt;a href="http://bluke.blogspot.com/2008/10/tulsa-tech-fest-2008-slides.html"&gt;I promised to upload some Zend_Controller classes&lt;/a&gt; I wrote to enable RESTful behavior. I think the presentation did a decent job conveying their purpose and operation, so &lt;a href="http://tulsaphp.net/Controller.zip"&gt;here, finally, are the classes themselves&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If anyone does go look at them, feel free to comment/question here on this post about them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2619330342469901771?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2619330342469901771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2619330342469901771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2619330342469901771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2619330342469901771'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/12/zf-rest-classes.html' title='ZF Rest classes'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2696835446956985513</id><published>2008-12-09T09:08:00.003-06:00</published><updated>2008-12-09T09:10:50.382-06:00</updated><title type='text'>PHP Brasil '08</title><content type='html'>I have posted &lt;a href="https://sourceforge.net/community/php-brasil-08/"&gt;a trip report about PHP Brasil '08&lt;/a&gt; over at the SourceForge.net Community Hub. There's also a video of my talk, a link to &lt;a href="http://blogs.oracle.com/opal/2008/12/php_brasil_08_trip_report_1.html"&gt;Chris Jones's thorough trip report&lt;/a&gt;, and links to my presentation slides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2696835446956985513?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2696835446956985513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2696835446956985513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2696835446956985513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2696835446956985513'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/12/php-brasil-08.html' title='PHP Brasil &apos;08'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-1611899158123480310</id><published>2008-11-14T14:15:00.003-06:00</published><updated>2008-11-14T14:39:41.814-06:00</updated><title type='text'>Laughably Ridiculous</title><content type='html'>Okay, although I'm an open-source devotee, I've actually intellectually bantered in favor of copyright law. I know, I'm sorry; but I can understand the philosophical underpinning of *a* copyright scheme ... even if I don't agree with its effectiveness.&lt;br /&gt;&lt;br /&gt;But &lt;a href="http://torrentfreak.com/record-labels-to-sue-vuze-limewire-and-sourceforge-081114/"&gt;this&lt;/a&gt; is just getting absurd.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Interestingly, SPFF is also going after Sourceforge, the open source development website, because it hosts the P2P application Shareaza.&lt;/blockquote&gt;&lt;br /&gt;So let me state this matter-of-factly:&lt;br /&gt;&lt;br /&gt;In suing SourceForge, SPFF is not suing an entity who distributes copyrighted material. They're not even suing someone who develops software that &lt;span style="font-weight:bold;"&gt;might&lt;/span&gt; be used to distribute copyrighted material. SPFF is suing &lt;span style="font-style:italic;"&gt;someone (i.e., SourceForge) who develops software (i.e., &lt;a href="http://sf.net/"&gt;sf.net&lt;/a&gt;) that &lt;span style="font-weight:bold;"&gt;might&lt;/span&gt; be used to develop or distribute software (i.e., &lt;a href="http://shareaza.sf.net/"&gt;Shareaza&lt;/a&gt;) that &lt;span style="font-weight:bold;"&gt;might&lt;/span&gt; be used to distributed copyrighted material&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-1611899158123480310?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/1611899158123480310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=1611899158123480310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1611899158123480310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1611899158123480310'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/11/laughably-ridiculous.html' title='Laughably Ridiculous'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2736564976822237236</id><published>2008-11-03T13:25:00.002-06:00</published><updated>2008-11-03T13:27:35.124-06:00</updated><title type='text'>Oklahoma State Question 743</title><content type='html'>Here is, verbatim, text I received from the local homebrew shop about Oklahoma State Question 743. I think it's important for people to be informed when they vote, so I'm passing this along ... obviously it's biased pro-wine-makers...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Fellow Oklahoma winemakers and homebrewers,&lt;br /&gt;Tomorrow's election will have a state question that has a huge impact on the Oklahoma winemaking industry.  In 2001, voters in Oklahoma voted over 70% in favor of allowing Oklahoma wineries to sell directly to liquor stores and restaurants without going through a distributor.  That change allowed the wine industry to go from a few wineries to over 50 in just a few short years.  Small wineries were able to sell to the local liquor stores and restaurants without being at the mercy of a wholesaler that had little interest in distributing for every little winery that opened here in Oklahoma.&lt;br /&gt; &lt;br /&gt;Last year this law was challenged by the distributors as unconstitutional and was overturned by the state supreme court.  The reasoning was that it created an unfair advantage for Oklahoma wineries over out of state wineries who were still required to go through a distributor.  It was a huge blow.  Out of state wineries that distribute in Oklahoma would more than likely use a distributor regardless.&lt;br /&gt; &lt;br /&gt;In order to make the law "fair", a new question will be on tomorrows ballet.  It rewrites the law to include any winery that produces under 10,000 gallons a year.  Oklahoma wineries are dying on the vine right now.  With out this change many will not succeed.  Please pass this on to friends so that we can ensure that this law passes.&lt;br /&gt; &lt;br /&gt;The following is the actual question appearing on the ballot:&lt;br /&gt;State Question 743 - In Short: Wineries from Oklahoma and outside the state of Oklahoma will be able to sell their wine directly to retail stores and restaurants if SQ 743 is approved. Currently, they can only do so through a wholesaler or at fairs/festivals.&lt;br /&gt;&lt;br /&gt;Actual Ballot Text:&lt;br /&gt;&lt;br /&gt;    This measure amends Section 3 of Article 28 of the Constitution. It requires a customer to be twenty-one and physically present to purchase wine at a winery, festival or trade show. The measure changes the law to allow certain winemakers to sell directly to retail package stores and restaurants in Oklahoma. The change applies to winemakers who produce up to ten thousand gallons of wine a year. It applies to winemakers in state and out of state. Those winemakers may not also use a licensed wholesale distributor. They must sell their wine to every retail package store and restaurant in Oklahoma that wants to buy the wine. The sales must be on the same price basis. The sales must be without discrimination. Those winemakers must use their own leased or owned vehicles to distribute their wine. They may not use common or private carriers. If any part of this measure is found to be unconstitutional, no winemaker could sell wine directly to retail package stores or restaurants in Oklahoma.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2736564976822237236?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2736564976822237236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2736564976822237236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2736564976822237236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2736564976822237236'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/11/oklahoma-state-question-743.html' title='Oklahoma State Question 743'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-9205104366715008975</id><published>2008-10-30T17:30:00.002-05:00</published><updated>2008-10-30T17:37:20.033-05:00</updated><title type='text'>Designing Simplicity</title><content type='html'>Dang! I wish I had this quote when I was making my REST slides for Tulsa Tech Fest. It's perfect!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I think most people just make the mistake that it should be simple to design simple things. In reality, the effort required to design something is inversely proportional to the simplicity of the result.&lt;br /&gt;-&lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-724"&gt;Roy Fielding&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The man himself. Priceless. Goes along great with the one I &lt;span style="font-style:italic;"&gt;did&lt;/span&gt; use:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away.&lt;br /&gt;-&lt;a href="http://www.jimpoz.com/quotes/Speaker:Antoine_de_Saint-Exup%E9ry"&gt;Antoine de Saint-Exupry&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-9205104366715008975?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/9205104366715008975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=9205104366715008975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/9205104366715008975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/9205104366715008975'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/10/designing-simplicity.html' title='Designing Simplicity'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-7938665634112258273</id><published>2008-10-23T12:38:00.008-05:00</published><updated>2008-10-23T12:50:56.077-05:00</updated><title type='text'>Framework Performance according to Rasmus</title><content type='html'>Alright, so invoking Rasmus in the title is a bit provocative, but I stumbled on &lt;a href="http://talks.php.net/show/froscon08/"&gt;an interesting talk of his; showing performance benchmarks for a number of popular php frameworks&lt;/a&gt;. The first portion of the talk is exactly &lt;a href="http://talks.php.net/show/oscon08"&gt;what he presented @ OSCON&lt;/a&gt;, but the second half looks to be raw performance numbers. It looks like there are a couple specific, but easy, performance tweaks that he granted to certain frameworks, and I like seeing the data so much I thought I could try my hand at distilling it into Google Docs charts.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Fa_U5q7fBBY/SQC4W_KKKEI/AAAAAAAAABI/YXgaNBS3iOY/s1600-h/framework_performance_(higher_is_better).png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://4.bp.blogspot.com/_Fa_U5q7fBBY/SQC4W_KKKEI/AAAAAAAAABI/YXgaNBS3iOY/s320/framework_performance_(higher_is_better).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5260407069819414594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Fa_U5q7fBBY/SQC4jP7k-cI/AAAAAAAAABQ/BN53Z--Vp30/s1600-h/framework_performance_(lower_is_better).png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://3.bp.blogspot.com/_Fa_U5q7fBBY/SQC4jP7k-cI/AAAAAAAAABQ/BN53Z--Vp30/s320/framework_performance_(lower_is_better).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5260407280480090562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's interesting that some &lt;a href="http://tulsaphp.net/"&gt;tulsaphp&lt;/a&gt; guys and were recently talking about Zend had to be the slowest of all the frameworks, but apparently not so! That honor goes to CakePHP?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-7938665634112258273?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/7938665634112258273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=7938665634112258273' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7938665634112258273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7938665634112258273'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/10/framework-performance-according-to.html' title='Framework Performance according to Rasmus'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Fa_U5q7fBBY/SQC4W_KKKEI/AAAAAAAAABI/YXgaNBS3iOY/s72-c/framework_performance_(higher_is_better).png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-478402923770218729</id><published>2008-10-09T17:24:00.002-05:00</published><updated>2008-10-09T17:26:39.848-05:00</updated><title type='text'>Tulsa Tech Fest 2008 Slides</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://techfests.com/Tulsa/2008/SiteImages/logo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://techfests.com/Tulsa/2008/SiteImages/logo.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;As promised, I'm posting my slides from my Tulsa Tech Fest 2008 presentation - &lt;a href="http://tulsaphp.net/restful_mvc_zf.html"&gt;RESTful MVC in Zend Framework&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-478402923770218729?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/478402923770218729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=478402923770218729' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/478402923770218729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/478402923770218729'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/10/tulsa-tech-fest-2008-slides.html' title='Tulsa Tech Fest 2008 Slides'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3372605792887358639</id><published>2008-09-30T18:06:00.013-05:00</published><updated>2008-09-30T18:52:17.412-05:00</updated><title type='text'>the binary canary testing pattern</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Fa_U5q7fBBY/SOKz6Lj7UTI/AAAAAAAAABA/BOQGrVtVFic/s1600-h/canary_coal_mine_0.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Fa_U5q7fBBY/SOKz6Lj7UTI/AAAAAAAAABA/BOQGrVtVFic/s320/canary_coal_mine_0.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5251957927584682290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think I just invented a new testing pattern - The Binary Canary.&lt;br /&gt;&lt;br /&gt;Basically, I was grouping my PHPUnit tests into a test suite and I realized that my TestCase super-classes were "failing" because they had no tests in them. Obviously this is intentional - only the specific sub-classes would have tests.&lt;br /&gt;&lt;br /&gt;I guess I could have made the TestCase super-classes abstract, but instead I added this to the highest-level TestCase class:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt; * global test plumbing here&lt;br /&gt; */&lt;br /&gt;class Sfx_TestCase extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt; public function setUp()&lt;br /&gt; {&lt;br /&gt;  // more global test plumbing here&lt;br /&gt; }&lt;br /&gt; public function test_Binary_Canary()&lt;br /&gt; {&lt;br /&gt;  $this-&gt;assertEquals(&lt;br /&gt;         "Binary Canary says test plumbing is working.", &lt;br /&gt;         "Binary Canary says test plumbing is working."&lt;br /&gt;        );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;My little binary canary serves two purposes:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;It adds an "always-pass" test to each of my TestCase classes so they don't throw up any more PHPUnit warnings.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Because my TestCase classes set up context-specific test plumbing, the binary canary test inherited by each of them now alerts me if I screw up any of my test plumbing - and tells me the specific area.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Sfx_Db_TestCase extends Sfx_TestCase&lt;br /&gt;{&lt;br /&gt; public function setUp()&lt;br /&gt; {&lt;br /&gt;  parent::setUp();&lt;br /&gt;  // Db-specific test plumbing&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Sfx_Controller_TestCase extends Sfx_TestCase&lt;br /&gt;{&lt;br /&gt; public function setUp()&lt;br /&gt; {&lt;br /&gt;  parent::setUp();&lt;br /&gt;  // Controller-specific test plumbing&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Just like the coal-miner canaries of old, this mechanism gives me a simple yes/no signal as to whether or not my test plumbing will soon kill me, &lt;strong&gt;and&lt;/strong&gt; which plumbing code is the culprit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3372605792887358639?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3372605792887358639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3372605792887358639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3372605792887358639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3372605792887358639'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/09/binary-canary-testing-pattern.html' title='the binary canary testing pattern'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Fa_U5q7fBBY/SOKz6Lj7UTI/AAAAAAAAABA/BOQGrVtVFic/s72-c/canary_coal_mine_0.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-6732314582482149939</id><published>2008-09-26T10:28:00.006-05:00</published><updated>2008-09-26T11:17:34.876-05:00</updated><title type='text'>bailouts</title><content type='html'>I usually try to avoid preachy blog postings, but I can't help it today. Blame it on "casual Friday" or something.&lt;br /&gt;&lt;br /&gt;Like lots of people, I'm pretty angry about the government using our taxes to bail out Wall Street incompetence. But now I've gone from angry to pissed-off. Here's why ... &lt;br /&gt;&lt;blockquote&gt;The Dot-com bubble crash wiped out $5 trillion in market value of technology companies from March 2000 to October 2002.[11]&lt;br /&gt;&lt;br /&gt;Recent research suggests, however, that as many as 50% of the dot-coms survived through 2004, reflecting two facts: the destruction of public market wealth did not necessarily correspond to firm closings, and second, that most of the dot-coms were small players who were able to weather the financial markets storm.[12]&lt;br /&gt;&lt;br /&gt;--&lt;a href="http://en.wikipedia.org/wiki/Dot-com_bubble#Aftermath"&gt;http://en.wikipedia.org/wiki/Dot-com_bubble#Aftermath&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Not only do I work for a dot-com survivor, I work for one of the most bruised, battered, and beaten-up dot-com survivors. I mean, just check out &lt;a href="http://finance.google.com/finance?chdnp=1&amp;chdd=1&amp;chds=1&amp;chdv=1&amp;chvs=maximized&amp;chdeh=0&amp;chdet=1222459200000&amp;chddm=875449&amp;q=NASDAQ:LNUX&amp;ntsp=0"&gt;our stock chart&lt;/a&gt;! I haven't asked around the office for official corporate history or anything, but I'm pretty sure no-one remembers getting a couple billion dollars from the government while the company lost close to 99% of its market value, but I have been told there were weekly, if not daily, downsizing announcements.&lt;br /&gt;&lt;br /&gt;Now I'm not jealous or vindictive on the part of my company - I wasn't even around for the toughest times. I'm just making a point here that market "catastrophes" and "crises" have happened, happen, and will always happen. Sadly, people will lose their jobs, their wealth, and their houses. In the case of the dot-com fallout, $5 trillion worth on Wall Street alone plus whatever subsequent losses are tallied.&lt;br /&gt;&lt;br /&gt;6 weeks ago, the Congressional Budget Office said taxpayers would need to spend $25 billion to bail out Fannie Mae and Freddie Mac. Now we are seeing figures up to $700 billion. The figure could very well balloon to beyond the $5 trillion lost in the dot-com burst, no-one really knows - not you, not me, not Wall Street, and not Washington.&lt;br /&gt;&lt;br /&gt;So why are we even considering footing the bill for this when no-one even knows what the total is, how it's going to be paid, or to whom we pay it? Obviously there are some very powerful financial market players gaming the system. They are not the "small players who [are] able to weather the financial markets storm."&lt;br /&gt;&lt;br /&gt;It would be interesting to see if the Financial/Credit/Mortgage-Lending industry follows a Long Tail distribution. Might be a case of the tall head exploiting the public to avoid their necessary chop down to obscurity ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.despair.com/products/demotivators/underachievement.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px;" src="http://images.despair.com/products/demotivators/underachievement.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-6732314582482149939?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/6732314582482149939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=6732314582482149939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6732314582482149939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6732314582482149939'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/09/bailouts.html' title='bailouts'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2763300703904932479</id><published>2008-09-17T10:48:00.003-05:00</published><updated>2008-09-17T11:11:20.186-05:00</updated><title type='text'>unit tests and just-got-it-working inertia</title><content type='html'>I've been reading and enjoying &lt;a href="http://oreilly.com/catalog/9780596519780/"&gt;The Productive Programmer&lt;/a&gt; by Neal Ford. It has re-ignited some of my passion for Test-Driven Development.&lt;br /&gt;&lt;br /&gt;This morning I finished a first phase of "refactoring" some code architecture and found myself extremely hesitant to dive straight into the next phase. I think it's because the extent of my "testing" was to tab over to the fully-functioning web page and refresh after each code change. That's pretty much an "all-or-nothing" scenario.&lt;br /&gt;&lt;br /&gt;And the thing about all-or-nothing scenarios is that once you've achieved the "all" state, you're very hesitant to go back to the "nothing" state. Maybe I'm starting to understand one of the benefits of unit tests as opposed to whole-sale acceptance tests. With smaller unit tests, you can move more concretely from nothing to something, then from something to something a little more, then finally to all done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2763300703904932479?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2763300703904932479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2763300703904932479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2763300703904932479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2763300703904932479'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/09/unit-tests-and-just-got-it-working.html' title='unit tests and just-got-it-working inertia'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-6123012293541648497</id><published>2008-08-29T14:29:00.005-05:00</published><updated>2008-08-29T14:46:57.432-05:00</updated><title type='text'>Brasil</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.phpconf.com.br/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px;" src="http://www.phpconf.com.br/includes/templates/padrao/imagens/promo/phpconf_speaker_btn_en.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;One of the great things about working for a big-name web company is that you get big opportunities. I'll be speaking at PHP Conference Brasil '08 about how we use PHP at &lt;a href="http://sourceforge.net/"&gt;SourceForge.net&lt;/a&gt;. Needless to say, I'm very excited and planning some vacation time around the conference.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://news.bbc.co.uk/2/hi/business/4602325.stm"&gt;Open&lt;/a&gt; &lt;a href="http://www.wired.com/techbiz/it/news/2003/11/61257"&gt;source&lt;/a&gt; is &lt;a href="http://www.npr.org/templates/story/story.php?storyId=3919175"&gt;big&lt;/a&gt; in &lt;a href="http://news.bbc.co.uk/2/hi/business/3445805.stm"&gt;Brazil&lt;/a&gt;. And even more pertinent, Brazil is our 3rd-highest nation in terms of site traffic - after U.S.A. and Germany.&lt;br /&gt;&lt;br /&gt;Hopefully I can &lt;a href="http://www.amazon.com/Conversational-Brazilian-Portuguese-Understand-Schusters/dp/0743550447/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1220038883&amp;amp;sr=8-2"&gt;try&lt;/a&gt; to overcome the language gap and present some informative material for everyone. One of the things that struck me when I joined &lt;a href="http://sourceforge.net/"&gt;SourceForge.net&lt;/a&gt; was that the site code isn't super-magic - it's really quite ordinary PHP, it's just very highly used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-6123012293541648497?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/6123012293541648497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=6123012293541648497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6123012293541648497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6123012293541648497'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/08/brasil.html' title='Brasil'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-4304445564348324778</id><published>2008-08-03T14:16:00.004-05:00</published><updated>2008-08-03T14:29:32.198-05:00</updated><title type='text'>Ubuntu FTW; Boot Camp FTL?</title><content type='html'>quick update on my ubuntu experience ...&lt;br /&gt;&lt;br /&gt;webex went fine. linux client seamlessly downloaded and allowed me to join a webex conference. joined the teleconference via skype with just a small hiccup - took me a couple minutes of tweaking with various sound levels to get my mac's built-in mic going. but iSight camera was working with Skype straight away, so that was nice.&lt;br /&gt;&lt;br /&gt;but, near the start of my first full day, I needed to investigate an IE bug, so I tried booting up into my Windows partition. epic fail. blue screen immediately upon boot. :( tried fixing my mbr via the Windows XP install CD, but no luck with that either.&lt;br /&gt;&lt;br /&gt;I remembered that the &lt;a href="https://help.ubuntu.com/community/MacBookPro#Preparing%20to%20Install%20Ubuntu%20alongside%20OS%20X%20&amp;amp;%20Windows%20XP%20%28Triple%20Boot%29"&gt;ubuntu instructions for triple-booting&lt;/a&gt; suggested installing GRUB on the partition with ubuntu, and I also remembered that I had missed that step. so, I decided to reset and start all over again. I booted into Mac OS (no probs there - in all of this experimentation I never once had a problem booting into Mac OS), and used disk utility to destroy both my ubuntu and windows partitions.&lt;br /&gt;&lt;br /&gt;this time, I tried &lt;a href="https://help.ubuntu.com/community/MacBookPro#Easiest%20Triple%20Boot%20%28Boot%20Camp%29"&gt;the other (easy) approach&lt;/a&gt; and after installing Windows, I ran ubuntu installer. this time I remembered to install GRUB on the ubuntu partition, rather than defaulting to the mbr. however, when I booted up again, I had the same experience - Mac and Ubuntu would start up fine, but Windows failed to start again. :(&lt;br /&gt;&lt;br /&gt;because I constantly need to test in IE every day, I sadly decided that I needed to stop with all the experimentation and just resign to using Ubuntu on my secondary computers. :(&lt;br /&gt;&lt;br /&gt;it's too bad - I would love to have a triple-booting MacBook Pro, especially if I could fire up both my Windows and my Ubuntu systems inside a parallels or fusion vm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-4304445564348324778?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/4304445564348324778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=4304445564348324778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4304445564348324778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4304445564348324778'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/08/ubuntu-ftw-boot-camp-ftl.html' title='Ubuntu FTW; Boot Camp FTL?'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3398265879655555971</id><published>2008-07-28T22:22:00.003-05:00</published><updated>2008-07-28T23:07:48.034-05:00</updated><title type='text'>Ubuntu FTW?</title><content type='html'>I picked up an &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; CD at &lt;a href="http://en.oreilly.com/oscon2008/public/content/home"&gt;OSCON&lt;/a&gt; and have now installed it on my macbook pro. I have no qualms saying this version (8.04) is easily the best Linux experience I've ever had...&lt;br /&gt;&lt;br /&gt;I had to connect to ethernet to get first batch of updates which also let me get &lt;a href="https://help.ubuntu.com/community/WifiDocs/Driver/Ndiswrapper"&gt;ndiswrapper&lt;/a&gt; and appropriate driver for my wifi card.&lt;br /&gt;&lt;br /&gt;once I had that, wifi connected and it was a single apt-get command to get the proper &lt;a href="https://help.ubuntu.com/community/BluetoothSetup"&gt;bluetooth&lt;/a&gt; module so my mouse would work. then I started downloading and playing with the new &lt;a href="https://wiki.ubuntu.com/compiz"&gt;compiz&lt;/a&gt; stuff. I have to say, compiz effects blow away Mac OS X effects, though they're not quite as pragmatically integrated into everyday uses.&lt;br /&gt;&lt;br /&gt;I fired up &lt;a href="http://sourceforge.net/projects/pidgin/"&gt;pidgin&lt;/a&gt; and got connected to our company jabber and my google talk account. similar simplicity and ease with &lt;a href="https://wiki.ubuntu.com/Evolution"&gt;Evolution&lt;/a&gt; for company email (though I also started trying &lt;a href="http://www.zimbra.com/products/desktop_download.html"&gt;Zembra Desktop&lt;/a&gt; since OSCON).&lt;br /&gt;&lt;br /&gt;our setup at sf.net is kinda unique in that we have our own sandbox sites that we can access and edit via webdav, so I did a simple apt-get for &lt;a href="http://www.howtoforge.com/davfs_ubuntu"&gt;davfs2&lt;/a&gt;, made the necessary mods to /etc/fstab and I was able to vim edit some code. but I decided to go looking for linux php editors. I tried &lt;a href="http://bluefish.openoffice.nl/"&gt;bluefish&lt;/a&gt; and &lt;a href="http://www.jedit.org/"&gt;jedit&lt;/a&gt; and liked jedit much more - its performance with the webdav-mounted dir was much better.&lt;br /&gt;&lt;br /&gt;I also exported my del.icio.us bookmarks and imported them over into Ubuntu firefox. and I installed &lt;a href="https://wiki.ubuntu.com/GnomeDo"&gt;GnomeDo&lt;/a&gt; because I'm a quicksilver junkie.&lt;br /&gt;&lt;br /&gt;total time was probably 2 hours or so - much better than any of my other previous jaunts into Linux. large credit to the high-quality &lt;a href="https://wiki.ubuntu.com/"&gt;ubuntu wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;so I'm thinking to try out a full day of ubuntu tomorrow. my only concern is webex, though there is a native Linux client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3398265879655555971?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3398265879655555971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3398265879655555971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3398265879655555971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3398265879655555971'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/07/ubuntu-ftw.html' title='Ubuntu FTW?'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3628484775978175964</id><published>2008-07-13T12:24:00.002-05:00</published><updated>2008-07-13T12:27:01.048-05:00</updated><title type='text'>interesting mix of ideas</title><content type='html'>the two reading pieces I have sitting on my desk are this Origin of Wealth and the latest Wired magazine. interesting to be reading them simultaneously ...&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.wired.com/science/discoveries/magazine/16-07/pb_theory"&gt;Wired&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"Scientists are trained to recognize that correlation is not causation, that no conclusions should be drawn simply on the basis of correlation between X and Y (it could just be coincidence). Instead, you must understand the underlying mechanisms that connect the two. Once you have a model, you can connect the data sets with confidence. Data without a model is just noise.&lt;br /&gt;But faced with massive data, this approach to science - hypothesize, model, test - is becoming obsolete.&lt;br /&gt;...&lt;br /&gt;There is now a better way. Petabytes allow us to say: 'Correlation is enough.' We can stop looking for models. We can analyze the data without hypotheses about what it might show. We can throw the numbers into the biggest computing clusters the world has ever seen and let statistical algorithms find patterns where science cannot."&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.amazon.com/Origin-Wealth-Evolution-Complexity-Economics/dp/1422121038/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1215969960&amp;amp;sr=8-1"&gt;Origin of Wealth&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"... not only is there a problem with data that contradicts Traditional [Economic] theories, but many theories have simply never been properly tested. One branch of economics, called econometrics, deals with data analysis. Rather than testing theoretical models, however, much econometric work is devoted to finding statistical relationships between variables (often for public policy or other applied purposes). Unfortunately, statistical correlations don't provide a causal explanation of the phenomena. Furthermore, as many economists would point out, there is often a lack of readily available data to test theories with, and even data that is available is frequently noisy or otherwise problematic."&lt;br /&gt;&lt;br /&gt;should be an interesting week as these seemingly conflicting ideas bounce around in my head.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3628484775978175964?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3628484775978175964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3628484775978175964' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3628484775978175964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3628484775978175964'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/07/interesting-mix-of-ideas.html' title='interesting mix of ideas'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-152921762891842206</id><published>2008-06-19T08:23:00.002-05:00</published><updated>2008-06-19T08:24:44.036-05:00</updated><title type='text'>Support Tech Opening @ SourceForge</title><content type='html'>&lt;a href="https://home.eease.com/recruit2/?id=46046"&gt;SourceForge is hiring for a Level 2 Support Tech!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-152921762891842206?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/152921762891842206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=152921762891842206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/152921762891842206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/152921762891842206'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/06/support-tech-opening-sourceforge.html' title='Support Tech Opening @ SourceForge'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2674190985659259954</id><published>2008-06-09T08:38:00.005-05:00</published><updated>2008-06-09T10:07:00.660-05:00</updated><title type='text'>boycott boycottnovell.com</title><content type='html'>okay, I'll be the first to say that the Novell-Microsoft deal was bad - way bad. and I am boycotting Novell myself. to summarize my perspective on it, I'll simply present Moglen's analysis on the subject, which I consider to be one of the top 5 extemporaneous monologues of all time:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6YExl9ojclo&amp;amp;hl=en"&gt;&lt;embed src="http://www.youtube.com/v/6YExl9ojclo&amp;amp;hl=en" type="application/x-shockwave-flash" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;but I also take issue with the opposite extreme that, because Microsoft has done bad things with the community, they are comprehensively unable to do any good things with the community. I know that boycottnovell.com isn't the only crier of this fallacy, but they're the ones who are &lt;a href="http://boycottnovell.com/2008/05/19/microsoft-pockets-sf-net/"&gt;recently&lt;/a&gt; &lt;a href="http://boycottnovell.com/2008/05/27/newsforge-and-ad-sponsorship/"&gt;taking&lt;/a&gt; &lt;a href="http://boycottnovell.com/2008/06/09/codeplex-and-sourceforge/"&gt;pot-shots&lt;/a&gt; at my &lt;a href="http://sourceforge.net/"&gt;employer&lt;/a&gt; - a company that I think has always valued, and continues to value, the success of the community, or else I would not have taken a job with them.&lt;br /&gt;&lt;br /&gt;from the inside, I can tell it plainly that Microsoft is simply a sponsor and participant in our &lt;a href="http://sourceforge.net/community/cca08"&gt;2008 CCA awards&lt;/a&gt;. technically, I also happen to know that we did nothing more than pre-load a big list of Codeplex project names into our CCA 08 database. there's no conspiracy to go thru all of our projects and attach Codeplex EULA's to them, or to use our CCA awards to scare the OSS community, as &lt;a nicetitle="Posts by Roy Schestowitz" href="http://boycottnovell.com/author/schestowitz/"&gt;Roy Schestowitz&lt;/a&gt; seems to imagine.&lt;br /&gt;&lt;br /&gt;Roy's pieces at boycottnovell.com seem to flow from his presumed indisputable inference that the motivations of not only Microsoft, but also anyone who collaborates with Microsoft, are sinister in nature. and he's repeatedly making these near-libelous statements, which boycottnovell.com is enabling, and this is the reason I'm boycotting them in addition to boycotting Novell.&lt;br /&gt;&lt;br /&gt;as I preview this post myself, it is comical to contrast Roy's &lt;a href="http://en.wikipedia.org/wiki/Proof_by_verbosity"&gt;proof-by-verbosity&lt;/a&gt; case with Moglen's eloquent and exemplary case against a specific abuse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2674190985659259954?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2674190985659259954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2674190985659259954' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2674190985659259954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2674190985659259954'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/06/boycott-boycottnovellcom.html' title='boycott boycottnovell.com'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3009566365601854873</id><published>2008-05-16T09:47:00.007-05:00</published><updated>2008-05-16T12:36:45.564-05:00</updated><title type='text'>Austrians want to be FREE yo</title><content type='html'>wow - I must be pretty stirred to actually write a blog post again, but here it goes.&lt;br /&gt;&lt;br /&gt;I'd call myself an Austrian-leaning student of economics. I got a minor in ECON, but that's pretty much just enough to know that I really don't know very much at all. I hit up RSS feeds from the likes of &lt;a href="http://mises.org/"&gt;The Mises Institute&lt;/a&gt; to keep myself in Austrian shape.&lt;br /&gt;&lt;br /&gt;I've also been a big fan of &lt;a href="http://www.thelongtail.com/"&gt;The Long Tail&lt;/a&gt;, both the book and the blog. and &lt;a href="http://en.wikipedia.org/wiki/Chris_Anderson_%28writer%29"&gt;Chris Anderson&lt;/a&gt; is on the advisory board of &lt;a href="http://web.sourceforge.com/"&gt;my employer&lt;/a&gt;, so I respect and subscribe to pretty much all of his ideas.&lt;br /&gt;&lt;br /&gt;so when a friend shared &lt;a href="http://mises.org/story/2971"&gt;a Mises article discussing Anderson's upcoming book - FREE&lt;/a&gt; with me, my interest was most assuredly sparked. but as I read, I was disappointed to find Fernando dismissing, whole-sale, Chris's entire analysis.&lt;br /&gt;&lt;br /&gt;I actually agree with Fernando's closing thought - "With time rightly identified as a scarce resource, economic theory is needed to understand the interchange process." and I'd be willing to bet Chris agrees as well, since Chris's article plainly states: "There is, presumably, a limited supply of reputation and attention [i.e. - time] in the world at any point in time. These are the new scarcities — and the world of free exists mostly to acquire these valuable assets for the sake of a business model to be identified later."&lt;br /&gt;&lt;br /&gt;so really, I don't think Chris's latest thesis is contradictory to the "laws" of economics, as Fernando apparently perceives. my conclusion would rather be that new and innovative business models will live and die by how well they apply of the laws of economics to actually-scarce goods in a new "freeconomic" culture.&lt;br /&gt;&lt;br /&gt;I think we just have two different-but-overlapping spheres of study - economics and business. Fernando cites Buchanan's explanation of why marginal costs don't determine prices - with which I agree. having not read the cited book, I poked thru it with Google Books for "marginal cost" and came onto a few interesting blurbs:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Instead he [welfare economists] would introduce, as Knight did, the possibility that hunters, generally, may have some &lt;span style="font-style: italic;"&gt;non-pecuniary&lt;/span&gt; or noneconomic arguments in their utility functions. &lt;/blockquote&gt;&lt;br /&gt;emphasis mine. so Buchanan points out that price-marginal cost scenarios tend to rely on non-pecuniary circumstances. does he further go on to refute that those kinds of circumstances occur? nope, not really - it seems he merely elaborates on what &lt;span style="font-style: italic;"&gt;kind&lt;/span&gt; of analysis is produced by their inclusion.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;In resorting to noneconomic arguments in the utility function ... the economist has shifted the whole analysis from a predictive to a nonpredictive and purely logical theory.&lt;/blockquote&gt;&lt;br /&gt;I don't think Chris would have any qualms about admitting his idea is a "purely logical theory" rather than a "predictive economic theory", and that's how I look at it as well.&lt;br /&gt;&lt;br /&gt;and from the perspective of an entrepreneur hoping to enter the market, do I really care which it is? isn't it enough to observe that prices &lt;span style="font-style: italic;"&gt;are&lt;/span&gt; converging to marginal cost, that indeed I &lt;span style="font-style: italic;"&gt;am&lt;/span&gt; able to buy marginal units of &lt;a href="http://www.amazon.com/gp/browse.html?node=16427261"&gt;storage&lt;/a&gt; and &lt;a href="http://www.amazon.com/EC2-AWS-Service-Pricing/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=201590011&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA"&gt;process capacity&lt;/a&gt;, and that technological advance and competition are &lt;span style="font-style: italic;"&gt;driving each other&lt;/span&gt; in a cycle?&lt;br /&gt;&lt;br /&gt;all this stuff is pretty new - we're not re-hashing scenarios that have been recorded in dusty economics tomes for decades. sure there have always been such things as cross-subsidies and  non-pecuniary psychic revenue driving free economies; Chris's theory should at least be respected because it indicates these underlying economic forces emerging in a noticeable change of our culture.&lt;br /&gt;&lt;br /&gt;this theory is like an elephant, and we're all a bunch of blind folks getting a feel for different parts of it. some of us might be observing only this or that piece of it and get the wrong impression of what it really is, but it's certainly something - we shouldn't touch a single piece of it and dismiss it altogether.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3009566365601854873?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3009566365601854873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3009566365601854873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3009566365601854873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3009566365601854873'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2008/05/austrians-want-to-be-free-yo.html' title='Austrians want to be FREE yo'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-4553533169208603130</id><published>2007-10-12T10:21:00.000-05:00</published><updated>2007-10-12T10:39:44.240-05:00</updated><title type='text'>Re: An Open Letter to the Ron Paul Faithful</title><content type='html'>&lt;a href="http://www.cnbc.com/id/21257762/"&gt;Mr. Wastler&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;I don't want to simply rant or YELL at you, but I'd like to make a few points in response to your pseudo-accusatory remarks directed at Ron Paul supporters.&lt;br /&gt;&lt;br /&gt;First, when you say that, " ... these Internet polls are admittedly unscientific and subject to hacking," you are incorrectly implying that other "legit" polls are not so. As I understand it, a "traditional" poll method leading up to primaries is to call 400 land-line numbers of previous primary voters. This alone introduces selection bias which detracts from the "scientific" accuracy of results.&lt;br /&gt;&lt;br /&gt;Then, you go on to conclude that, "Our poll was either hacked or the target of a campaign." Now, whether or not your poll was hacked can only be known by CNBC and your web administrators. But since your core business is to deliver accurate financial information to the public, one would hope the security and reliability of your information isn't compromised. To give you the benefit of the doubt, we'll assume that your website is reliable and, also assuming very little "legit" Ron Paul support exists, that the poll was "the target of a campaign." Is this not, for better or worse, the way our political system works? Isn't the primary vote, the presidential vote, and the votes for every other elected position in our government the "target of a campaign?" So clearly, this isn't a sufficient reason to remove the poll, or else you would also have to remove coverage of every vote ever conducted. Your reasoning doesn't add up, so to remove *this* poll is to censor and edit facts based on some other judgment. If the actions of a well-organized campaign of individuals, acting within the rules *you* establish, makes a poll un-scientific, then how much more-so does your action of censorship?&lt;br /&gt;&lt;br /&gt;Though your "show of hands" analogy is an admiral objective, you either intentionally refuse or ignorantly fail to see where it breaks down. It seems the poll was meant to be a "show of hands" of a certain or select few people in a certain or select space you consider to be "scientifically" representative. What actually happened is that masses of people from outside your pre-supposed space poured in to demonstrate not just their support they have for one of the options you were offering, but also to indirectly demonstrate the clumsiness and inappropriateness of your selection of individuals and space. Admittedly, this is more a criticism of all of "old media" than your poll specifically, but your poll is just another example of new forces at work in our country, and in your industry specifically. I.e., "old media" used to be the ' ... well-organized and committed "few" ... ' guiding ' ... a system meant to reflect the sentiments of "the many"' but that is changing. You should be worried.&lt;br /&gt;&lt;br /&gt;-L&lt;br /&gt;&lt;br /&gt;P.S. &lt;a href="http://btetc.blogspot.com/2007/10/open-letter-to-allen-wastler.html"&gt;There are others who want to talk to you.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-4553533169208603130?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/4553533169208603130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=4553533169208603130' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4553533169208603130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4553533169208603130'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/10/re-open-letter-to-ron-paul-faithful.html' title='Re: An Open Letter to the Ron Paul Faithful'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-7748314690643653505</id><published>2007-06-21T13:51:00.001-05:00</published><updated>2007-06-21T14:00:46.368-05:00</updated><title type='text'>Ron Paul Excluded in Iowa, pt. 2 electric Bugaloo</title><content type='html'>&lt;a href="http://digg.com/2008_us_elections/Ron_Paul_Excluded_in_Iowa_pt_2_electric_Bugaloo"&gt;Original digg post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I try not to post about political subjects, but this debacle is just too ripe and Ron Paul is just too cool for me to follow my normal political blog silence. Give an idiot a microphone, and I'll use it...&lt;br /&gt;&lt;br /&gt;Ron Paul is being excluded from an upcoming presidential candidates' forum sponsored by Iowans for Tax Relief and Iowa Christian Alliance. Now, they have every right to exclude anyone they want, and no-one is arguing about that. But, if you know anything about Ron Paul, you're shocked to think that these two organization would exclude Dr. Paul, of all people. Ron Paul's campaign posted the public contact information (taken from their websites) for these two organizations and encouraged supporters to call and question the action. Apparently, the response is overwhelming the organizations, and a local radio show picked up the story and interviewed parties from both Ron Paul's campaign (Kent Snyder), and Ed Failor from Iowans for Tax Relief. The result is a pretty comical display of Failor's total ineptitude in explaining any kind of rational argument.&lt;br /&gt;&lt;br /&gt;In response to the simple question: "Why was Ron Paul excluded?" he offers the following answer a number of times: "Because we drew a line of exclusion months ago." But this is nothing more than saying Ron Paul was excluded because he was excluded. It's circular non-sense.&lt;br /&gt;&lt;br /&gt;Failor also offers up a dog's breakfast of off-the-cuff trite arguments in a scattershot manner.&lt;br /&gt;&lt;br /&gt;Failor also tries to explain the exclusion by saying that they have an obligation to be educational and can't slant or bias their invitations towards people who favor any certain political agenda. But cutting taxes is already a political agenda, and the other candidates invited have pro-tax-cuts agendas, just as Ron Paul does - though none of them have the 100% record he has.&lt;br /&gt;&lt;br /&gt;Failor then tries to explain that the exclusion of Ron Paul is done on a basis of credibility and that Ron Paul has less than 1% support in popular polls. However, Tom Tancredo consistently scores lower than Ron Paul and he was invited. In addition, Ron Paul's rise in internet popularity is nothing less than meteoric. &lt;a href="http://www.pollingreport.com/wh08rep.htm"&gt;http://www.pollingreport.com/wh08rep.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Failor says that they can't alter their lineup for logistical reasons. But he also says they are non-partisan and so they have to invite all candidates - not just Republicans - and they have to account for the possibility that ALL invitees could attend. If that's the case, then clearly, the event could have accommodated many more speakers - the Democrats who were invited but refused.&lt;br /&gt;&lt;br /&gt;Failor tries to say that because they have to put on events that are reflective of what their members want to see, and because only a tiny portion of the response they've gotten has been from Iowans, that they were correct in their exclusion of Ron Paul. But Ron Paul's national popularity does not imply un-popularity in Iowa. It's a logical fallacy, and it doesn't prove anything.&lt;br /&gt;&lt;br /&gt;Failor also tries to say that Ron Paul's supporters exhibiting "fringe-type" behavior shows that Ron Paul is not a serious candidate. He says supporters have called his home phone at all hours and said rude things to his family. But Snyder explains that the campaign only published the already-public contact information from the two groups' websites, and nothing more. Ron Paul's campaign is every bit as credible, based on its behavior, as any other candidate.&lt;br /&gt;&lt;br /&gt;It seems to me this organization should have invited Dr. Paul first and foremost among all candidates, or at least that they should have jumped on the opportunity to get such a great speaker added to their forum. Instead, they've decided to be completely inflexible for a bunch of poor reasons. That's their prerogative, I suppose.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ronpaul2008.typepad.com/ron_paul_2008/2007/06/ron-paul-exclud.html"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/2008_us_elections/Ron_Paul_Excluded_in_Iowa_pt_2_electric_Bugaloo"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-7748314690643653505?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/7748314690643653505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=7748314690643653505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7748314690643653505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7748314690643653505'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/06/ron-paul-excluded-in-iowa-pt-2-electric.html' title='Ron Paul Excluded in Iowa, pt. 2 electric Bugaloo'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-370796679236374210</id><published>2007-05-18T22:24:00.000-05:00</published><updated>2007-05-30T09:25:29.736-05:00</updated><title type='text'>Continuous Integration</title><content type='html'>This is another Agile/XP practice with which I'm fairly happy; although I haven't yet seen it live up to its full potential, that potential is great enough to make me a believer.&lt;br /&gt;&lt;br /&gt;Continuous Integration is a process that completely builds and tests code frequently. The "process" usually takes the form of a dedicated server running special software that continuously performs a series of tasks similar to the following:&lt;br /&gt;(though &lt;a href="http://www.jamesshore.com/Blog/Continuous-Integration-on-a-Dollar-a-Day.html"&gt;apparently this process can be un-automated by using a rubber chicken&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;1. Perform an update from the code repository&lt;br /&gt;2. If changes are found, run a build (compile, test) of the latest code&lt;br /&gt;3. a) If successful, package the latest code for deployment or b) If failure, report failure&lt;br /&gt;&lt;br /&gt;Although I'm a fan of CI, it seems to be a more complicated practice than TDD. Though my experience may be tainted by bad hardware + software on which our CI depends.&lt;br /&gt;&lt;br /&gt;CI requires that you maintain an automated build script. This isn't a tall order amongst Java and other compiled-language developers since projects of any moderate size need an automated build to simply compile and to separate source code from compiled code.&lt;br /&gt;&lt;br /&gt;Interpreted languages are a bit different, though, in that they can usually be tested immediately upon edit. As such, automated build scripts are a bit more un-common for software written in interpreted languages. But most interpreted language software projects of any moderate size do have a consistent process for deployment, even if it's as simple as: make db changes, move files - and most interpreted languages have builders to automated this consistent process. In PHP, &lt;a href="http://tulsaphp.net/node/70"&gt;I've been looking at Phing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;CI is really most helpful when the build process includes a solid test suite. (Defining "solid test suite" is an exercise left to the reader.) With a solid test suite, CI can help you catch bugs earlier than usual because it typically re-runs all those tests after every check-in.&lt;br /&gt;&lt;br /&gt;In addition, CI gives creates a vast sequence of clean builds similar to the "nightly builds" you hear about in open-source projects - a finalized packaged release of the project ready for deployment.&lt;br /&gt;&lt;br /&gt;Finally, if you ensure that your CI platform replicates your target production platform(s), you can use it as a reliable measure of your project's production-platform readiness. This can be a double-edged sword, however - if your CI platform is different than your target production platform, it can give you false confidence of production-readiness, and even cause problems that aren't caught until later in QA or worse, actual production.&lt;br /&gt;&lt;br /&gt;As with TDD, the benefits are not without drawbacks and you should weigh them for your own project before deciding if/which/how Agile practices are adopted. CI has the above benefits, but it is also a fairly complicated development platform for which engineers will be primarily responsible - it sometimes requires a good deal of time and attention to keep going. You still have to judge for yourself if it fits into your project, goals, and style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-370796679236374210?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/370796679236374210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/370796679236374210'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/05/continuous-integration.html' title='Continuous Integration'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-6002044989112756255</id><published>2007-05-16T09:35:00.000-05:00</published><updated>2007-05-16T09:37:29.231-05:00</updated><title type='text'>Yet Another Tutorial</title><content type='html'>Not sure what's come over me. Must be all the Coke ZERO. In any case, &lt;a href="http://tulsaphp.net/node/70"&gt;this tutorial&lt;/a&gt; is a continuation from my previous tutorials to setting up an automated build using Phing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-6002044989112756255?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/6002044989112756255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=6002044989112756255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6002044989112756255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/6002044989112756255'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/05/yet-another-tutorial.html' title='Yet Another Tutorial'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-562967984903589856</id><published>2007-05-15T08:10:00.000-05:00</published><updated>2007-05-15T09:30:27.952-05:00</updated><title type='text'>Test Driven Development</title><content type='html'>I've read a few anti- and pro-Agile rants in the past couple days. Because I'm somewhere in between, I can't really &lt;a href="http://www.answers.com/rant&amp;amp;r=67"&gt;rant&lt;/a&gt; in either direction. Instead what I might try to do is give my opinion on the actual effects I've noticed from some Agile/XP practices on my own coding. Note that I'm probably only picking out the ones I like, so my posts on the subject will betray a pro-Agile bias. But, the sparse number of posts will hopefully balance the scales in demonstrating that there are only so many Agile/XP practices about which I actually care enough to write.&lt;br /&gt;&lt;br /&gt;I'm a fan of Test Driven Development. I don't do TDD 100% of the time, and there are quite a few things I'm not sure how to automatically test (CSS tweaks, anyone?). But I agree with just about all the benefits I read in &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd"&gt;this pro-TDD article&lt;/a&gt;, though I'll re-arrange their listing by my personal opinion of their importance:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;When you follow ... TDD, &lt;i&gt;all your code will be testable by definition!&lt;/i&gt;  And another word for "testable" is "decoupled".  In order to test a module in isolation, you must decouple it.&lt;/blockquote&gt;&lt;br /&gt;When I use TDD, it forces me to write "decoupled" code. "Decoupled" is one of those magic words programmer types say to each other in intellectual flexing competitions. But TDD shows what it really means - code that can be isolated. The benefits of isolated/decoupled code are numerous - re-usability, less duplication, more concise, and I'd also say "testability" is a benefit.&lt;br /&gt;&lt;br /&gt;This is not to say that you have to use TDD to write decoupled code. There are much smarter and more disciplined developers than myself all over who write excellent code without using TDD. But for me personally, TDD forces me into just enough structure and pre-code analysis to keep me from writing messy code that will need cleaning later. Speaking of which ...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Why don't we clean up code that we know is messy? We're afraid we'll break it. But if we have the tests, we can be reasonably sure that the code is not broken, or that we'll detect the breakage immediately. If we have the tests we become fearless about making changes. If we see messy code, or an unclean structure, we can clean it without fear.&lt;/blockquote&gt;&lt;br /&gt;The "safety net" feeling you get from gradually building up a big suite of automated tests is, like all "feelings", impossible to describe, but I'll try to relay an anecdote which might help.&lt;br /&gt;&lt;br /&gt;I still don't consider myself a Java programmer, although I spend at least 50% of my time programming in Java. I don't "feel" comfortable in Java. But, in the course of our development, I made at least one deep and far-stretching re-factoring (more fancy talk for "change the guts of the code without changing its behavior") to maybe 30 different Java source files all over our code-base, with no hesitation before committing. My uncomfortable Java feelings were superseded by my comfort in the fact that all 800+ tests passed after I made the change. So I'm wasn't afraid of making the needed changes, even in a language in which I'm uncomfortable, because all the code was covered.&lt;br /&gt;&lt;br /&gt;Again, this doesn't mean someone can't make sweeping changes unless they have tests covering all their code. I've simply noticed myself indeed becoming more fearless when I myself have to make those kinds of sweeping changes.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Have you ever integrated a third party library into your project? You got a big manual full of nice documentation. At the end there was a thin appendix of examples. Which of the two did you read? The examples of course! That's what the unit tests are!&lt;/blockquote&gt;&lt;br /&gt;This particular benefit is quite a distance behind the previous two. Mostly because the kind of example code you find attached to "nice documentation" is a better reference than unit test code. Unit test code is oftentimes performing some superfluous tricks for isolation, and/or hard to understand. It could be argued that if the test code is hard to follow, the tested code's design is to blame. But I think personally I'd rather move extra verbosity into my test code and keep my productive code clean. Could just be a matter of personal preference.&lt;br /&gt;&lt;br /&gt;However, unit-tests are useful in understanding the intended use of the tested code. And programmers are more likely to spend their time to write test code that benefits themselves (see above) than they are to "waste" their time writing example code which benefits only others. So, lacking the refined, formal example code, unit tests can act as use-case specifications. (&lt;a href="http://www.agiledata.org/essays/tdd.html#Misconceptions"&gt;Though not 100% comprehensive design specs&lt;/a&gt;, as some might say.)&lt;br /&gt;&lt;br /&gt;There are a few anti-TDD points with which I also agree...&lt;br /&gt;&lt;br /&gt;For many, TDD is a new way of programming. As such, it has an associated learning curve, requires new thinking patterns, and takes time before it is comfortable to someone. However, I have found TDD easier and more enjoyable to adopt than Java. Some might say that isn't high praise for TDD, but to those people I would say, "Well, at least it's simpler than Java." TDD can be practiced in the language of your choice, and you will probably find that &lt;a href="http://www.phpunit.de/pocket_guide/3.0/en/test-first-programming.html"&gt;TDD resources from within your preferred language&lt;/a&gt; can really help to match your existing programming style with TDD.&lt;br /&gt;&lt;br /&gt;TDD results in a LOT of code. In the course of &lt;a href="http://tulsaphp.net/node/40"&gt;adding tests for the ZF Tutorial app&lt;/a&gt;, I realized I was adding verbose testing code to already-verbose MVC code. Indeed, the test code for the controller was more code than the controller code itself. This is a simple fact of TDD - more code. There's no getting around it. You simply have to decide if the benefits of TDD outweigh its drawbacks, such as this one.&lt;br /&gt;&lt;br /&gt;We have run into problems where our 800+ test suite takes a significantly long time to run (~10 minutes). This can be a real pain if you're working under strict CI rules in that every change you make, even that pesky css tweak, is supposed to be sent thru that test suite before committing to your source repository. Typically, though, once developers have the hang of TDD, they know what kinds of changes really need the entire test suite, and what kinds of changes can be simply checked-in, or can pass thru only a sub-set of tests. But the pain still exists in that you have an extra step of responsibility between writing your code and committing it. Again, weigh the benefits of TDD against this drawback, maybe come up with a compromise of some kind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-562967984903589856?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/562967984903589856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=562967984903589856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/562967984903589856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/562967984903589856'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/05/test-driven-development.html' title='Test Driven Development'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3074088324561870706</id><published>2007-05-10T20:39:00.000-05:00</published><updated>2007-05-10T20:44:39.380-05:00</updated><title type='text'>More tutorials</title><content type='html'>I've been neglecting my blog, but I've been working on more tutorials:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://tulsaphp.net/node/45"&gt;Tackling the Refactoring challenge&lt;/a&gt; from the &lt;a href="http://akrabat.com/zend-framework-tutorial/"&gt;Getting Started with ZF tutorial&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://tulsaphp.net/node/51"&gt;Selenium Testing with PHPUnit&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3074088324561870706?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3074088324561870706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3074088324561870706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3074088324561870706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3074088324561870706'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/05/more-tutorials.html' title='More tutorials'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-1648879130363634934</id><published>2007-04-25T09:02:00.000-05:00</published><updated>2007-04-30T08:15:52.874-05:00</updated><title type='text'>Controller Testing in Zend Framework</title><content type='html'>Ouch, the previous post here was pretty bad. Messy design and it didn't even work correctly. A better guide on the topic is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tulsaphp.net/?q=node/40"&gt;http://tulsaphp.net/?q=node/40&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-1648879130363634934?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1648879130363634934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/1648879130363634934'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/04/controller-testing-in-zend-framework.html' title='Controller Testing in Zend Framework'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-7178803920497458410</id><published>2007-04-05T13:01:00.000-05:00</published><updated>2007-04-09T11:21:31.800-05:00</updated><title type='text'>More on design patterns</title><content type='html'>Design patterns in the context of frameworks is a nice opportunity for me to take a break from my framework posts. I've been reading a bit on design patterns as a result of that previous post, and &lt;a href="http://tech.groups.yahoo.com/group/tulsaphp/surveys?id=2474898"&gt;the poll activity on the Tulsa PHP Users Group&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In my readings, I came across &lt;a href="http://www.loudthinking.com/arc/000485.html"&gt;this old post from the Loud Thinking blog re: Patterns &amp; Practices over languages&lt;/a&gt;. Good stuff, and I'll recall my related personal experience.&lt;br /&gt;&lt;br /&gt;Before joining SourceForge, I was &lt;span style="font-style: italic;"&gt;okay&lt;/span&gt; in a few languages - Java, ColdFusion, WebMethods (&lt;span style="font-style: italic;"&gt;shudder&lt;/span&gt;), Javascript, SQL, XSL/XPATH - and I was &lt;span style="font-style: italic;"&gt;pretty good&lt;/span&gt; in one language - PHP. The first couple months at SourceForge were simply LOTS of PHP with a bit more architecture than I was used to - caching, entity objects, a Smarty view layer - but not much different than the PHP coding I had always done.&lt;br /&gt;&lt;br /&gt;I was exposed to a pretty sophisticated Java architecture when I joined the Marketplace engineering team. But, my main task initially was to build a few simple wrapper classes that would allow our PHP scripts to communicate with the Java backend over &lt;a href="http://stomp.codehaus.org/"&gt;STOMP&lt;/a&gt; to a message queue system (ActiveMQ, specifically). This would let us continue to write simple (display-oriented) PHP scripts which relied on the sophisticated Java backend for most logic. I still like that idea, and think it can work well if given proper time and attention.&lt;br /&gt;&lt;br /&gt;But as we faced mounting time constraint pressure, and in the interest of leveraging our available talent pool, we stepped away from using STOMP and took out most of the PHP code - save for a proxy-type controller which speaks to the Java app server and some helper classes. We started using the Web MVC module of the Spring framework (in addition to the Core, Testing, Transaction, and Hibernate modules we were already using), and were therefore implementing everything, including display via JSP, in Java. So I poured over &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/index.html"&gt;Spring reference material&lt;/a&gt;. (&lt;a href="http://www.amazon.com/Spring-Action-Craig-Walls/dp/1932394354/ref=pd_bbs_2/002-1640040-5981604?ie=UTF8&amp;s=books&amp;amp;qid=1175816990&amp;sr=8-2"&gt;Highly recommended book&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;It was quite a (beneficial) learning experience for me. As I learned (and accepted) the Spring approach, I found that I started to care less and less about Java - it just happened to be the language in which Spring is written - and I cared more and more about the &lt;em&gt;ways&lt;/em&gt; in which Spring worked.&lt;br /&gt;&lt;br /&gt;Those "ways" are, of course, design patterns. Inversion of Control, Object-Relational Mapping and Active Record, MVC, Front Controller, Command Controllers ... these are all just "ways" of doing certain things, solving certain problems, that are common to many systems. As I said, in learning Spring, I'm appreciating these patterns more than the Java language.&lt;br /&gt;&lt;br /&gt;This is what lessened my resistance to frameworks, so much so that I became a fan of (some of) them! But, still having fondness for PHP, I started looking for PHP frameworks which work in the same &lt;em&gt;ways&lt;/em&gt; that Spring does. But, it has really changed my perspective from analyzing languages based on syntax, (or types, or whatever) to analyzing languages based on the availability of design pattern implementations.&lt;br /&gt;&lt;br /&gt;In this respect, and from my searching, I still think (though it may still be simple bias) that PHP is the best language available for the web. There are &lt;a href="http://www.mustap.com/phpzone_post_73_top-10-php-mvc-frameworks"&gt;many PHP MVC frameworks&lt;/a&gt; (look at all the ones in the comments as well) which implement nearly all the best proven design patterns for the web. There's enough choice out there that PHP engineers can choose not only the design patterns to use, but also between many different &lt;em&gt;styles&lt;/em&gt; of each design pattern. And of course, because PHP is so easy, it doesn't take an "architect" to craft their own style implementation of a favorite design pattern. (like &lt;a href="http://www.phparch.com/issue.php?mid=100"&gt;the Active Record implementation&lt;/a&gt; I referenced in my last post.)&lt;br /&gt;&lt;br /&gt;It was a big step for me to stop focusing on certain languages and instead focus on design patterns. I think it's been a big step upwards in my engineering aptitude/skill/whatever. And the more design patterns I learn, the more I realize there are so many others I &lt;span style="font-style: italic;"&gt;don't&lt;/span&gt; know that could make my programming even easier. Sadly, I'm nowhere near the competence needed to recognize the "informal patterns" (i.e., unnecessary repetition/duplication) in my own code, but hopefully I'll get there.&lt;br /&gt;&lt;br /&gt;For now, I'm still just learning my way into the topic and very glad I have an opportunity to do so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-7178803920497458410?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/7178803920497458410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=7178803920497458410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7178803920497458410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/7178803920497458410'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/04/more-on-design-patterns.html' title='More on design patterns'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-2722191101470599196</id><published>2007-04-02T23:31:00.000-05:00</published><updated>2007-04-03T00:12:11.460-05:00</updated><title type='text'>Frameworks - 10 pounds of Design Patterns in a 5 pound bag (hopefully)</title><content type='html'>I was inspired to write this framework-related post when I read Dirk Merkel's "Practical Active Record in PHP" article from &lt;a href="http://www.phparch.com/issue.php?mid=100"&gt;the latest issue of PHP Architect&lt;/a&gt;. Ironically, I was inspired because the PHP framework I'm most excited about (Zend Framework) has, AFAIK, chosen to use a &lt;a href="http://www.zendframework.com/manual/en/zend.db.table.html"&gt;Table Data Gateway&lt;/a&gt; pattern instead of an Active Record pattern, which I think is not quite as intuitive or easy to use. But a comparison of those two patterns is not only off-topic for this post, but well beyond my analytical qualifications.&lt;br /&gt;&lt;br /&gt;Instead what I'd like to point out is the fact that all good frameworks should help programmers implement good design patterns. Programmers uncomfortable or unclear about frameworks might also be uncomfortable or unclear about design patterns, but design patterns are just ways of expressing common solutions to common problems, and frameworks can help teach good patterns. The web-proven ones that come to my mind first are MVC, Front-Controller, and Active Record, but there are many many more.&lt;br /&gt;&lt;br /&gt;If you want to fully grok the Active Record pattern, you should of course read code &amp;amp; articles - like the article I mentioned above, or perhaps &lt;a href="http://www.devshed.com/c/a/PHP/The-Active-Record-Pattern/"&gt;this article&lt;/a&gt;, or any &lt;a href="http://en.wikipedia.org/wiki/Active_record"&gt;other resource&lt;/a&gt; on the subject. But, since design patterns are common solutions to common problems, you don't want to re-write Active Record code every time you use a database in your applications. Instead, once you know how the Active Record pattern works, you can look for a framework which gives you an implementation of the pattern with an interface you like.&lt;br /&gt;&lt;br /&gt;This is a much better approach to learning design patterns, IMO, than to learn design patterns outside of a framework. I find that resources covering design patterns without a framework tend to be overly abstract. Pattern implementations inside frameworks tend to constrain their context to the framework's intended use. I.e., you can learn much more about MVC theory by first diving into setting up an example &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html"&gt;Spring Web MVC&lt;/a&gt; application than you can by reading &lt;a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html"&gt;an abstract MVC blueprints paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When writing an application with a framework, you might get the feeling that you're dumbing yourself down - that you're relying on the framework too much and therefore becoming dependent on the way it works, or locking yourself into an architecture you don't fully grok and therefore can't fully debug. While that's entirely possible, it's more likely that, given the framework is reputable and has a solid architecture, you're actually relying upon good implementations of well-proven design patterns, and learning all about them in the process. This is not only good for your application, it's good for you as a programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-2722191101470599196?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/2722191101470599196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=2722191101470599196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2722191101470599196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/2722191101470599196'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/04/frameworks-10-pounds-of-design-patterns.html' title='Frameworks - 10 pounds of Design Patterns in a 5 pound bag (hopefully)'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-3661047969955196170</id><published>2007-03-05T21:51:00.000-06:00</published><updated>2007-03-05T22:50:13.025-06:00</updated><title type='text'>frameworks, licenses, etc.</title><content type='html'>I came across this interesting and relevant blurb from &lt;a href="http://weblog.infoworld.com/openresource/archives/2007/03/perspective_on.html"&gt;a Dave Rosenberg post on not using GPL for open source projects&lt;/a&gt;:&lt;br /&gt;&lt;span class="artText"&gt;&lt;blockquote&gt;Spring as GPL wouldn't make a lot of sense, just like SugarCRM as Apache wouldn't make sense. (A very dumbed-down explanation being Apache is for ubiquity whereas GPL is for commercial.)&lt;/blockquote&gt;&lt;/span&gt;&lt;span class="artText"&gt;&lt;/span&gt;I'll take a stab at the fully-fleshed explanation.&lt;br /&gt;&lt;br /&gt;The reason Apache is for ubiquity is because, as a permissive license, it allows the licensee to do more with the software. Most relevant, it allows the licensee to build new software on top of the licensed software - a derivative work - but close-source the new software. This makes Apache-covered (or more generally, permissively-covered) software a suitable selection for a wider audience - those that won't (or can't) return their own contributions to the community AND those that will.&lt;br /&gt;&lt;br /&gt;The reason GPL can be said to be a more commercial-friendly license (from a project admin perspective) is because, as a viral license, it requires that any modifications made by anyone must be returned as open-source software as well. So a potential competitor cannot "steal" your code (it is free for use anyway), but even furthermore, they cannot improve upon your offering without returning those improvements to you as well - competitors will actually help you.&lt;br /&gt;&lt;br /&gt;Now, back to frameworks. Spring, Struts, Tapestry, Google Web Toolkit, Zend Framework, CakePHP, Symfony, Ruby on Rails - all of these use permissive licenses. The reason, of course, is that frameworks are intended to build other software. And that other software won't always be open-source. But it's important for any framework to have a strong and active community in order to enhance the framework itself, so you want ubiquity and popularity over "purity".&lt;br /&gt;&lt;br /&gt;If Spring, or any other framework, were licensed under the GPL, then all software built on top of the framework would also have to be GPL. I won't say that this never makes sense - it could be the framework author's intention that the framework only be used to create more free software. It wouldn't make sense if the author intends for the framework to be used in as many software projects as possible.&lt;br /&gt;&lt;br /&gt;However, most of the frameworks I mentioned are licensed under Apache License, Version 2.0 (or other similar licenses), and apparently &lt;a href="http://www.fsf.org/licensing/licenses/index_html#GPLIncompatibleLicenses"&gt;incompatible with GNU GPL&lt;/a&gt;. This is just another GPL annoyance to me. These frameworks are clearly good free software, and have adopted a widely-used permissive license in order to foster popularity and community participation. I'm all for free software, but when I use any of these frameworks in a free software project, I'll be using a BSD license.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-3661047969955196170?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/3661047969955196170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=3661047969955196170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3661047969955196170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/3661047969955196170'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/03/frameworks-licenses-etc.html' title='frameworks, licenses, etc.'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-4338440793162837544</id><published>2007-02-26T14:54:00.000-06:00</published><updated>2007-02-26T19:12:24.420-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>On Frameworks</title><content type='html'>Sorry for the long hiatus. I've been busy learning and doing things I've never done before, and its those things which I'm going to blog about.&lt;br /&gt;&lt;br /&gt;I've also recently been changing gears as a developer from a scripting-style PHP programmer, to a more OO programmer (Sadly, in Java most of the time). In this transition, I'm starting to warm up to the idea of frameworks. I think I've been around enough to know at least some of the complaints lots of people have with frameworks. Over the next little while on this blog, I might bring a couple of those points up and try to lay out additional perspective on them.&lt;br /&gt;&lt;br /&gt;Today's point:&lt;br /&gt;"Frameworks are just big ugly factory factory factories too abstract and cumbersome to do any good." (&lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12"&gt;example&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;"If you want to develop a simple website with five to ten pages, limited access to a database, and no obligations to ensuring its performance or providing documentation, then you should stick with PHP alone. You wouldn't gain much from a web application framework, and using object orientation or an MVC model would likely only slow down your development process." (&lt;a href="http://www.symfony-project.com/book/trunk/01-Introducing-Symfony#Is%20Symfony%20for%20Me?"&gt;src&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;The above statement from the Symfony manual pretty much lays it out, especially since the example critical article states the scope of the hypothetical project as, "...build a spice rack." For simple projects, OO and Frameworks are over-kill.&lt;br /&gt;&lt;br /&gt;But I think the better metric for determining if a framework is appropriate is not in number of pages (indeed, frameworks often at least double or triple your number of files), but rather in scope of features and depth of functionality.&lt;br /&gt;&lt;br /&gt;In order to determine this, see if you can identify some useful objects in your project at all. Anti-OO heads might correctly argue that objects aren't *required* so there aren't any to identify, whereas OO-heads might correctly say there are objects in every project - which is why I added the "useful" qualifier.&lt;br /&gt;&lt;br /&gt;A useful object, IMO, is an object that reasonably encapsulates properties and behavior - i.e., an object whose properties or behavior will be re-used in multiple areas of the project - the common examples are DB, logging, emailing classes etc.&lt;br /&gt;&lt;br /&gt;Now, if there's only 1 or 2 useful objects (e.g., spice jar and spice rack) in the entire scope of the project, OO is applicable, but maybe unnecessary, and frameworks are counter-productive (they tend to introduce upwards of a dozen or more support objects with which you also have to deal).&lt;br /&gt;&lt;br /&gt;On the other hand, if there are half a dozen useful objects, it is helpful to handle them all in a consistent way so that you can be sure of responsibility scope, standard interfaces, access levels, coding styles, blah blah on every object in the project. OO and frameworks are meant to force you to do this. I think the main point of pain most PHP programmers have with frameworks is that forcing bit, which is what we find cumbersome.&lt;br /&gt;&lt;br /&gt;This doesn't have to be the case. A good framework should align with your own style, and help you adopt OOP quickly and easily, without getting in the way of your non-framework, non-OO code. The framework should be instructional, but unobstrusive. In short, if your experience with frameworks is that they are forcibly cumbersome, check around for a different framework - that's why there are so many options (Zend Framework, CakePHP, and Symfony seem to be the biggies for PHP). When looking at frameworks, read thru their documentation and tutorials - the objects and logic should make sense to you, not confuse you.&lt;br /&gt;&lt;br /&gt;However, you will probably never find The Perfect Framework, unless you write it yourself (bad move). More than likely, you will have to climb the learning curve for some framework, letting it force you to adopt some new coding practices. I think PHP programmers are a bit spoiled in that PHP has such a shallow learning curve that a framework's learning curve seems daunting in comparison. (Contrast this to Java where learning by framework is probably the easiest way to learn Java?) But really, once you grasp the core "Aha!" features of a framework, the rest tends to fall into place.&lt;br /&gt;&lt;br /&gt;Climbing this learning curve is usually the point at which a PHP programmer finds the framework to be too abstract. Why is the Controller class hierarchy 5 levels deep? Why is there an interface defined if it doesn't DO anything? I think the natural inclination of PHP programmers is to try to grok the framework by reading code. This isn't as straight-forward in OO frameworks. There's lots that goes on with OO frameworks which is implicit in the design of the objects (and the mechanisms of OOP) rather than explicit in the code. I would encourage PHP programmers to stick with it - it's necessary to brush up OO skills to fully grok any framework. But again, if you find a certain framework's code and design totally illogical, it's probably not the one for you.&lt;br /&gt;&lt;br /&gt;All I've really done so far is explain WHY frameworks are cumbersome and abstract ... but do they do any good? It's easy to just point to Ruby on Rails as proof that frameworks can be awesome, but I'd also like to point out some of the specific reasons why this is so. (I may explore these in depth later)&lt;br /&gt;&lt;br /&gt;Standardizing your code. This is a biggie, IMO. When you do script-by-script, ad-hoc programming, your mood, caffeine levels, circadian rhythms, or any number of other factors might change the way you write code from minute to minute. This is Very Bad for maintaining the code later on, when you need to change something and realize not only is it duplicated in dozens of locations, but each one has a slight variant in how the code is run, which means you can't just find-replace it all. Ouch.&lt;br /&gt;&lt;br /&gt;Less "plumbing" code. Now this of course relies on the idea that your project NEEDS plumbing code in the first place. Again, if your project is small, it probably doesn't need plumbing code, and adding a framework full of plumbing code slows you down. An example of "plumbing" code is DB-access code. Any object in your project which accesses a database needs it, so it's nice to have a standardized method for doing it. And if you have a dozen objects of your own to write, why not wire them up with a framework's db-access plumbing code.&lt;br /&gt;&lt;br /&gt;Productivity. This is not apparent while first learning the framework, but adopting a framework should boost your productivity. As stated above, you will be writing little (or no) plumbing code, instead focusing on YOUR code responsibilities, and relying on the framework for others.&lt;br /&gt;&lt;br /&gt;Testability. Arguably not a feature of ALL frameworks, but good frameworks tend to employ good OO design, which forces YOU into better OO design, which makes your code testable via mocking objects and the like. This is another one of those things that probably turns PHP programmers off at first, but if they take the time to learn it and do it, the rewards more than make up for it. Writing tests first forces  you to think about how other code will interact with the code you're about to write. And if you continue to write tests, you build up an entire battery of tests which help to keep you from inadvertently introducing bugs in the future. Tests do add some time onto your development, but they give you a great deal of quality, and confidence to modify code down the road.&lt;br /&gt;&lt;br /&gt;That's about it for now. I've actually enjoyed the Spring framework a good deal in my Java work. It inspired me to go looking at ZF, Cake, and Symfony, which I think are also pretty good frameworks for PHP. If and when I need to build a sizeable PHP project of my own, I'm sure I'll be using one of them, or something similar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-4338440793162837544?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/4338440793162837544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=4338440793162837544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4338440793162837544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/4338440793162837544'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2007/02/on-frameworks.html' title='On Frameworks'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116750298474464092</id><published>2006-12-30T11:51:00.000-06:00</published><updated>2006-12-30T12:23:04.796-06:00</updated><title type='text'>Franchising, open source, and "methods of doing business"</title><content type='html'>After reading &lt;a href="http://weblog.infoworld.com/openresource/archives/2006/12/open_source_fra.html"&gt;Asay's post on this subject&lt;/a&gt;, I think this is a great idea, and very pertinent to things we're doing now at &lt;a href="http://sourceforge.net"&gt;SourceForge&lt;/a&gt;. I don't think there's an open-source company out there making this their primary business model. Dual-License, support, merchandising, patronage .... all of these seem to have at least 1 exemplary business - maybe MySQL, Red Hat, Firefox, and Eclipse respectively?&lt;br /&gt;&lt;br /&gt;As he says, this is somewhat present in some of the various open-source certification programs out there, and the single comment on the post asks if franchising is "a &lt;span style="font-style: italic;"&gt;mere&lt;/span&gt; 'Certification program' that entitles a company to provide professional suport/developemnt of a product/service with the support of other vendor/provider. Is my assumption correct?" I think this assumption is only partially correct.&lt;br /&gt;&lt;br /&gt;Franchising is a little bit more - "a method of doing business wherein a franchisor licenses trademarks and &lt;span style="font-style: italic;"&gt;tried and proven methods of doing business&lt;/span&gt; to a franchisee in exchange for a recurring payment, and usually a percentage piece of gross sales or gross profits as well as the annual fees" &lt;a href="http://en.wikipedia.org/wiki/Franchising"&gt;according to Wikipedia&lt;/a&gt;. (emphasis mine) Most (all?) existing open source certification programs are only about tried and proven &lt;span style="font-style: italic;"&gt;technical skills&lt;/span&gt;. One of the biggest lessons the open source software industry is teaching is that "methods of doing business" are much harder, more important, and more valuable to get right, in terms of making money.&lt;br /&gt;&lt;br /&gt;I do think there's room in the community for some big franchising companies, and I think they could really help the uptake and adoption of open source software in many markets. However, I don't think "franchising" is the only method which can inject those "tried and proven methods of doing business" into the open source software community.&lt;br /&gt;&lt;br /&gt;IMHO, this - to provide tried and proven methods of doing business to the open source community - is and should be the mission of SourceForge Marketplace. In our case, we cannot (and should not) "license" the methods, but rather we should provide all the tools necessary for anyone, from a single person to an enterprise, to easily implement any methods they want. If we can do this, it will benefit me, SourceForge, and the open source community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116750298474464092?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116750298474464092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116750298474464092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116750298474464092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116750298474464092'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/12/franchising-open-source-and-methods-of.html' title='Franchising, open source, and &quot;methods of doing business&quot;'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116672630941791716</id><published>2006-12-21T11:59:00.000-06:00</published><updated>2006-12-21T12:39:20.746-06:00</updated><title type='text'>Reports of the death of the Long Tail have been greatly exxagerated.</title><content type='html'>People sure are making a stink about &lt;a href="http://www.readwriteweb.com/archives/long_tail_shrinking.php"&gt;this post&lt;/a&gt; (with a questionable set of data, IMO) which purports to demonstrate that the Long Tail of web traffic is actually shrinking. Nick Carr has an &lt;a href="http://www.roughtype.com/archives/2006/12/sharecropping_t.php"&gt;excellent response&lt;/a&gt; explaining why the Long Tail is not shrinking, but rather, the economic value of the Long Tail is merely concentrating. This all falls within the scope of Anderson's previously asserted effects of the rise of the Long Tail - content aggregators will become (apparently ARE) the biggest winners in the phenomenon.&lt;br /&gt;&lt;br /&gt;I'd like to expand just a bit on his explanation of how Myspace &amp; Facebook are actually Long Tail websites - i.e., they aggregate the Long Tail of millions of personal mini-websites.&lt;br /&gt;&lt;br /&gt;It should also be noted that Google, Yahoo, eBay, and craigslist are other Long Tail websites. Google and Yahoo are built on the long tail of search words (and subsequently related ads!), while eBay and craigslist aggregate the Long Tail of products for sale online.&lt;br /&gt;&lt;br /&gt;So, of the top 9 sites (We all know pogo.com is not really in the top 10, right?), 6 are Long Tail sites? Well, even aol.com can be labeled as a Long Tail website, considering that their &lt;a href="http://www.timesonline.co.uk/article/0,,3-2514320,00.html"&gt;&lt;span style="font-style: italic;"&gt;real&lt;/span&gt; list of top 10 searches&lt;/a&gt; are for those other Long Tail sites.&lt;br /&gt;&lt;br /&gt;That leaves only msn.com and live.com as non-Long Tail sites in the top 10, right? Without the search data from those sites, it's hard to know for sure, but they could likely be similar to AOL - a mere entry point to the other Long Tail kings. Additionally, I've long suspected msn.com sneaks onto the tops of these lists merely for all the visits coming from IE browser users that haven't changed their default home page.&lt;br /&gt;&lt;br /&gt;The Long Tail is NOT shrinking on the web. It's growing and the winners are exactly who was predicted - big-time aggregators.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116672630941791716?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116672630941791716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116672630941791716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116672630941791716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116672630941791716'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/12/reports-of-death-of-long-tail-have.html' title='Reports of the death of the Long Tail have been greatly exxagerated.'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116464706968040267</id><published>2006-11-27T10:34:00.000-06:00</published><updated>2006-11-27T11:04:29.750-06:00</updated><title type='text'>Tivoisation &amp; rational FUD</title><content type='html'>Most of the stuff I've read or listened to from RMS is full of populist rhetoric, which I don't really find interesting. Some of it is priceless, but to me it's not usually worth the effort of sifting thru all the preaching to find the gems.&lt;br /&gt;&lt;br /&gt;However, I very much liked &lt;a href="http://www.fsfeurope.org/projects/gplv3/tokyo-rms-transcript"&gt;his talk from the 5th International GPLv3 conference&lt;/a&gt;. In this one, he seems much more to-the-point. It's a very good explanation of the modifications in GPLv3 and the intentions behind them. (All of which are Noble and Good, but I think some of them are too far-reaching.)&lt;br /&gt;&lt;br /&gt;One such modification/issue is "tivoisation." Stallman spells it out:&lt;br /&gt;&lt;br /&gt;"They [Tivo] provide the users with source code and the users can then modify it and compile it and then install it in the Tivo.  That's where the trouble begins because the Tivo will not run modified versions, the Tivo contains hardware designed to detect that the software has been changed and shuts down.  So, regardless of the details of your modification, your modified version will not run in your Tivo."&lt;br /&gt;&lt;br /&gt;I'm going to make a somewhat personal analogy to explain why I'm okay with the above scenario. I agree it's a reduction of freedom, but I'm okay with that (as I am with just about any other voluntarily-chosen freedom reduction).&lt;br /&gt;&lt;br /&gt;My wife is a budding professional photographer (could be full-out professional if I ever finish her website!). One day I floated the idea to her of giving all of her clients (in addition to photo print packages) all of their photos in digital form on a CD so that they could do whatever they want with them - modify, copy, print, etc. She had a ready and pertinent response...&lt;br /&gt;&lt;br /&gt;If one of her clients had a CD full of high-quality digital photos, and then made crappy modifications and walked down to a crappy photo print shop, they'd have some crappy photos. When one of their friends goes over and sees a bunch of crappy photos, they're bound to ask, "So, who took all these portraits?" and not, "Why do these photos look like crap?"&lt;br /&gt;&lt;br /&gt;So, it's in her best interest NOT to allow modifications and printing - she has rational fear, uncertainty, and/or doubt about giving the digital source files to clients. The same might be said for Tivo. If someone has modified their Tivo box to look like crap, stop working, or whatever ... it reflects badly on Tivo to anyone else who might see that behavior as Tivo's doing. Tivo has rational FUD about giving all that freedom to its customers.&lt;br /&gt;&lt;br /&gt;Like I said, this is not a "maximum-freedom" scenario, and I don't mind that the goal of GPLv3 is to maximize freedom, rather than maximize popularity. But I think GPL zealots would do well to consider that the prevalence of these kinds of situations and motivations induces some people into some legitimate FUD about some GPL stances &amp;amp; clauses. Like, maybe Tivo has more FUD about using GPL in the future, now that they're getting bad rep in the Free Software camp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116464706968040267?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116464706968040267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116464706968040267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116464706968040267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116464706968040267'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/11/tivoisation-rational-fud.html' title='Tivoisation &amp; rational FUD'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116296693508331523</id><published>2006-11-08T00:06:00.000-06:00</published><updated>2006-11-08T01:25:26.776-06:00</updated><title type='text'>The Long Tail (of|and) Open Source Software</title><content type='html'>I've been wanting to write this post for a while now, so it's going to be long, and it's probably going to take a while to finally get it out the door.&lt;br /&gt;&lt;br /&gt;I'm a big fan of &lt;a href="http://www.thelongtail.com"&gt;The Long Tail&lt;/a&gt; - both the book and the blog. Chris Anderson has had a couple of posts dealing with the long tail of software - &lt;a href="http://longtail.typepad.com/the_long_tail/2005/03/the_long_tail_o.html"&gt;one about JotSpot&lt;/a&gt;, and &lt;a href="http://www.thelongtail.com/the_long_tail/2005/09/the_long_tail_o.html"&gt;one about AppExchange&lt;/a&gt;. I agree that both of these companies/products are very much centered on Long Tail software.&lt;br /&gt;&lt;br /&gt;However, I've want to try to make the point that open-source software is very Long Tail-ish, and has actually been so long before these newcomers were even a twinkle in their respective entrepreneurs' eyes. I also want to show how open-source can be a better (maybe the best) platform for Long Tail software. (Though I think both JotSpot and AppExchange are Very Good platforms.)&lt;br /&gt;&lt;br /&gt;One thing I'd like to use in support of my opinion is some actual data...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1146/627/1600/linegraph_tail_1_100.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/1146/627/320/linegraph_tail_1_100.png" alt="" border="0" /&gt;&lt;/a&gt;A nice long tail graph showing the top 100 SourceForge projects, and their total # of downloads on the y-axis. I think this is a crude, yet reasonably accurate, way to show demand for open-source software. Though this graph shows a tail, it is only the top 100, which is actually only the head. I'm using it here to show the SF equivalent to Amazon's "Harry Potter phenomenon" - a couple of super-hits that dominate even the small head of lesser hits. At SF, we call it the "eMule effect."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1146/627/1600/linegraph_tail_3_2000.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/1146/627/320/linegraph_tail_3_2000.png" alt="" border="0" /&gt;&lt;/a&gt;Here I've chopped off the top 2 super-hit projects, and I've expanded the observation window to 2000 projects at once. (I can't go much higher than a 2k window due to technical limitations on the workstation machine I used to create these graphs, and this window size still demonstrates what I want to demonstrate) But notice how the expanded window size, though still small relative to the whole data set, displays a more pronounced tail shape&lt;span style="text-decoration: underline;"&gt;.&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1146/627/1600/linegraph_tail_3_2000.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1146/627/1600/linegraph_tail_2000_2000.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/1146/627/320/linegraph_tail_2000_2000.png" alt="" border="0" /&gt;&lt;/a&gt;Beginning where the previous graph stopped, this one is showing projects ranked 2000-4000. So, while moving down into the tail region of SF projects, the tail-ish nature of the data is starting to smooth out to a more linear demand curve.&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;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1146/627/1600/linegraph_tail_62000_140.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/1146/627/320/linegraph_tail_62000_140.png" alt="" border="0" /&gt;&lt;/a&gt;Here's the end of the tail - all the way out at project rank ~62,000. This is, of course, the essence of The Long Tail - that there is at least SOME amount of demand for even the most niche or obscure products. (I should note, however, that SF.net has 130,000 registered projects. So nearly 50% of the projects have no downloads - most likely because those projects have not released any files ... yet?)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, I think the above data and graphs are sufficient to demonstrate the Long Tail nature of open-source software (assumming SF.net projects are a valid representation of the larger open-source body of software). But why would open-source be a better platform for Long Tail software? To answer that, I'd like to use some of Chris's own ideas.&lt;br /&gt;&lt;br /&gt;For the purposes of this argument, I'm calling the "best" platform whichever platform is most aligned with the 3 forces which add economic and cultural significance of The Long Tail. Because, as these forces work, they maximize the value of all Long Tail consumers.&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Democratization of the tools of production&lt;/span&gt;. This is an easy win for open-source over JotSpot or AppExchange. In both cases, the tools of production are held in the hands of single companies. JotSpot or AppExchange tools are tied to their server, their tag language, etc. For open-source software, &lt;a href="http://www.linux.org/"&gt;nearly&lt;/a&gt; &lt;a href="http://www.apache.org/"&gt;every&lt;/a&gt; &lt;a href="http://www.mysql.com/"&gt;tool&lt;/a&gt; &lt;a href="http://www.postgresql.org/"&gt;you&lt;/a&gt; &lt;a href="http://php.net/"&gt;could&lt;/a&gt; &lt;a href="http://www.python.org/"&gt;ever&lt;/a&gt; &lt;a href="http://www.ruby-lang.org/en/"&gt;need&lt;/a&gt; &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;is&lt;/a&gt; &lt;a href="http://www.eclipse.org/"&gt;totally&lt;/a&gt; &lt;a href="http://sourceforge.net/projects/ajaxmytop"&gt;free&lt;/a&gt;. The tail can be lengthened much faster this way. I doubt JotSpot or AppExchange will have 100k+ &lt;a href="http://www.jot.com/gallery/"&gt;custom&lt;/a&gt; &lt;a href="http://www.salesforce.com/appexchange/"&gt;applications&lt;/a&gt; within 10 years. (Though they don't need to for their more-limited purposes.)&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;Democratizing distribution&lt;/span&gt;. Another easy win for open-source. All JotSpot or AppExchange products are married to that distribution channel. And in those cases, it isn't simply "the internet" - it's specifically those application domains on the internet. If you want more access to those niche products, you're locked into the JotSpot or Salesforce.com distribution channel. Not so with open-source, which can &lt;a href="http://www.java.net/"&gt;be&lt;/a&gt; &lt;a href="http://code.google.com/hosting/"&gt;found&lt;/a&gt; &lt;a href="http://www.tigris.org/"&gt;in&lt;/a&gt; &lt;a href="http://www.freshmeat.org/"&gt;many&lt;/a&gt; &lt;a href="http://sourceforge.net/"&gt;places&lt;/a&gt;, and isn't locked into any of them. I wonder how far one would get trying to take their AppExchange software product solo before Salesforce.com sued?&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Connecting Supply and Demand&lt;/span&gt;. The only force in which open-source is not a clear winner, and therefore, IMO, the most pressing need facing the open-source community. However, I would point out that neither JotSpot nor AppExchange have demonstrated an ability to perform this well, given the tiny sizes of their "tails" - JotSpot with only 8 add-on applications, and AppExchange with only 400.&lt;br /&gt;&lt;br /&gt;So, trite but true: 2 out of 3 isn't bad.&lt;br /&gt;&lt;br /&gt;And I think it should be publicized how open-source software has already created and sustained a Long Tail of software for many many years now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116296693508331523?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116296693508331523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116296693508331523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116296693508331523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116296693508331523'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/11/long-tail-ofand-open-source-software.html' title='The Long Tail (of|and) Open Source Software'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116251030289906731</id><published>2006-11-02T17:11:00.000-06:00</published><updated>2006-11-02T18:05:03.946-06:00</updated><title type='text'>Windows EULA</title><content type='html'>Okay, just so people don't get the idea that I'm a supporter of Microsoft-style EULA's (though I'm also not a big supporter of GPL-style EULA's)...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.winsupersite.com/showcase/winvista_licensing.asp"&gt;Paul Thurrott&lt;/a&gt; is a man, just like you, except he has roots and fronds because he is also a &lt;a href="http://www.answers.com/topic/plant-2"&gt;plant&lt;/a&gt;. (Thanks to &lt;a href="http://www.penny-arcade.com/2006/10/02"&gt;Tycho&lt;/a&gt; for that word-play)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://btetc.blogspot.com/2006/11/eulas.html"&gt;Matt is funny and accurate&lt;/a&gt; as usual, so I'll continue on from Matt's thoughts.&lt;br /&gt;&lt;br /&gt;Paul uses the same tactic with the other "newer, bigger than ever!" restrictions...Re: "Windows Transfer Rights" he says:&lt;br /&gt;&lt;blockquote&gt;What's more amazing is that &lt;span style="font-weight: bold;"&gt;the number of people who actually try to do this is incredibly small&lt;/span&gt;. Since you can't transfer a copy of Windows that comes with a new PC anyway, &lt;span style="font-weight: bold;"&gt;less than 10 percent of all Windows licenses&lt;/span&gt; are transferable at all. And of those, &lt;span style="font-weight: bold;"&gt;only a tiny percentage of users&lt;/span&gt; have ever tried to even transfer a Windows license once. The only people that really need to do this regularly are hardcore PC enthusiasts who change their machine configurations regularly. In short, this new restriction isn't all that new and it won't affect any &lt;span style="font-weight: bold;"&gt;mainstream&lt;/span&gt; users.&lt;/blockquote&gt;&lt;br /&gt;To me, this just highlights the fact that Microsoft really doesn't give a crap about "developers, developers, developers, developers" anymore. Try calling up Microsoft with a technical programming support question sometime. We had a problem with .Net Framework for Windows CE a couple years back and when our main .Net engineer called MS, they basically said, "Tough. We'll try to get around to it in the next service pack."&lt;br /&gt;&lt;br /&gt;I also like his similar "rebuttal" to the "Adding and removing PC components" issue.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Fewer than 5 percent of PC users ever open a PC case&lt;/span&gt; let alone perform major hardware surgery. But if you're one of those guys who regularly upgrades your PC's hardware, you'll be happy to hear that instances of forced reactivation because of hardware upgrades are less frequent under Vista than they were under XP&lt;span style="font-style: italic;"&gt;.&lt;/span&gt; More to the point, this is another one of those issues that &lt;span style="font-weight: bold;"&gt;only affects a tiny, tiny percentage of Windows users&lt;/span&gt;.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;More to &lt;span style="font-style: italic;"&gt;Paul's point&lt;/span&gt; - new restrictions aren't really restrictions because most Windows users won't be affected. Uh, sure .... that makes &lt;a href="http://www.nizkor.org/features/fallacies/appeal-to-popularity.html"&gt;all kinds of sense&lt;/a&gt;. Maybe thousands of developers, power-users, and enthusiasts are small in comparison to the entire Windows user-base ... but that doesn't really change the fact that these new restrictions are indeed that - restrictions.&lt;br /&gt;&lt;br /&gt;I also have to rip into Paul for the notion that hardware upgrades are less frequent under Vista than Windows XP. I don't think he and I have been reading the &lt;a href="http://www.bit-tech.net/news/2005/09/07/vista_hardware_reqs/"&gt;same&lt;/a&gt; &lt;a href="http://www.tgdaily.com/2006/10/27/dell_2gb_vista/"&gt;industry&lt;/a&gt; &lt;a href="http://smallbusiness.itworld.com/4383/nls_networking061005/page_1.html"&gt;comments&lt;/a&gt;. So maybe it's not Vista's shiny new algorithm, but the fact that most Vista users (at least 90% are OEM, remember) users will have to buy a new computer just to run Vista?! Again, that's just &lt;a href="http://www.nizkor.org/features/fallacies/questionable-cause.html"&gt;a whole bundle of sense&lt;/a&gt; from Mr. Thurrott.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116251030289906731?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116251030289906731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116251030289906731' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116251030289906731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116251030289906731'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/11/windows-eula.html' title='Windows EULA'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116170350733409226</id><published>2006-10-24T09:55:00.000-05:00</published><updated>2006-10-24T10:28:42.400-05:00</updated><title type='text'>Matt Asay agrees with me</title><content type='html'>He didn't even know this, but Matt Asay and I agree that the freedom(BSD) &gt; freedom(GPL). Matt sums up nicely what I've &lt;a href="http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116131535541350788"&gt;been&lt;/a&gt; &lt;a href="http://www.blogger.com/comment.g?blogID=10160217&amp;amp;postID=116076949626927528"&gt;writing&lt;/a&gt; recently:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="artText"&gt;Forcing people to share's one's version of freedom is not...free.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="artText"&gt;This is exactly how I feel. And some people might say, "Well, that's fine. But how can we all co-exist with differing versions of freedom?" And to that I would say, by having the kind of &lt;a href="http://www.aipla.org/"&gt;legal system&lt;/a&gt; which enables a &lt;a href="http://creativecommons.org/about/licenses/meet-the-licenses"&gt;variety of contracts which convey those different freedoms and stipulations over our creations&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some bonus cherries with this approach is that people are dynamic. Their values and opinions are in a constant state of flux. Many (most?) people tailor their principles to match circumstances. Under the variety-of-contracts system, people can use different contracts at different times on different projects for different purposes. Like Asay thinks of the GPL, I think a CC-BY-NC-SA licensed product is &lt;a href="http://www.linuxdevices.com/articles/AT4528760742.html"&gt;like a bomb for a (would-be) competitor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="artText"&gt;So someone can tactically employ CC-BY-NC-SA and CC-BY-ND simultaneously to create a dual-license business model. Imagine that - more variety among licensing principles and terms makes good business sense.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116170350733409226?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116170350733409226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116170350733409226' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116170350733409226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116170350733409226'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/10/matt-asay-agrees-with-me.html' title='Matt Asay agrees with me'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116131535541350788</id><published>2006-10-19T22:22:00.000-05:00</published><updated>2006-10-19T23:54:52.130-05:00</updated><title type='text'>fun followup</title><content type='html'>As a fun followup to my previous post, I thought I'd illustrate the same point using this very cool Creative Commons &lt;a href="http://creativecommons.org/about/licenses/comics1"&gt;comic&lt;/a&gt;. After reading the comic, you should have a clearer idea of what the CC licenses are all about, right? In addition, I like the spectrum perspective shown in the opening and closing panels, as well as the 2nd-to-last panel explaining "Public Domain."&lt;br /&gt;&lt;br /&gt;So here are the (rough) analogies I draw:&lt;br /&gt;&lt;br /&gt;Copyright =&gt; Copyright EULA's&lt;br /&gt;CC:Share-Alike =&gt; GPL, EUPL, etc.&lt;br /&gt;Public Domain =&gt; LGPL, etc.&lt;br /&gt;&lt;br /&gt;As I see it (and maybe Creative Commons sees it...?), &lt;span style="font-style: italic;"&gt;Public Domain&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;and not GPL&lt;/span&gt;, is the extreme opposite of Copyright. With that in mind, my order of preference is from most-free to least-free:&lt;br /&gt;&lt;br /&gt;1. Public Domain, LGPL, etc.&lt;br /&gt;2. GPL, EUPL, etc.&lt;br /&gt;3. Copyright, &lt;a href="http://wendy.seltzer.org/blog/archives/2006/10/19/forbidding_vistas_windows_licensing_disserves_the_user.html"&gt;Windows Vista License&lt;/a&gt;, etc.&lt;br /&gt;&lt;br /&gt;Addition:&lt;br /&gt;&lt;br /&gt;I also just read a &lt;a href="http://www.freesoftwaremagazine.com/blogs/debian_and_the_creative_commons"&gt;descriptive scenario&lt;/a&gt; whereby new CCPLv3-SA licenses are incapable of ENFORCING their copyleft doctrine down the chain of recipients.&lt;br /&gt;&lt;br /&gt;See, if I was Sam, I would just put work A into public domain and stop worrying about it. And if first recipient, Dave, wraps it in TPM, creating d[A], then that's Dave's work now. 2nd-recipient Bob may like d[A] more, but it's up to Dave to give him permission to modify d[A]. Bob can always come get A from me with no strings attached.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116131535541350788?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116131535541350788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116131535541350788' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116131535541350788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116131535541350788'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/10/fun-followup.html' title='fun followup'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-116076949626927528</id><published>2006-10-13T14:07:00.000-05:00</published><updated>2006-10-16T15:05:20.786-05:00</updated><title type='text'>closing [loopholes|business models] in OS licenses</title><content type='html'>I started out by reading  &lt;a href="http://weblog.infoworld.com/openresource/archives/2006/10/the_eupl_a_lice.html"&gt;Matt Asay's take on the EUPL&lt;/a&gt;. And I read just about every article or post to which he linked. Asay says that the GPL, for better or worse, "leaks like a sieve." I can only conclude from his statement, "I really like the way it [EUPL] closes the ASP loophole without closing off everything else, as well" that Matt dislikes at least the ASP "loophole" in the GPL.&lt;br /&gt;&lt;br /&gt;(Disclosure: As an employee of SourceForge.net, I am dependent on an ASP model, like Google's or Yahoo's, for my livelihood.)&lt;br /&gt;&lt;br /&gt;But I'd fall into the camp which thinks the "leakiness" of the GPL is a positive rather than a negative. In fact, I think even the GPLv2 is a bit too strict for my liking. As I understand it, when you distribute (old-school) any software which you received under a GPLv2 license, &lt;span style="font-style: italic;"&gt;you must &lt;/span&gt;license your own modifications under GPLv2. Emphasis added to stress this point - any mechanism that sets up a "you must _____" condition places an inhibition on the recipient, not a freedom.&lt;br /&gt;&lt;br /&gt;Apparently, the HPL, EUPL, and GPLv3 take this same inhibition and make it even more invasive. Under these, when you "communicate" (new-school) any software which you received, &lt;span style="font-style: italic;"&gt;you must&lt;/span&gt; license all of your own modifications under the same license. The "communicate" term is defined in every license (or an equivalent principle is established) to prevent a person or corporation from using such licensed software to distrubte services (&lt;a href="http://en.wikipedia.org/wiki/Software_as_a_Service"&gt;SaaS&lt;/a&gt;) without releasing all their own modifications or enhancements to the software.&lt;br /&gt;&lt;br /&gt;I'm fine with these kinds of licenses, I suppose. I just don't happen to share this kind of perspective - feeling betrayed or cheated if someone enhances my software but doesn't give their stuff back to me. IMO, &lt;span style="font-style: italic;"&gt;their&lt;/span&gt; work and labor went into those enhancements so I'm fine with them licensing &lt;span style="font-style: italic;"&gt;their&lt;/span&gt; stuff however they want. I rest easy knowing &lt;a href="http://sourceforge.net/projects/ajaxmytop"&gt;my stuff&lt;/a&gt; will always be LGPL and (theoretically) usable by anyone. I'll admit this a pretty individualistic perspective. But then isn't the open-source community just made up of individuals. Why do we need someone like the EU or FSF to tell us how to feel, or what's best for ourselves?&lt;br /&gt;&lt;br /&gt;I think the majority of people in the open-source community don't mind that Google and Yahoo (and SourceForge) modify some open-source software but don't distribute all those modifications when they "communicate" that software via their SaaS websites. Combine that with the fact that some of these extra-invasively-viral(?) licenses prevent other business models besides just the ASP one, and I can't imagine these licenses will be very popular. (Indeed, GPLv3 has already been ranted upon by more than a couple open-source supporters.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-116076949626927528?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/116076949626927528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=116076949626927528' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116076949626927528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/116076949626927528'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/10/closing-loopholesbusiness-models-in-os.html' title='closing [loopholes|business models] in OS licenses'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115872744316377771</id><published>2006-09-19T22:31:00.000-05:00</published><updated>2006-09-19T23:44:03.263-05:00</updated><title type='text'>open source revenue</title><content type='html'>I ended up reading &lt;a href="http://blogs.zdnet.com/open-source/?p=790"&gt;this post&lt;/a&gt; because it talked about SourceForge (albeit the Enterprise software).&lt;br /&gt;&lt;br /&gt;First, I don't agree that "serious" numbers are "multi-billion dollar" numbers. For one thing, of the 120k active information industry corporations which filed tax returns in 2002, only 264 of them received $0.25 billion or more in that year. (&lt;a href="http://www.irs.gov/pub/irs-soi/02co05nr.xls"&gt;source&lt;/a&gt;) Personally, I can only think of 5 software giants which actually break into billions in terms of annual revenue - Microsoft, Oracle, SAP, Electronic Arts, BEA. There are probably some others but I'd be willing to bet it's no more than a dozen or maybe two dozen.&lt;br /&gt;&lt;br /&gt;So one point I would make is that software revenue doesn't have to be concentrated in order to be serious. After all, the 119,476 information corporations that make &lt;$50 million per year (under which VA Software falls) can account for, very roughly, $188 billion of annual revenue.&lt;br /&gt;&lt;br /&gt;The second point I would make is that the nature of open-source is such that its value is hard to quantify with $. Different people may value an open-source software package at $1 or at $200 or at $2,000. But they all pay $0 for it, so it's hard to measure the value, but it's obviously not 0. I realize this has nothing to do with revenue, but recognition of this fact is a prerequisite to building a good open-source business model, which has everything to do with revenue.&lt;br /&gt;&lt;br /&gt;Finally, one goal of open-source is to lower the cost of software to users. In principle then, open-source companies &lt;span style="font-style: italic;"&gt;shouldn't&lt;/span&gt; be as big as proprietary software counterparts. The goal of open-source is to grow the economic pie while at the same time requiring a smaller slice for the software industry. This is directly opposite to proprietary software which desires more and more money to pour into the software industry - whether or not the economic pie is growing at all.&lt;br /&gt;&lt;br /&gt;Basically, revenue-focused analysis is not simple in the open-source world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115872744316377771?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115872744316377771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115872744316377771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115872744316377771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115872744316377771'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/09/open-source-revenue.html' title='open source revenue'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115747676626553096</id><published>2006-09-05T11:19:00.000-05:00</published><updated>2006-09-06T17:55:16.050-05:00</updated><title type='text'>(some) economics of open-source</title><content type='html'>Either fittingly or surprisingly, I came across a great blurb re: economics of open-source while reading &lt;a href="http://www.amazon.com/Long-Tail-Future-Business-Selling/dp/1401302378/sr=8-1/qid=1157473191/ref=pd_bbs_1/002-7840217-3240025?ie=UTF8&amp;amp;s=books"&gt;The Long Tail&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;George Gilder:&lt;br /&gt;&lt;blockquote&gt;In every industrial revolution, some key factor of production is drastically reduced in cost. Relative to the previous cost to achieve that function, the new factor is virtually free. Physical force in the industrial revolution became virtually free compared to its expense when it derived from animal muscle power and human muscle power. Suddenly you could do things you could not afford to do before. You could make a factory work 24 hours a day churning out products in a way that was just incomprehensible before the industrial era. ... The whole economy had to reorganize itself to exploit this physical force. You had to "waste" the power of the steam engine and its derivatives in order to prevail...&lt;/blockquote&gt;From there, Chris picks up:&lt;br /&gt;&lt;blockquote&gt;That suggests a way to put this in an economic context. If the abundant resources are just one factor in a system otherwise constrained by scarcity, they may not challenge the economic orthodoxy. They are then like learning curves and minimized transaction costs - drivers of production efficiency that serve to lower prices and increase productivity but do not invalidate the laws of economics.&lt;/blockquote&gt;So, how about open-source?&lt;br /&gt;&lt;br /&gt;The open-source "revolution" has, among other things, made a factor of production virtually free - software programs. It costs someone somewhere maybe $0.000001 to produce another copy of &lt;a href="http://sourceforge.net/projects/ajaxmytop"&gt;ajaxMyTop&lt;/a&gt; and send it to another user. But, Information Technology and Information Systems (effective ones) involve more than just software programs. Open-source does not invalidate the laws of economics in IT.&lt;br /&gt;&lt;br /&gt;In light of this, there are 2 very different lessons to take away.&lt;br /&gt;&lt;br /&gt;For those who think open-source is economically infeasible, the analogy demonstrates that thriving markets can and do operate on virtually free goods. It merely takes some learning to understand where and how to charge money.&lt;br /&gt;&lt;br /&gt;For those who think open-source is just a first sign of an inevitable economic reversals, the analogy shows that economic principles continue to hold. It is rather market actors and their perceptions which are upheaved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115747676626553096?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115747676626553096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115747676626553096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115747676626553096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115747676626553096'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/09/some-economics-of-open-source.html' title='(some) economics of open-source'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115747051634107542</id><published>2006-09-05T10:32:00.000-05:00</published><updated>2006-09-05T10:35:16.350-05:00</updated><title type='text'>MST3K is back!</title><content type='html'>One thing superior about &lt;a href="http://www.rifftrax.com"&gt;this approach&lt;/a&gt; is that Mike can do any movie he wants to since he's not re-distributing any copyrighted material. It actually works pretty well. I set the laptop on the coffee table, start the DVD, and then start the mp3 when Mike says so. What a great mash-up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115747051634107542?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115747051634107542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115747051634107542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115747051634107542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115747051634107542'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/09/mst3k-is-back.html' title='MST3K is back!'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115731969374461097</id><published>2006-09-03T16:25:00.000-05:00</published><updated>2006-09-03T16:41:33.773-05:00</updated><title type='text'>Camino is fired. Firefox is re-hired.</title><content type='html'>Okay, while I admit it's very cool to &lt;a href="http://www.caminobrowser.org/images/screenshots/desktop_screenshot.jpg"&gt;browse the web with a native Mac-style interface&lt;/a&gt;, I can never go back to using &lt;a href="http://www.caminobrowser.org/support/faq/#gen_exten"&gt;a browser without plugins&lt;/a&gt;. I mean, even IE7 supports &lt;a href="http://www.ieaddons.com/default.aspx?cid=home&amp;scid=0"&gt;add-ons&lt;/a&gt;. Camino is the kind of project that only an Apple &lt;a href="http://www.answers.com/myrmidon&amp;amp;r=67"&gt;myrmidon&lt;/a&gt; would (or can!) love. There's absolutely NO way to justify tossing plugin architecture out of a product just so you can get the spiffy razzle-dazzle of Mac OS X inside your browser.&lt;br /&gt;&lt;br /&gt;So while I'm easily an Apple convert (I have bluetooth'd an Apple logo over to my Razr to serve as my mobile wallpaper), I'm not a zealot.&lt;br /&gt;&lt;br /&gt;P.S. I'm not sure why I don't use Safari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115731969374461097?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115731969374461097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115731969374461097' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115731969374461097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115731969374461097'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/09/camino-is-fired-firefox-is-re-hired.html' title='Camino is fired. Firefox is re-hired.'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115671932368473277</id><published>2006-08-27T17:45:00.000-05:00</published><updated>2006-08-27T17:55:24.013-05:00</updated><title type='text'>Technorati?</title><content type='html'>I must be the last blogger on earth to register at Technorati...but here it goes anyway.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.technorati.com/claim/8ejr9av22y" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115671932368473277?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115671932368473277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115671932368473277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115671932368473277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115671932368473277'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/08/technorati.html' title='Technorati?'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115638296409370407</id><published>2006-08-23T20:29:00.000-05:00</published><updated>2006-08-23T20:29:24.600-05:00</updated><title type='text'>Ghost in the shell | Free Software Magazine</title><content type='html'>&lt;a href="http://www.freesoftwaremagazine.com/node/1713"&gt;&lt;cite&gt;Ghost in the shell | Free Software Magazine&lt;/cite&gt;&lt;/a&gt;: "&lt;blockquote&gt;For centuries we have relied on books and other external memories, but the Internet, through the ease of searching, has invaded our actual thought processes. There are things I think I know, but I don't. What I know is how to instantly retrieve them when my global external memory is attached. As I become reliant on this kind of extended identity, losing my Internet connection is like a lobotomy�I feel an almost physical sense of loss as a portion of my intelligence is removed. I've become dependent on a new brain center that isn't located inside of my body.&lt;/blockquote&gt;"&lt;br /&gt;&lt;br /&gt;I'll admit I was just surfing around looking for something to blog when I came along this. It really struck a chord with me. I'm an internet-addicted &lt;a href="http://en.wikipedia.org/wiki/Cyberpunk"&gt;cyberpunk&lt;/a&gt;. And I'm a huge fan of &lt;a href="http://en.wikipedia.org/wiki/Ghost_in_the_Shell:_Stand_Alone_Complex"&gt;Ghost in the Shell&lt;/a&gt;, and I recently read &lt;a href="http://www.amazon.com/gp/product/0226096270/sr=8-2/qid=1156382093/ref=pd_bbs_2/002-7196699-8021634?ie=UTF8"&gt;Synthetic Worlds by Edward Castranova&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think it's obvious that our online identities are inextricably linked with our physical identities. But not just because our physical selves use physical interfaces to act as our virtual counterpart. Like Terry points out, when we use an interface so much, the boundaries between self, interface, and "avatar" start to blur. Sometimes even so much so that the online avatar feels more real than we ourselves feel at times.&lt;br /&gt;&lt;br /&gt;In any case, this was also a test of a &lt;a href="https://addons.mozilla.org/firefox/1941/"&gt;nifty firefox extension&lt;/a&gt; I came across for blogging. I'll be testing a couple of these soon so there might be a few more random posts in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115638296409370407?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115638296409370407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115638296409370407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115638296409370407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115638296409370407'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/08/ghost-in-shell-free-software-magazine.html' title='&lt;cite&gt;Ghost in the shell | Free Software Magazine&lt;/cite&gt;'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115523979315263953</id><published>2006-08-10T14:50:00.000-05:00</published><updated>2006-08-10T14:56:33.163-05:00</updated><title type='text'>Software Engineer, SourceForge.net</title><content type='html'>I have accepted a job offer from &lt;a href="http://sourceforge.net"&gt;SourceForge.net&lt;/a&gt;. I'm thrilled to death. This is basically my dream job. I won't say anything else beyond that until I get with them re: blogging etiquette. Hopefully I'll blog a little more frequently since I'll have cooler activities to blog about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115523979315263953?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115523979315263953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115523979315263953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115523979315263953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115523979315263953'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/08/software-engineer-sourceforgenet.html' title='Software Engineer, SourceForge.net'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115409341992558639</id><published>2006-07-28T08:30:00.000-05:00</published><updated>2006-07-28T18:10:13.683-05:00</updated><title type='text'>GoogleForge ?</title><content type='html'>&lt;a href="http://code.google.com/p/ajaxmytop/"&gt;http://code.google.com/p/ajaxmytop/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Couple first impressions:&lt;br /&gt;&lt;br /&gt;Easy and simple to set up and get going.&lt;br /&gt;Clean, simple, easy interface for creating issues.&lt;br /&gt;Project blog is nice. (Edit: but apparently broken?)&lt;br /&gt;No support for file-releases other than Subversion?&lt;br /&gt;No ability to upload screenshots?&lt;br /&gt;&lt;br /&gt;I'll be playing with it some more to try it out.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/hosting/"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/software/Google_Code_Hosting_Project"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115409341992558639?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115409341992558639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115409341992558639' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115409341992558639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115409341992558639'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/googleforge.html' title='GoogleForge ?'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115401712082324398</id><published>2006-07-27T11:15:00.000-05:00</published><updated>2006-07-27T11:18:40.843-05:00</updated><title type='text'>ajaxmytop</title><content type='html'>I've been trying to work more on &lt;a href="http://sourceforge.net/projects/ajaxmytop"&gt;ajaxMyTop&lt;/a&gt; recently to smoothe some of my nervousness and anxiety from the last few weeks (source of which I'll reveal soon).&lt;br /&gt;&lt;br /&gt;It's pretty nice to get back into it, but it's always frustrating when you're trying to improve something that already works, because you end up breaking it before improving it. I'm trying to move the filtering to occur before sorting so that the sorting process has fewer records to sort. But now I've broken the filtering and can't quite figure out why. I need a better way to debug the PHP side of things in Eclipse...&lt;br /&gt;&lt;br /&gt;That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115401712082324398?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115401712082324398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115401712082324398' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115401712082324398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115401712082324398'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/ajaxmytop.html' title='ajaxmytop'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115377583951440501</id><published>2006-07-24T16:17:00.000-05:00</published><updated>2006-07-24T16:17:19.560-05:00</updated><title type='text'>HOWTO: Debug Javascript in IE</title><content type='html'>Posted this to digg. I'm having an IE-only javascript problem and I found this useful for debugging purposes.&lt;br /&gt;&lt;br /&gt;It's fairly laughable, though expected, that you have to have an upgraded version of Office to get a pretty basic tool.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.jonathanboutelle.com/mt/archives/2006/01/howto_debug_jav.html"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/programming/HOWTO_Debug_Javascript_in_IE"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115377583951440501?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115377583951440501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115377583951440501' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115377583951440501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115377583951440501'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/howto-debug-javascript-in-ie.html' title='HOWTO: Debug Javascript in IE'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115323886279025557</id><published>2006-07-18T11:00:00.000-05:00</published><updated>2006-07-18T11:07:42.800-05:00</updated><title type='text'>javascript woes</title><content type='html'>I've been complaining about some javascript stuff lately. Specifically, the way javascript drops "this" variable scope when making asynchronous (XMLHttpRequest) calls, and apparently also when using setTimeout() or setInterval() functions. Even though nobody reads this blog, they might stumble upon it when searching and hopefully in the future, &lt;a href="http://www.manning-sandbox.com/thread.jspa?threadID=15545&amp;amp;tstart=0"&gt;these&lt;/a&gt; &lt;a href="http://groups.yahoo.com/group/ydn-javascript/message/3038"&gt;links&lt;/a&gt; will point to possible solution(s).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115323886279025557?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115323886279025557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115323886279025557' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115323886279025557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115323886279025557'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/javascript-woes.html' title='javascript woes'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115315020427534361</id><published>2006-07-17T10:30:00.000-05:00</published><updated>2006-07-17T10:30:04.376-05:00</updated><title type='text'>SUSE Linux Enterprise Desktop 10</title><content type='html'>Novell has released SUSE Linux Enterprise Desktop 10. I'm going to try this out very soon because I think Novell &amp; SUSE are doing very well w/r/t usability and user-experience. In that respect, they're emulating Apple's approaches and designs, which r4wk.&lt;br /&gt;&lt;br /&gt;It features integrated search via Beagle, and a 3d-accelerated desktop environment via Xgl. Only downside is that SUSE is always pretty large (5 CD's!), so it always takes me a long time to get a version downloaded and burned. I really need to get a DVD-burner.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.theolympian.com/apps/pbcs.dll/article?AID=/20060716/BUSINESS/607160310"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/linux_unix/Novell_s_new_Linux_ready"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115315020427534361?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115315020427534361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115315020427534361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115315020427534361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115315020427534361'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/suse-linux-enterprise-desktop-10.html' title='SUSE Linux Enterprise Desktop 10'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115290066437255085</id><published>2006-07-14T13:11:00.000-05:00</published><updated>2006-07-14T13:11:04.416-05:00</updated><title type='text'>Dear Google, I need an iMac</title><content type='html'>After writing a blog post titled â��Dear Google, Youâ��re Giving Me a Headacheâ��, Google sent the author a small pack of acetaminophen, with a message saying "I hope this helps you keep up with the many Adwords changes."&lt;br /&gt;&lt;br /&gt;I think an iMac would really contribute to my Google experiences. My wife is looking to start a photography business and I'd like to see if I can experimenting with iPhoto + Picasa to make a website where she can sell photos.&lt;br /&gt;&lt;br /&gt;Or something.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.marketingpilgrim.com/2006/07/dr-google-sends-pain-relief.html"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/tech_news/Google_sends_blogger_aspirin_after_complaining_about_Google_headaches"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115290066437255085?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115290066437255085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115290066437255085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115290066437255085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115290066437255085'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/dear-google-i-need-imac.html' title='Dear Google, I need an iMac'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-115282143697141651</id><published>2006-07-13T15:10:00.000-05:00</published><updated>2006-07-13T15:10:37.010-05:00</updated><title type='text'>ClickTale</title><content type='html'>It's a closed beta, but it LOOKS like a pretty sweet product/service. And a good excuse to re-test the integration of my digg account with my blogger account.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.clicktale.com"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/tech_news/Webmasters_Can_Watch_What_Visitors_Do_with_AJAX-based_Service"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-115282143697141651?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/115282143697141651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=115282143697141651' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115282143697141651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/115282143697141651'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2006/07/clicktale.html' title='ClickTale'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-111236647178164892</id><published>2005-04-01T08:41:00.000-06:00</published><updated>2005-04-01T08:41:11.780-06:00</updated><title type='text'>Mark Cuban on Grokster</title><content type='html'>the mass of sites, comments, blog links, etc. that crop around these issues are making me start to think that the old "people are stupid" argument is weakening.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.gelfmagazine.com/mt/archives/mark_cuban_on_grokster.html"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/technology/Mark_Cuban_on_Grokster"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-111236647178164892?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/111236647178164892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=111236647178164892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/111236647178164892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/111236647178164892'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2005/04/mark-cuban-on-grokster.html' title='Mark Cuban on Grokster'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-111231500858737089</id><published>2005-03-31T18:23:00.000-06:00</published><updated>2005-03-31T18:23:28.586-06:00</updated><title type='text'>digg adds blogging features</title><content type='html'>so my blog will now basically be a luke-filtered digg site.&lt;br /&gt;&lt;br /&gt;New to digg today: the ability to digg stories to your blog.  Choose a story that you wish to blog, then click "blog". digg will instantly post that story to your website.  If you donÃ¢ï¿½ï¿½t like the way a story is worded, you also have the ability to rewrite your blog post.  Supported blogs:  Typepad, Live Journal, Blogger, Moveable Type, and WordPress. (note: you must be a registered user to see these features)&lt;br&gt;&lt;br&gt;&lt;a href="http://digg.com/digg_news/digg_adds_blogging_features_"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/digg news/digg_adds_blogging_features_"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-111231500858737089?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/111231500858737089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=111231500858737089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/111231500858737089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/111231500858737089'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2005/03/digg-adds-blogging-features.html' title='digg adds blogging features'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-110599577143822559</id><published>2005-01-17T15:02:00.000-06:00</published><updated>2005-01-17T15:02:51.436-06:00</updated><title type='text'>free mini mac</title><content type='html'>I want one, if just to play with OS X.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.FreeMiniMacs.com/?r=14082520"&gt;http://www.FreeMiniMacs.com/?r=14082520&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-110599577143822559?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/110599577143822559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=110599577143822559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110599577143822559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110599577143822559'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2005/01/free-mini-mac.html' title='free mini mac'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-110598090277248189</id><published>2005-01-17T10:55:00.000-06:00</published><updated>2005-01-17T10:55:02.773-06:00</updated><title type='text'>MySQL CEO: Open source &amp; MySQL will rise, legal foes will fall</title><content type='html'>&lt;a href="http://searchenterpriselinux.techtarget.com/originalContent/0,289142,sid39_gci1044527,00.html"&gt;MySQL CEO: Open source &amp; MySQL will rise, legal foes will fall&lt;/a&gt;. interview with Mickos...how can you go wrong?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-110598090277248189?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/110598090277248189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=110598090277248189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110598090277248189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110598090277248189'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2005/01/mysql-ceo-open-source-mysql-will-rise.html' title='MySQL CEO: Open source &amp; MySQL will rise, legal foes will fall'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10160217.post-110573803894506418</id><published>2005-01-14T15:27:00.000-06:00</published><updated>2005-01-14T15:28:40.826-06:00</updated><title type='text'>$bluke-&gt;start();</title><content type='html'>You should all already be using Firefox, and &lt;a href="https://addons.update.mozilla.org/extensions/moreinfo.php?application=firefox&amp;version=1.0&amp;amp;os=Windows&amp;amp;category=Blogging&amp;numpg=10&amp;amp;id=261"&gt;This Extension&lt;/a&gt; started this blog, so you know it's good.&lt;br /&gt;&lt;br /&gt;as opposed to my WS-RandomThoughts, now at &lt;a href="http://ws-comments.blogspot.com/"&gt;WS-Comments&lt;/a&gt;, this one IS going to be completely random, short posts about all kinds of things I find on the internet that interest me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10160217-110573803894506418?l=bluke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bluke.blogspot.com/feeds/110573803894506418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10160217&amp;postID=110573803894506418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110573803894506418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10160217/posts/default/110573803894506418'/><link rel='alternate' type='text/html' href='http://bluke.blogspot.com/2005/01/bluke-start.html' title='$bluke-&gt;start();'/><author><name>luke</name><uri>http://www.blogger.com/profile/04844724534003766952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Fa_U5q7fBBY/S4WwsiK-U7I/AAAAAAAAAGY/jiFli64uNmY/S220/luke_clover_aquarium.jpg'/></author><thr:total>0</thr:total></entry></feed>
