<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUAEQ3g9fSp7ImA9WxNXFk4.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854</id><updated>2009-10-03T22:21:42.665-07:00</updated><title>Step Three: Profit!</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.stepthreeprofit.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>30.292424</geo:lat><geo:long>-97.73856</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><link rel="self" href="http://feeds.feedburner.com/StepThreeProfit" type="application/atom+xml" /><feedburner:emailServiceId>StepThreeProfit</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CEQBRXg5eyp7ImA9WxJTE0g.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-1737593846208182623</id><published>2009-04-21T13:49:00.000-07:00</published><updated>2009-04-21T15:19:14.623-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T15:19:14.623-07:00</app:edited><title>The Truth About Consumer Bandwidth Pricing</title><content type="html">There's been a lot of noise made recently about Time Warner instituting bandwidth caps. Everyone was angry at Time Warner, whereas Time Warner claims it's losing money because of a few people hogging all the bandwidth, that usage based pricing is more fair and also necessary to pay for building up their networks, and that all of this BitTorrent traffic and streaming video is killing their networks and needs to be capped.&lt;br /&gt;&lt;br /&gt;I have an inside perspective on this matter because when I was the Director of Product Management at BitTorrent, we often spoke with ISPs. We knew that Comcast was throttling BitTorrent traffic far before it made it into the news and I flew down to Comcast headquarters in Philadelphia to discuss the situation. I was suprised when the told me that they had plenty of bandwidth and that BitTorrent wasn't anywhere close to crushing their network. Their problem was that they don't want to sell bandwidth, a comodity with a price racing to zero. They want to sell entertainment services, which have a higher profit margin. They are therefore threatened by online video as it competes with cable TV.&lt;br /&gt;&lt;br /&gt;The consumer ISP strategy thus has a twofold purpose: raise the price of bandwidth, and at the same time make the Internet a less appealing way to watch video. Both of these purposes are accomplished by bandwidth caps. Additionally, the new pricing models make it complicated to determined how much you're going to be paying exactly for bandwidth, allowing the ISPs to increase prices covertly. If they were to just declare that prices were going up because they felt like it, people would be very angry indeed, and it might lead to government regulation of pricing.&lt;br /&gt;&lt;br /&gt;In order to unravel the mystery of the new pricing models, I've made some graphs that show how much you will pay in dollars for a number of total gigabytes transferred in a month. I was very suprised by the results.&lt;br /&gt;&lt;br /&gt;To start, here is a graph of a lot of different plans, such as various Time Warner plans, AT&amp;amp;T DSL, and the main 3G mobile carriers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=400x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,300%7C1,0,141660&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088,ffff00,00ffff,ff00ff&amp;amp;chdl=ATTEVDO%7CSprintEVDO%7CTWCBC%7CTWCLite%7CATT%7CComcast%7CAmazonS3%7CVerizonEVDO%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C60,60,60,60,60,540,1020,1500,1980,2460,7260,12060,16860,21660,33660,45660,69660,93660,117660,141660%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C60,60,60,60,60,110,160,210,260,310,810,1310,1810,2310,3560,4810,7310,9810,12310,14810%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C15,17,19,21,23,25,27,29,31,33,53,73,90,90,90,90,90,90,90,90%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250%7C43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C0.085,0.255,0.425,0.595,0.765,0.935,1.105,1.275,1.445,1.615,3.315,5.015,6.715,8.415,12.665,16.915,25.415,33.915,42.415,50.915%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C60,60,60,60,60,340,620,900,1180,1460,4260,7060,9860,12660,19660,26660,40660,54660,68660,82660%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,125,150,150,150&amp;amp;chds=1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660,1,300,0.085,141660" /&gt;&lt;br /&gt;&lt;br /&gt;On the bottom is gigabytes and on the left is dollars. Yes, dollars. 300 GB would costs you $140,000 on AT&amp;amp;T 3G. You'll notice that only the 3G providers show up at all, everything else being squished into a single line on the bottom. This is because while Time Warner is charges overages of $1/GB, Sprint is charging $50/GB, Verison $280/GB, and AT&amp;amp;T a ridiculous $480/GB after you exceed the 5GB cap. Everyone is mad about the Time Warner caps, but it's really the 3G caps that are totally insane. Every iPhone user is on AT&amp;amp;T, so when Hulu for iPhone comes out it's going to be crazy.&lt;br /&gt;&lt;br /&gt;So don't use more than 5G of 3G per month or else you're getting ripped off. Let's compare some ISPs just in the 1-5G range to see how they stack up.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,5%7C1,0,150&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088,ffff00&amp;amp;chdl=TWCLite%7CATT%7CComcast%7CAmazonS3%7CAnyEVDO%7CTWCBC%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5%7C15,17,19,21,23%7C1,2,3,4,5%7C80,80,80,80,80%7C1,2,3,4,5%7C43,43,43,43,43%7C1,2,3,4,5%7C0.085,0.255,0.425,0.595,0.765%7C1,2,3,4,5%7C60,60,60,60,60%7C1,2,3,4,5%7C150,150,150,150,150%7C1,2,3,4,5%7C75,75,75,75,75&amp;amp;chds=1,5,0.085,150,1,5,0.085,150,1,5,0.085,150,1,5,0.085,150,1,5,0.085,150,1,5,0.085,150,1,5,0.085,150" /&gt;&lt;br /&gt;&lt;br /&gt;Amazon S3 is included here at the bottom just to show how much more expensive consumer bandwidth is than hosting bandwidth. The bottom tier of Time Warner service is a clear winner here, following by the original capper Comcast. 3G services are in the middle, with premium tier cable and DSL services losing. In this bandwidth bracket, you don't really get much benefit from upgrading your service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now let's look at ISP choices excluding 3G.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,300%7C1,0,150&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088&amp;amp;chdl=TWCLite%7CATT%7CComcast%7CAmazonS3%7CTWCBC%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C15,17,19,21,23,25,27,29,31,33,53,73,90,90,90,90,90,90,90,90%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250%7C43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C0.085,0.255,0.425,0.595,0.765,0.935,1.105,1.275,1.445,1.615,3.315,5.015,6.715,8.415,12.665,16.915,25.415,33.915,42.415,50.915%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,125,150,150,150&amp;amp;chds=1,300,0.085,150,1,300,0.085,150,1,300,0.085,150,1,300,0.085,150,1,300,0.085,150,1,300,0.085,150" /&gt;&lt;br /&gt;&lt;br /&gt;The lowest Time Warner tier wins again if you lose little bandwidth, and then Comcast wins everything else up to 250G where they have put a hard cap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now let's look in depth at just the Time Warner tiers.&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,300%7C1,0,150&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088&amp;amp;chdl=TWCLite%7CTWCStandard%7CTWCSuperLite%7CTWCBC%7CTWCSuperTurbo%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C30,30,30,30,30,30,30,30,30,30,40,50,60,70,95,105,105,105,105,105%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C43,43,43,43,43,43,43,43,43,43,43,43,43,53,78,103,118,118,118,118%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C15,17,19,21,23,25,27,29,31,33,53,73,90,90,90,90,90,90,90,90%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,125,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100,150,200,250,300%7C55,55,55,55,55,55,55,55,55,55,55,55,55,55,70,95,130,130,130,130&amp;amp;chds=1,300,0,150,1,300,0,150,1,300,0,150,1,300,0,150,1,300,0,150,1,300,0,150" /&gt;&lt;br /&gt;&lt;br /&gt;The graph is interesting because Time Warner imposes an overage fee cap of $75. This causes the lowest tier to come out best for both low and high numbers of gigabytes. The lowest tier charges $15/month for 1GB and $2/GB for each additional GB, up to $75 in overages, meaning that your total bill is capped at $90. You therefore get unlimited bandwidth for $90 with that plan. Whereas their highest tier plan is $75 for 100 GB and then $1/GB after that up to $75 in overage charges. You get unlimited bandwidth for $150 with this plan. So the lowest tier wins and the highest tier loses. The middle tiers only come into play for medium amounts of bandwidth.&lt;br /&gt;&lt;br /&gt;So, let's look at medium amounts of bandwidth where the multiple tiers come into play.&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,100%7C1,0,150&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088&amp;amp;chdl=TWCLite%7CTWCStandard%7CTWCSuperLite%7CTWCBC%7CTWCSuperTurbo%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C30,30,30,30,30,30,30,30,30,30,40,50,60,70,95,105%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C43,43,43,43,43,43,43,43,43,43,43,43,43,53,78,103%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C15,17,19,21,23,25,27,29,31,33,53,73,90,90,90,90%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,100%7C55,55,55,55,55,55,55,55,55,55,55,55,55,55,70,95&amp;amp;chds=1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150" /&gt;&lt;br /&gt;&lt;br /&gt;This graphs shows a situation similar to the one pitched by Time Warner. There are multiple tiers and you get the best deal by choosing the right tier for the amount of bandwidth you use. However, note that the goal is not to avoid overages. The goal is to avoid having your overage charges cost more than the monthly charge of the next plan up. So while the lowest tier only includes 1GB/month, it's the best plan up to around 10GB/month. Similarly, the standard plan will be better than an upgrade up to 50GB/month. The highest tier is only good for people that use &gt;80 GB/month. And Time Warner Business Class is, as shown on all of the graphs, always just a terrible deal.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It was just discovered that AT&amp;amp;T DSL is implementing bandwidth caps. They have a different model because they don't have a cap on overage fees. That sounds like it would probably be a worse deal than Time Warner. Let's take a look, first at just the different AT&amp;amp;T DSL tiers.&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,100%7C1,0,100&amp;amp;chco=ff0000,00ff00,0000ff,888800&amp;amp;chdl=ATTPro%7CATTBasic%7CATTElite%7CATTExpress&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C30,30,30,30,30,30,30,30,30,30,30,30,30,30,45,50,60,70%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C20,20,20,20,20,20,20,20,20,20,20,30,40,50,75,80,90,100%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,45,55%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C25,25,25,25,25,25,25,25,25,25,25,25,25,35,60,65,75,85&amp;amp;chds=1,100,0,100,1,100,0,100,1,100,0,100,1,100,0,100" /&gt;&lt;br /&gt;&lt;br /&gt;This is the more classical model that you'd expect with overages. Since there are no caps on overage fees, you get the best deal by choosing a plan matched to your usage. If you guess incorrectly, you overpay. The ordering of plans from cheapest to most expensive becomes inverted from low usage to high usage.&lt;br /&gt;&lt;br /&gt;Now let's compare the various AT&amp;amp;T DSL plans to the various Time Warner cable plans.&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x300&amp;amp;cht=lxy&amp;amp;chxt=x,y&amp;amp;chxr=0,1,100%7C1,0,150&amp;amp;chco=ff0000,00ff00,0000ff,888800,008888,880088,ffff00,00ffff,ff00ff&amp;amp;chdl=TWCSuperLite%7CTWCBC%7CTWCLite%7CATTExpress%7CTWCStandard%7CATTPro%7CATTBasic%7CATTElite%7CTWCSuperTurbo%7CTWCTurbo&amp;amp;chd=t:1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C15,17,19,21,23,25,27,29,31,33,53,73,90,90,90,90,90,90%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C30,30,30,30,30,30,30,30,30,30,40,50,60,70,95,100,105,105%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C25,25,25,25,25,25,25,25,25,25,25,25,25,35,60,65,75,85%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C43,43,43,43,43,43,43,43,43,43,43,43,43,53,78,83,93,103%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C30,30,30,30,30,30,30,30,30,30,30,30,30,30,45,50,60,70%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C20,20,20,20,20,20,20,20,20,20,20,30,40,50,75,80,90,100%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,45,55%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75%7C1,2,3,4,5,6,7,8,9,10,20,30,40,50,75,80,90,100%7C55,55,55,55,55,55,55,55,55,55,55,55,55,55,70,75,85,95&amp;amp;chds=1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150,1,100,0,150" /&gt;&lt;br /&gt;&lt;br /&gt;There are a lot of lines on this graph, but you only need to look at the bottom. The lowest tier of Time Warner again wins for low bandwidth. After than, successive AT&amp;amp;T DSL plans win. Despite the fact that their pricing structure is worse, their actual prices are better than Time Warner as long as you're good at guessing how much bandwidth you're going to use. If you're bad at guessing, only the lowest two tiers of Time Warner could ever possibly be better than AT&amp;amp;T DSL and only for a small range of usage. So if you're bad at guessing your usage, your best bet is to get the highest tier of AT&amp;amp;T DSL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was suprised by the outcome of these charts. The Time Warner caps are not that big of a deal and the AT&amp;amp;T caps are even less of a big deal. What you really need to watch out for is the 3G caps. Those are just totally off the rails.&lt;br /&gt;&lt;br /&gt;The best deal for consumer Internet is AT&amp;amp;T DSL, even with the caps and overage fees. If you know how much bandwidth you're going to use, buy the appropriate tier. If you don't know how much bandwidth you're going to use, you're safest buying the highest tier.&lt;br /&gt;&lt;br /&gt;If you're going to go with Time Warner, the lower tiers are a better deal. Go with the lowest tier you can and only upgrade if your overage fees are costing you more than the next tier. Never buy the highest tier or business class, they are ripoffs.&lt;br /&gt;&lt;br /&gt;3G is a terrible deal. If you use less than 5G a month, all the 3G providers are priced the same and are not a very good deal for Internet. Use the lowest tier of Time Warner instead. Under no circumstances use more than 5G of 3G in a month, you will get ripped off big time.&lt;br /&gt;&lt;br /&gt;Also, Hulu for iPhone is going to be a train wreck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-1737593846208182623?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=POp6456dnhQ:024nXNbY3fo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=POp6456dnhQ:024nXNbY3fo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=POp6456dnhQ:024nXNbY3fo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/POp6456dnhQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/1737593846208182623/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=1737593846208182623" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/1737593846208182623?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/1737593846208182623?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/POp6456dnhQ/truth-about-consume-bandwidth-pricing.html" title="The Truth About Consumer Bandwidth Pricing" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2009/04/truth-about-consume-bandwidth-pricing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEARX0-fip7ImA9WxVWF0s.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-3138449478825990202</id><published>2009-02-27T12:06:00.000-08:00</published><updated>2009-02-27T12:47:24.356-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-27T12:47:24.356-08:00</app:edited><title>Diakonos: A Programmer's Text Editor in Ruby</title><content type="html">A text editor (or for some an IDE) is the most important tool a programmer has, other than the programming language itself. Religious wars over editors are inevitable because people spend so much time with their editor. Some people flip-flop, but many people become both functionally and emotionally attached. No one wants to spend time learning new keybindings when they could be programming instead.&lt;br /&gt;&lt;br /&gt;Personally, I use nano. This is not out of ignorance, mental damage, or a deep moral perversion as my friends that use emacs and vi insist. I want an editor which is small and quick to install. It must be available on all platforms and easy to install (if there's no Debian/Ubuntu package in the main repositories, forget it). I'm not going to mess around with configuring it. And I basically just don't like vi. So nano has been winning the war for my soul for many years. However, like all programmers, I dream of a better world. I wouldn't mind a slightly (or even somewhat) better editor, but I everything I've ever tried lacked the beautiful simplicity of nano. With more features comes more hassle.&lt;br /&gt;&lt;br /&gt;Then I found &lt;a href="http://purepistos.net/diakonos/"&gt;Diakonos&lt;/a&gt;. It's a console-based text editor (which I like because I ssh into my server and edit things as much as I edit them locally), and it's written in Ruby. It has the modern features, such as multiple buffers, syntax highlighting, and syntax-aware indentation. It's scriptable, either through the Ruby interface or through external programs (in any language) which are fed the old buffer on stdin and output new buffer contents on stdout.&lt;br /&gt;&lt;br /&gt;Like all editors under my consideration, it has &lt;a href="http://purepistos.net/diakonos/"&gt;packages&lt;/a&gt; in the main repositories of both Debian and Ubuntu. It also has Windows and OS X binaries (also a Ruby gem for you Ruby guys). It's as quick and easy to install as nano, and through it has lots more features, they are not obtrusive. The &lt;a href="http://wiki.purepistos.net/doku.php?id=Diakonos:Getting-Started"&gt;keybindings&lt;/a&gt; are the "standard" Windows-style ones (ctrl-x cut, ctrl-c copy, ctrl-v paste). You can of course configure it to emacs or whatever style you want, but I am personally happy to use a similar set of keys across my editor and web browser.&lt;br /&gt;&lt;br /&gt;I am particularly excited about finally having an editor that's not written in C. This is a personal issue. Many people like C, but I just think it's time for us to move on as a society. I have a T-shirt that says "I would code in C for love, but not for money." While you may love C, autoconf, and make, I am personally very excited about an editor both written in and scriptable in Ruby. It seems like a step towards the future. It's also nice to have a fresh codebase which doesn't inherit several decades of design decisions.&lt;br /&gt;&lt;br /&gt;My apologies for insulting your favorite text editors and programming languages, my Internet friends. I meant no harm. Just check out &lt;a href="http://purepistos.net/diakonos/"&gt;Diakonos&lt;/a&gt; for a bit and see what you think. It has a feel which is both fresh and yet somehow also classic. A "modern classic" if you will. And it's fun. In a way I can't really articulate, it's just enjoyable to use. Also, the author is a really nice guy and the IRC channel isn't full of obnoxious jerks (#mathetes on freenode), just good folks like you and me, hacking on code. I'll see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-3138449478825990202?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=5J901cSkhvA:fPuOd286hhc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=5J901cSkhvA:fPuOd286hhc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=5J901cSkhvA:fPuOd286hhc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/5J901cSkhvA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/3138449478825990202/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=3138449478825990202" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3138449478825990202?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3138449478825990202?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/5J901cSkhvA/diakonos-programmers-text-editor-in.html" title="Diakonos: A Programmer's Text Editor in Ruby" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2009/02/diakonos-programmers-text-editor-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MCR305fip7ImA9WxVWEUs.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-761418093048309331</id><published>2009-02-20T10:55:00.000-08:00</published><updated>2009-02-20T14:37:46.326-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-20T14:37:46.326-08:00</app:edited><title>Startup Camp Austin, Feb 28th</title><content type="html">Next Saturday, Feb 28th, from 1pm-6pm, is the second annual Startup Camp Austin!&lt;br /&gt;&lt;br /&gt;Last year's Startup Camp Austin was pretty great. A lot has changed since then in the Austin Startup Scene. It's really quite booming. With events like SXSW Accelerator and the CapitalFactory application deadline coming up at the beginning of March, we decided that now was a good time to get together again and talk about the ongoing developments of interest to Austin startups.&lt;br /&gt;&lt;br /&gt;There are still a few slots left, so if you'd like to do a presentation, pitch, or demo, or lead a roundtable discussion, &lt;a href="http://barcamp.org/StartupCampAustin"&gt;sign up on the wiki&lt;/a&gt; and I'll save you a slot in the program. Also feel free to just add discussion topics and we can discuss whatever anyone feels like discussing.&lt;br /&gt;&lt;br /&gt;Also, please RVSP on the &lt;a href="http://www.facebook.com/home.php#/event.php?eid=51278069210"&gt;Facebook event&lt;/a&gt; so that we know how much food to provide.&lt;br /&gt;&lt;br /&gt;I have to say, I'm pretty excited about this camp. The first Startup Camp was kind of scary because we'd never put on an Unconference before and I had just moved back to Austin and started my own startup. I really wanted to help make Austin a great place for startups, but it was just one person's dream. Since then, things have become so exciting! There are lots of events for startups now, from SD2020 to SXSW Accelerator. There are several new experiments in funding going on, including a startup incubator and a startup organized as a coop. Coworking spaces and BarCamps have become hot items, sprouting up in Dallas, Houston, and San Antonio as well. So many of my friends have lost or quit their jobs due to the economic turmoil and instead of feeling down about it have decided that now is a great time to start a startup. It's really a very optimistic time for startup entrepreneurs as we see opportunities in every problem.&lt;br /&gt;&lt;br /&gt;So if you're currently at a startup, are interested in starting one, or just curious about how things are going in the Austin startup community, come to the ACTLab next Saturday. It's located on the UT Campus in the Communications Building (CMB) on the 4th floor, in Studio 4B. The Communications Building is on the southeast corner of Dean Keaton and Guadalupe, across from Madam Mam's. There's a parking lot right across the street (south of Madam Mam's) which is usually $6 to park all day.&lt;br /&gt;&lt;br /&gt;I hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-761418093048309331?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=gc4aXxSZP0Y:Ms9PX5O7eyk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=gc4aXxSZP0Y:Ms9PX5O7eyk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=gc4aXxSZP0Y:Ms9PX5O7eyk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/gc4aXxSZP0Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/761418093048309331/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=761418093048309331" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/761418093048309331?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/761418093048309331?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/gc4aXxSZP0Y/startup-camp-austin-feb-28th.html" title="Startup Camp Austin, Feb 28th" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2009/02/startup-camp-austin-feb-28th.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQCQns7fip7ImA9WxVQE0k.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-6593952008544207259</id><published>2009-01-30T09:34:00.000-08:00</published><updated>2009-01-30T10:32:43.506-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T10:32:43.506-08:00</app:edited><title>Austin Gets Its Own Startup Incubator</title><content type="html">I love having a startup in Austin. I think it's a great place to do a startup right now. At the Tech Happy Hour last night, one early stage investor likened Austin to a gasoline soaked pile of rags just waiting for a spark. Indeed!&lt;br /&gt;&lt;br /&gt;For a while I've felt that the missing element in the Austin startup scene is an early stage, small investment startup incubator in the spirit of &lt;a href="http://ycombinator.com/"&gt;Y Combinator&lt;/a&gt; and &lt;a href="http://www.techstars.org/"&gt;TechStars&lt;/a&gt;. Austin is a great place to bootstrap, and angel and VC funding are available, but for many young entrepreneurs the best way to get started is with a startup incubator. You get to meet people with startup experience, you get to pitch, and you get some press. It's one of the best ways to get started, especially if you're on the engineering side and you need to meet people with business experience.&lt;br /&gt;&lt;br /&gt;Austin finally has such a venture, and it's called &lt;a href="http://capitalfactory.com/"&gt;Capital Factory&lt;/a&gt;. You can read their &lt;a href="http://www.prweb.com/releases/2009/01/prweb1935684.htm"&gt;press release&lt;/a&gt; to get the sales pitch, but let me just break down the numbers for you. If you're one of the three companies picked, you get $20,000 for 5%, giving you a $380,000 valuation, which is comparable or slightly better than YC and TechStars in terms of valuation. There are of course many intangibles to compare between the various incubators, but it basically comes down to where you want to start your company: the Bay Area, Boulder, or Austin. For myself, I choose Austin!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;They're also still looking for a few good investor-mentors, so if you want to help the Austin startup scene and you've got some time and money to invest, check them out. I can't wait until pitch day to see what new startups are started!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-6593952008544207259?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=vHObxueYq1I:0Emk0i72wZU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=vHObxueYq1I:0Emk0i72wZU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=vHObxueYq1I:0Emk0i72wZU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/vHObxueYq1I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/6593952008544207259/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=6593952008544207259" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6593952008544207259?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6593952008544207259?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/vHObxueYq1I/austin-gets-its-own-startup-incubator.html" title="Austin Gets Its Own Startup Incubator" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2009/01/austin-gets-its-own-startup-incubator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ANQXw_fCp7ImA9WxVRGUQ.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-2462772863469387049</id><published>2009-01-23T10:48:00.000-08:00</published><updated>2009-01-26T11:56:30.244-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-26T11:56:30.244-08:00</app:edited><title>P2P Money with App Engine, OAuth, and QR Codes</title><content type="html">In honor of National Service Day, I decided to take a day off from my regularly scheduled &lt;a href="http://ringlight.us/"&gt;Ringligh&lt;/a&gt;t hacking and work on some community service hacking. In Austin we have a complimentary currency called the &lt;a href="http://www.austintimeexchange.org/"&gt;Austin Time Exchange Network&lt;/a&gt; (ATEN). There's a lot to say about &lt;a href="http://en.wikipedia.org/wiki/Complementary_currency"&gt;complimentary currency&lt;/a&gt; and its role in helping economies during a downturn. However, I want to delve mainly into the technical details of my hack, so if you're interested I recommend &lt;a href="http://www.amazon.com/Future-Money-Creating-Wealth-Wiser/dp/0712699910/ref=sr_1_5?ie=UTF8&amp;amp;s=books&amp;amp;qid=1232738278&amp;amp;sr=8-5"&gt;Bernard Lietaer&lt;/a&gt;. The basic idea is that you can pay people for their time in ATEN currency, denominated in hours, rather than dollars. This is quite good for situations where no one has dollars they want to spend, but they do have work they want to do and get done, such as the current economy. There's no shortage of needs or workers, only a shortage of money. So let's make our own money! Problem solved! You'll still use dollars to pay taxes, your mortgage, and Wal-Mart, but you can use ATEN hours to buy local goods and services from people in Austin that accept this currency.&lt;br /&gt;&lt;br /&gt;The goal of this project, named &lt;a href="http://www.austintimemachine.org/"&gt;Austin Time Machine&lt;/a&gt; (ATM) is to provide a means to withdraw electronic currency into a physical paper form (cash) and later deposit paper to an electronic account. This is particularly useful for the sorts of situations which are normally "cash only", for instance festivals where it's unreasonable to expect all of the booths to have computers and Internet. Since the paper currency is backed by a separate online currency (in this case &lt;a href="http://www.opensourcecurrency.org/"&gt;OpenSourceCurrency.org&lt;/a&gt;), the ATM service doesn't need to manage things like account balance. It only needs to keep track of bill serial numbers and manage authentication to the "bank" so that it can transfer credits to and from user accounts.&lt;br /&gt;&lt;br /&gt;So on to the technical details. The first interesting bit is that &lt;a href="http://www.opensourcecurrency.org/"&gt;OpenSourceCurrency.org&lt;/a&gt; supports &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt; for authenticating users. Additionally, I implemented the whole service on &lt;a href="http://code.google.com/appengine/"&gt;App Engine&lt;/a&gt;, which is wonderful because I don't have to run it on my server or manage uptime. However, this meant that I had to port the &lt;a href="http://oauth.googlecode.com/svn/code/python/oauth/"&gt;python OAuth library&lt;/a&gt; to use the App Engine API. In particular, I had to replace all of the use of httplib with &lt;a href="http://code.google.com/appengine/docs/python/urlfetch/"&gt;App Engine's urlfetch service&lt;/a&gt;. This code will be useful to anyone attempting to authenticate to external services from inside an App Engine application. This app also provides a handy example of how to write an OAuth client. It's a little bit more complicated than it needs to be, but it's not that bad if you use an OAuth library to generate the signatures and such. It's basically involves just POSTing some fields to a few URLs and providing callback URLs that the website will POST back to. You pass some tokens around this way and end up with a token which, when included in a call to whatever web service you're trying to access, will serve to authenticate you as acting on the behalf of the user.&lt;br /&gt;&lt;br /&gt;The next component of the app is the storage of serial numbers when you withdraw bills and verification of serial numbers when you deposit. Nothing particularly exciting here. I created an &lt;a href="http://code.google.com/appengine/docs/python/datastore/"&gt;App Engine Model&lt;/a&gt; for each bill and save and access them using the standard App Engine ORM API. This is worth checking out if you haven't used App Engine before though because it's a simple example of how it works, and it's very different than SQL. Basically you need to assign a unique (string) key to each object and this is how you access them. The mechanisms you might except from SQL such as the UNIQUE keyword are absent.&lt;br /&gt;&lt;br /&gt;With all of the nitty gritty storage and OAuth stuff taken care of, the bulk of the application is very simple. OpenSourceCurrency.org is a Rails app and so exposes a simple REST and JSON (or XML) API to do transactions. There are a couple of gaps in the API (from the perspective of this particular app) which I work around in this code. The API only lets you transfer money &lt;span style="font-weight: bold;"&gt;from&lt;/span&gt; the current user to a specified destination user, and you need the userid of the destination user. For withdrawl it's easy, I transfer money from the authenticated user to my own account, since I happen to know my userid. For deposit, I perform a tricky manuever. I charge the user a 0.1 hour fee, transferring it from their account to mine just like in a withdrawl. The result of that call includes their userid in the JSON output. I then take that userid and have the ATM service log into my own account (specifying credential via HTTP Auth, not OAuth) and transfer from my account to the account of the user, specified by their userid. A bit complicated! However, I'm working with &lt;a href="http://herestomwiththeweather.blogspot.com/"&gt;Tom Brown&lt;/a&gt;, creator of the OpenSourceCurrency.org API, to create a simpler API.&lt;br /&gt;&lt;br /&gt;Finally, once you've made a withdrawl, the bill needs to be generated so you can print it. This is currently done with just a little bit of HTML. A PDF export would be nice for printing multiple bills on one page, but for the prototype HTML was of course the fastest. The QR code generation turned out to be extremely simple because the &lt;a href="http://code.google.com/apis/chart/"&gt;Google Chart API&lt;/a&gt; recently added QR code support. So the QR code is just a single HTML img tag with a URL which will automatically generate a QR code. Nice!&lt;br /&gt;&lt;br /&gt;Feel free to play this all this stuff. Check out &lt;a href="http://blip.tv/file/get/Herestomwiththeweather-StupidCurrencyTricksOAuthAndQRCode777.flv"&gt;Tom's screencast on using the ATM&lt;/a&gt;, &lt;a href="http://www.austintimemachine.org/"&gt;the live ATM site&lt;/a&gt;, and of course the &lt;a href="http://blanu.net/atm/"&gt;source code&lt;/a&gt; (also available as a &lt;a href="http://blanu.net/atm.zip"&gt;zip&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-2462772863469387049?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=Sm1sgyax2R0:v2xkSCGVe0w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=Sm1sgyax2R0:v2xkSCGVe0w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Sm1sgyax2R0:v2xkSCGVe0w:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/Sm1sgyax2R0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/2462772863469387049/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=2462772863469387049" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/2462772863469387049?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/2462772863469387049?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/Sm1sgyax2R0/p2p-money-with-app-engine-oauth-and-qr.html" title="P2P Money with App Engine, OAuth, and QR Codes" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2009/01/p2p-money-with-app-engine-oauth-and-qr.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QNRXw-eSp7ImA9WxRbGEo.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-843400921806035496</id><published>2008-12-09T14:39:00.000-08:00</published><updated>2008-12-09T17:09:54.251-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T17:09:54.251-08:00</app:edited><title>Scalable Clustering with Thrift and SQS</title><content type="html">Since the &lt;a href="http://ringlight.us/"&gt;Ringlight beta&lt;/a&gt; launch, we're edging up towards 100 users. It's certainly not the load that the engineers at Twitter have to deal with, but I would like to impress upon you my &lt;span style="font-weight: bold;"&gt;Law of Scaling&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;Every power of ten, something different breaks (or becomes unusably slow).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So even with modest growth from 10 to 100 users, it's probably time to fix something.&lt;br /&gt;&lt;br /&gt;Once principle of scalable design is to &lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;decouple slow operations from the user interface&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;For instance, subscribers of &lt;a href="http://ringlight.us/present/Plans"&gt;Ringlight Personal Edition&lt;/a&gt; have the added feature of one-click backup of all of their files. However, this operation can take a long time to complete. Even just generating the list of files to back up can be time consuming if you have a really large number of files. Therefore, it is advantageous to move all of this out of the website and into a background process. The web application just records that you have clicked the one-click backup option and then alerts the background process that it's time to figure out exactly what needs to be done about this. This sort of architecture will keep your web page loading snappy and your users happy even on a heavily overloaded website, as you're not wasting their time making them wait for the page to load.&lt;br /&gt;&lt;br /&gt;There are a number of ways to communicate between your web application and the background process. Of particular interest from a scalability standpoint are message queueing services such as &lt;a href="http://rubyforge.org/projects/starling/"&gt;Starling&lt;/a&gt; and &lt;a href="http://aws.amazon.com/sqs/"&gt;SQS&lt;/a&gt;. These allow for high scalability by allowing many producers (your web server instances) talk to many consumers (your background processes).&lt;br /&gt;&lt;br /&gt;Starling is a server written in Ruby (for Python, see &lt;a href="http://code.google.com/p/peafowl/"&gt;Peafowl&lt;/a&gt;) that you run yourself. SQS is a hosted service that you pay for based on usage (number of messages sent and bandwidth used). Both are reasonable choices and have pretty similar APIs. You connect to the service, and then push strings onto a particular queue (identified by a queue name, which is also a string). Other processes can fetch strings from the queue given its name. Pretty easy! They also both have client libraries in most major languages, so integration into your app shouldn't be very difficult.&lt;br /&gt;&lt;br /&gt;Of course, they only support strings, so if you have fancy objects that you want to send then you'll need to serialize and deserialize them to and from strings. There are of course language-specific ways to do this (Java Object Serialization, Python Pickles, etc.), but I prefer &lt;a href="http://incubator.apache.org/thrift/"&gt;Thrift&lt;/a&gt; because it's fast, efficient, and is the same in multiple languages. This is handy because you can implement different components in different languages, which is sometimes useful. For instance, my web server is in Java and my background process is in Python.&lt;br /&gt;&lt;br /&gt;Thrift also provides some additional handy components besides serialization, in particular a transport layer that provides RPC semantics over arbitrary transport mechanisms. It comes by default with socket and HTTP transports.&lt;br /&gt;&lt;br /&gt;What I have implemented and made available for you in case you might find it useful is an &lt;a href="http://blanu.net/thrift-sqs/"&gt;SQS transport for Thrift&lt;/a&gt;. It effectively provides cross-language multicast RPC in a few lines of code. The key piece of code is &lt;a href="http://blanu.net/thrift-sqs/py/TSqsClient.py"&gt;TSqsClient&lt;/a&gt;, which provides the SQS transport using the &lt;a href="http://code.google.com/p/boto/"&gt;&lt;span style="text-decoration: underline;"&gt;boto&lt;/span&gt;&lt;/a&gt; library for Python. This is the piece that you'll need to port if you want to support other languages. The rest of the code is just for example purposes and is derived from simple-thrift-queue, which is a nice example of how to build an application using Thrift. The available methods are defined in the &lt;a href="http://blanu.net/thrift-sqs/squeue.thrift"&gt;thrift file&lt;/a&gt;. It's important that they are defined as async and void, as this is a one-way transport. The &lt;a href="http://blanu.net/thrift-sqs/py/qproducer.py"&gt;producer&lt;/a&gt; calls methods on the stub classes generated by the Thrift compiler. These method calls are queued up SQS. The &lt;a href="http://blanu.net/thrift-sqs/py/qconsumer.py"&gt;consumer&lt;/a&gt; gets the method calls from SQS and calls the methods on the &lt;a href="http://blanu.net/thrift-sqs/py/qhandler.py"&gt;handler&lt;/a&gt; class. Additionally, there are a couple of utilities. One to &lt;a href="http://blanu.net/thrift-sqs/py/qget.py"&gt;fetch a single message&lt;/a&gt; from SQS, so you can test the producer, and one&lt;a href="http://blanu.net/thrift-sqs/py/qclear.py"&gt; clear the queue&lt;/a&gt; if you send too many messages.&lt;br /&gt;&lt;br /&gt;Once nice thing about using Thrift is that you can swap out the transport easily. You can replace my SQS transport with a Starling one, or ditch queues altogether and use sockets or HTTP. The advantage of using SQS is that the producers and consumers can all be on different machines or the same machine, it makes no difference. Used together, you have a very flexible and very scalable system with very few lines of code. &lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;Just update your thrift file and handler class to use your API and everything else is handled for you!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-843400921806035496?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=3bU8m8VWEDM:IQ0m4p_ur7o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=3bU8m8VWEDM:IQ0m4p_ur7o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=3bU8m8VWEDM:IQ0m4p_ur7o:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/3bU8m8VWEDM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/843400921806035496/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=843400921806035496" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/843400921806035496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/843400921806035496?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/3bU8m8VWEDM/scalable-clustering-with-thrift-and-sqs.html" title="Scalable Clustering with Thrift and SQS" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/12/scalable-clustering-with-thrift-and-sqs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4DSX04eSp7ImA9WxRWF0k.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-5797991065895662602</id><published>2008-11-03T12:20:00.000-08:00</published><updated>2008-11-03T12:26:18.331-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-03T12:26:18.331-08:00</app:edited><title>Ringlight Beta Launch Party</title><content type="html">After almost a year of hacking, testing, and web design, I'm ready to release a &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; beta to the public.&lt;br /&gt;&lt;br /&gt;I'd like all of my friends and coworkers to join me at &lt;a href="http://conjunctured.com/"&gt;Conjunctured&lt;/a&gt; to celebrate this momentous occasion.   The party is this Wednesday, November 5th, from 6-9pm.&lt;br /&gt;&lt;br /&gt;Austin is a great place to do a startup and I couldn't have made it this far without the community. Let's work together to make things awesome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-5797991065895662602?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=L8kJW4UKeJY:WrLkigPRJV0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=L8kJW4UKeJY:WrLkigPRJV0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=L8kJW4UKeJY:WrLkigPRJV0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/L8kJW4UKeJY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/5797991065895662602/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=5797991065895662602" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/5797991065895662602?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/5797991065895662602?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/L8kJW4UKeJY/ringlight-beta-launch-party.html" title="Ringlight Beta Launch Party" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/11/ringlight-beta-launch-party.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QERXw_cSp7ImA9WxRXF00.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-3935330371215173132</id><published>2008-10-22T11:29:00.000-07:00</published><updated>2008-10-22T11:48:24.249-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-22T11:48:24.249-07:00</app:edited><title>The Rackspace Cloud Event</title><content type="html">Today I attended the &lt;a href="http://cloud.rackspace.com/"&gt;Rackspace Cloud Event&lt;/a&gt; at the ACLU stage, just a couple floors above the &lt;a href="http://www.actlab.utexas.edu/"&gt;ACTLab&lt;/a&gt;. I'll skip the marketing and get right to what startups and developers might care about.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rackspace bought Slicehost&lt;/li&gt;&lt;li&gt;Rackspace bought Jungle Disk&lt;/li&gt;&lt;li&gt;Their version of Google App Engine, previously Mosso, is now called "Cloud Sites"&lt;/li&gt;&lt;li&gt;Their S3 is called "Cloud Files" and is $0.15/GB per month&lt;/li&gt;&lt;li&gt;They will be offerering pay-as-you-go CDN for Cloud Files through Limelight for $0.22/GB&lt;/li&gt;&lt;/ul&gt;I've always had a problem with Mosso ("Cloud Sites") in that it promises to scale your app for you, but it never says what type of scaling it actually does. Luckily, one of the engineers talked to me afterwards and answered all of my questions. Here's how it scales:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A master load balancer which will be hot swapped in case of failure&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A cluster of web server load balancers&lt;/li&gt;&lt;li&gt;A cluster of app servers&lt;/li&gt;&lt;li&gt;Master-slave replicated databases&lt;/li&gt;&lt;/ul&gt;So they're basically doing all the things that are good and reasonable. I didn't have a chance to ask about caching issues such as whether a memcached cluster or any other caching solution was available. Also, while they don't do automatic sharding of your database (which would be cool, but kind of insane), they do support apps with multiple master databases and will support separate replication for each master. It really beats services which just provide a cluster of app servers in terms of ultimate scalability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-3935330371215173132?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=lDdUra21aO8:ril-4a-MuP0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=lDdUra21aO8:ril-4a-MuP0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lDdUra21aO8:ril-4a-MuP0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/lDdUra21aO8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/3935330371215173132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=3935330371215173132" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3935330371215173132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3935330371215173132?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/lDdUra21aO8/rackspace-cloud-event.html" title="The Rackspace Cloud Event" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/10/rackspace-cloud-event.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4NSH4zfip7ImA9WxdbGE4.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-7151509806613632148</id><published>2008-08-15T12:55:00.000-07:00</published><updated>2008-08-15T13:09:59.086-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-15T13:09:59.086-07:00</app:edited><title>Autocomplete Form Fields (with jQuery)</title><content type="html">I recently added a feature to &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; which lets you share a private file with a particular user. There is a field to enter the username that you want to share with and obviously this field needs to autocomplete as you type. This is a feature that users expect now and so it's not really optional.&lt;br /&gt;&lt;br /&gt;jQuery makes it very easy to add this feature:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download the &lt;a href="http://www.pengoworks.com/workshop/jquery/autocomplete.htm"&gt;autocomplete&lt;/a&gt; extension for jQuery. You'll need both the &lt;a href="http://www.pengoworks.com/workshop/jquery/lib/jquery.autocomplete.js"&gt;javascript&lt;/a&gt; and &lt;a href="http://www.pengoworks.com/workshop/jquery/lib/jquery.autocomplete.css"&gt;CSS&lt;/a&gt; files.&lt;/li&gt;&lt;li&gt;Add an input field to your form: &lt;input id="youAutocompleteMe" type="text"&gt;&lt;/li&gt;&lt;li&gt;Set the cacheLength option to speed up responsiveness: options={cacheLength: "20"};&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Call the autocomplete extension: $("#youAutocompleteMe").autocomplete(url, options);&lt;/li&gt;&lt;li&gt;You'll need a server-side script installed at the url you pass to autocomplete to return matches.&lt;/li&gt;&lt;/ol&gt;The autocomplete function will call the given url, passing the text currently in the input box in the q parameter.  Your server-side code should return a newline-delimited list of matches.&lt;br /&gt;&lt;br /&gt;That's it! It's pretty easy. The key to performance is setting that cacheLength parameter as it default to 1, which doesn't provide much caching at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-7151509806613632148?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=_cbh269XYjA:7J6mBO9kINs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=_cbh269XYjA:7J6mBO9kINs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_cbh269XYjA:7J6mBO9kINs:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/_cbh269XYjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/7151509806613632148/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=7151509806613632148" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/7151509806613632148?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/7151509806613632148?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/_cbh269XYjA/autocomplete-form-fields-with-jquery.html" title="Autocomplete Form Fields (with jQuery)" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/08/autocomplete-form-fields-with-jquery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQHQHc9cSp7ImA9WxdbEkw.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-514491371269184690</id><published>2008-08-08T08:39:00.000-07:00</published><updated>2008-08-08T09:52:11.969-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-08T09:52:11.969-07:00</app:edited><title>AJAX File Upload Progress Bars (with jQuery)</title><content type="html">I recently added progress bars (actually, a percentage instead of a bar, but it was the same to implement) to &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; uploads and downloads. I was suprised to find that the available server-side libraries for dealing with file uploads seemed to be inadequate for adding this functionality to my website.&lt;br /&gt;&lt;br /&gt;The basic technique for adding progress bars is relatively simple. With jQuery:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install the &lt;a href="http://www.phpletter.com/Demo/AjaxFileUpload-Demo/"&gt;Ajax File Upload extension&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Install the &lt;a href="http://groups.google.com/group/jquery-en/browse_thread/thread/e99f3bc0cfa12696"&gt;periodic execution extension&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Register some &lt;a href="http://docs.jquery.com/Ajax"&gt;Ajax event callbacks&lt;/a&gt; to reveal the progress bar on the page when the upload starts and also to catch errors.&lt;/li&gt;&lt;li&gt;Call the $.ajaxFileUpload function with the URL of the upload handler script, the id of the file input element, and the callback function to handle output from the upload handler.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Have the upload handler return a Json object with an id for the upload.&lt;/li&gt;&lt;li&gt;Call your progress bar update function with the periodic execution model: $.periodic(updateProgressBar);&lt;/li&gt;&lt;li&gt;The updateProgressBar function should fetch the download status from a server-side script, supplying the upload id and a callback function: $.getJSON("fetchProgress", {id: id}, function(data) {/* update progress bar with data.percentDownloaded*/});&lt;/li&gt;&lt;li&gt;The fetchProgress script should return upload progress information in a Json object. I return percentDownloaded, but you can include anything you'd like, such as upload rate. You should also provide error information here, such as if the upload failed.&lt;/li&gt;&lt;li&gt;The callback function for fetchProgress should update the page to reflect updated progress. For instance, updating a percentage to completion could be as simple as $("#percent").empty().append(data.percentDownloaded);&lt;/li&gt;&lt;/ol&gt;This was all very simple to implement and jQuery made it possible in very few lines of code. The difficulty was in providing a percentDownloaded value. The difficulty comes from the fact that it is common for browsers to not include the Content-Length field for uploaded files. The file upload handling libraries generally solve this problem by either 1) not providing a content length or 2) loading the whole file into memory (or disk, in some cases) and then finding the length of it. Either way, not very useful for a progress bar! This total failure to handle streaming files is a &lt;a href="http://www.hackerdashery.com/2008/05/how-not-to-handle-streams.html"&gt;common problem in libraries&lt;/a&gt; and if you could avoid it in the libraries you implement then the world would be most appreciative.&lt;br /&gt;&lt;br /&gt;In the meantime, there are a number of action items that require your attention. First, calculate the file length by taking the HTTP request Content-Length field and subtracting the size of everything which is not the file in order to yield the file length. I did this with the following shoddy algorithm:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Extract the MIME boundary from the Content-Disposition field.&lt;/li&gt;&lt;li&gt;Subtract the size of the MIME boundary twice (there is a boundary on both sides of the file).&lt;/li&gt;&lt;li&gt;Subtract 2 because the second boundary has a trailing "--".&lt;/li&gt;&lt;li&gt;Subtract 4 because each boundary has a trailing two-character newline (\r\n).&lt;/li&gt;&lt;li&gt;Subtract 8 because my numbers were always off by exactly 8. I'm not sure where this additional 8 is coming from.&lt;/li&gt;&lt;/ol&gt;As I said, this algorithm is shoddy, a kludge not fit for use in production. However, it works for now! It needs extensive testing and tweaking on a variety of browsers. The next steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Improve algorithm so that it's robust enough to work with most browsers&lt;/li&gt;&lt;li&gt;Submit a patch to python's FieldStorage class to support this algorithm&lt;/li&gt;&lt;li&gt;Submit a bug report to Mozilla requesting that they supply content length in file uploads&lt;/li&gt;&lt;/ol&gt;For now, my upload progress bars are working, so I'm happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-514491371269184690?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=Unx77EOzq3E:6rlo2rN1Ds4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=Unx77EOzq3E:6rlo2rN1Ds4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=Unx77EOzq3E:6rlo2rN1Ds4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/Unx77EOzq3E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/514491371269184690/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=514491371269184690" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/514491371269184690?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/514491371269184690?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/Unx77EOzq3E/ajax-file-upload-progress-bars-with.html" title="AJAX File Upload Progress Bars (with jQuery)" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/08/ajax-file-upload-progress-bars-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcCQ3wyfip7ImA9WxdUE0k.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-6468962355324815281</id><published>2008-07-29T08:34:00.000-07:00</published><updated>2008-07-29T09:14:22.296-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-29T09:14:22.296-07:00</app:edited><title>Flash Crowd Preparation - Load Testing With Siege</title><content type="html">The official launch of &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; is approaching and so it's time to prepare for launch day &lt;a href="http://en.wikipedia.org/wiki/Flash_Crowd"&gt;flash crowds&lt;/a&gt;, in particular from &lt;a href="http://en.wikipedia.org/wiki/Slashdot_effect"&gt;Slashdot&lt;/a&gt; (or Digg, etc.). On the bright side, these sorts of Flash crowds are not as fearsome as the used to be, in that most website hosting these days provides adequate bandwidth and CPU to handle the load. The weak point is most likely your application itself, so it's worth load testing it.&lt;br /&gt;&lt;br /&gt;So how much load is a Slashdot flash crowd? On the order of 1-10 requests per second. If you can handle 100 then you're more than fine. Additionally, this load only lasts about 24 hours. These are small numbers as compared to the continuous load you can expect for a popular site, but scaling up for your post-launch flash crowd is good preparation for the traffic to come.&lt;br /&gt;&lt;br /&gt;The first step in scaling is to load test your site. Don't go writing a level 4 load balancer in C with async I/O just yet. First, find out what is slow and just how slow it is. I like to use siege for this because it let's you start simple.&lt;br /&gt;&lt;br /&gt;First, apt-get install siege. Then, run siege.config to make a new config file (you can edit it later).&lt;br /&gt;Then, try the simplest possible test: siege http://yoursite.com/&lt;br /&gt;&lt;br /&gt;Don't run siege on someone else's website as they are likely to think they are under attack (and they are!) and block your IP.&lt;br /&gt;&lt;br /&gt;Siege will launch a bunch of connections and keep track of core statistics: availability (should be 100%), response time (should be less than 1 second), and transaction rate (you're shooting for 100 transactions/second).&lt;br /&gt;&lt;br /&gt;By default, siege will just keep attacking your server until you tell it to stop (ctrl-C). To run a shorter test, use -r to specify the number of repetitons. Note, however, that this is not the number of transactions that will be made. siege uses a number of simultaneous connections (15 by default, set it with -c), so if you specify -r 10 -c 10 for 10 repetitions with 10 simultaneous connections, then there will be 100 transactions.&lt;br /&gt;&lt;br /&gt;Other important options are -d to set the random delay between requests and -b to use no delay at all. The use of -b is less realistic in terms of real load, but will give you an idea of the maximum throughput that your system can handle.&lt;br /&gt;&lt;br /&gt;I tested my site with siege -b -c 100 -r 100 in order to hit it hard and see the max throughput. I found that most pages could handle 100 transactions/second, but one page as doing a scant 5 t/s. Unacceptable! I added memcached caching to that page for caching some of its internal state and it now benchmarks at about 90 t/s. That's perfectly acceptable for the launch crowd, but this benchmark relies on cache hits. With 100% cache misses, I'd be back to 5 t/s. So the real performance is somewhere in the middle, depending on the ratio of cache hits to misses. What this ration is depends on real traffic patterns as well as the size of the cache and the number of pages. This makes it hard to say, but I can give it a shot.&lt;br /&gt;&lt;br /&gt;The way to simulate something like this with siege is to put a number of URLs in a file called urls.txt and then run siege -i. siege will then pick URLs to hit randomly from the file. Put multiple copies of the same URL in the file in order to simulate relative weighting of the URLs. By providing a file containing all of my caching-dependent URLs, weighted based on estimated popularity, I can see how well my cache is holding up and tweak caching settings as necessary to get adequate performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-6468962355324815281?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=tlbxGQouqVo:xxjX6ko2--U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=tlbxGQouqVo:xxjX6ko2--U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tlbxGQouqVo:xxjX6ko2--U:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/tlbxGQouqVo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/6468962355324815281/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=6468962355324815281" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6468962355324815281?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6468962355324815281?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/tlbxGQouqVo/flash-crowd-preparation-load-testing.html" title="Flash Crowd Preparation - Load Testing With Siege" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/07/flash-crowd-preparation-load-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGQnc-cCp7ImA9WxdWGE0.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-8355893617303545891</id><published>2008-07-11T12:04:00.000-07:00</published><updated>2008-07-11T12:22:03.958-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-11T12:22:03.958-07:00</app:edited><title>Startup Camp Austin</title><content type="html">There's been a lot of discussion lately about &lt;a href="http://geekaustin.org/2008/07/09/austin-weird-ambition/"&gt;Austin's startup culture&lt;/a&gt;.&lt;br /&gt; Is Austin a good place to do a startup? Should you head to California instead? What sort of startsup work best in Austin? Where should you look for funding? Is Austin Ventures the only game in town? Why doesn't Austin have an equivalent of Tech Stars or Y Combinator?&lt;br /&gt;&lt;br /&gt;There's a growing movement to make Austin a great place to do startups. Projects like the &lt;a href="http://startupdistrict.com/"&gt;Startup District&lt;/a&gt; and various coworking spaces, both &lt;a href="http://conjunctured.com/"&gt;commercial&lt;/a&gt; and &lt;a href="http://wiki.workatjelly.com/JellyInAustin"&gt;noncommercial&lt;/a&gt; are examining what we need to provide in order for Austin startups to succeed.&lt;br /&gt;&lt;br /&gt;In the spirit of these disucssions, I'm organizing &lt;a href="http://barcamp.org/StartupCampAustin"&gt;Startup Camp Austin&lt;/a&gt;, a one-day event on August 2nd where Austin's startup community will come together to discuss the issues, challenges, and advantages of having a startup in Austin.&lt;br /&gt;&lt;br /&gt;RSVP on the &lt;a href="http://www.facebook.com/editevent.php?eid=18776462158&amp;amp;guests=1#/event.php?eid=18776462158"&gt;Facebook Event page&lt;/a&gt; and sign up to give a presentation, moderate a discussion, demo your product, or pitch your idea on the &lt;a href="http://barcamp.org/StartupCampAustin"&gt;BarCamp wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-8355893617303545891?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=u1cD_A8XKRo:iD8dkoyIAjY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=u1cD_A8XKRo:iD8dkoyIAjY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=u1cD_A8XKRo:iD8dkoyIAjY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/u1cD_A8XKRo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/8355893617303545891/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=8355893617303545891" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/8355893617303545891?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/8355893617303545891?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/u1cD_A8XKRo/startup-camp-austin.html" title="Startup Camp Austin" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/07/startup-camp-austin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCQnw7eCp7ImA9WxdXGEs.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-3714681795007484929</id><published>2008-06-30T13:38:00.000-07:00</published><updated>2008-06-30T14:14:23.200-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-30T14:14:23.200-07:00</app:edited><title>Java and Memory Leaks</title><content type="html">People are often surprised that I prefer Java as the primary language for coding serious applications. The assume that it must be ignorance of other languages, enforced slavery by my employer, or simple insanity. I assure you, however, that while I have experience in programming with 15 different programming languages and I enjoy many of them, I still choose Java for doing real work.&lt;br /&gt;&lt;br /&gt;This is because while first class functions, closures, and metaobjects are all very cool and fun, I don't think these are the important factors when writing, say, a web application that you need to scale up to lots of users. What really matters are the libraries and the tools. These will save you more time than not having to type semi-colons at the ends of lines.&lt;br /&gt;&lt;br /&gt;An example of what I mean is memory profiling. I recently wrote a handy load testing tool for &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; which generates an up-to-date google sitemap by hitting every URL on the website, comparing hashes to see if it's changed, and updating the sitemap's lastmod field. There are currently around 200,000 pages and hitting them all at once is a good test of the memory cache, database responsiveness, average page load time, etc. Interestingly enough, this process causes the server to run out of memory and crash.&lt;br /&gt;&lt;br /&gt;Excellent! The load test revealed a memory leak, just what a load test should do. If the application was in, say, python, I would do is run the code under the primitive profiler that's available. This would spit out a stats file. I could then write some code using the bstats.py library to sort the stats in various ways looking for area which are consuming lots of memory.&lt;br /&gt;&lt;br /&gt;Luckily, the server is in Java, so I can get a 15-day trial of &lt;a href="http://yourkit.com/"&gt;YourKit Java Profiler&lt;/a&gt; (there are free ones as well, but YourKit is the best). My code runs on the server, the user interface runs on my local machine. They automatically communicate over the network so that I can get realtime graphs of memory consumption as my app runs. I can take snapshots of the memory state, run tests scenarious, compare the snapshots to see only the memory retained between tests, drill down through paths of method calls that look suspicious, check for common memory allocation gotchas, etc. It's an excellent tool and it makes finding memory leaks easy.&lt;br /&gt;&lt;br /&gt;In this case, the memory leak seems to be inside the Java database access layer (JDBC). It appears that this is because the MySQL JDBC driver &lt;a href="http://bugs.mysql.com/bug.php?id=10954"&gt;intentionally does not garbage collect results&lt;/a&gt;. You must wrap the use of any ResultSet objects with a finally clause that will attempt to close them.  Of course, this is just good coding style anyway and I had already done this in my applications database access methods. Unfortunately, I later decided that I didn't like the way one of these methods was called and so added an additional database access method and this time I had forgotton to add the finally clause. As this new method because more prevelant in my code, the memory leak got worse.&lt;br /&gt;&lt;br /&gt;Of course I'm sure that you, dear readers, would never be guilty of such inconsistent coding practices. This memory leak is a result of my fast and loose coding style. Some might say that it is this style which leads me to use languages with good tools. Others I know prefer to write their own memory profilers, object graph inspectors, and even syntax style checkers from scratch. Personally, I prefer to spend my time writing applications, at least while engaged in the professional business of writing applications. When not at work, I enjoy inventing my own impractical languages as much as anyone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-3714681795007484929?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=-ITHDuZjoHo:GsmnDE1f_Ow:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=-ITHDuZjoHo:GsmnDE1f_Ow:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-ITHDuZjoHo:GsmnDE1f_Ow:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/-ITHDuZjoHo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/3714681795007484929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=3714681795007484929" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3714681795007484929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/3714681795007484929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/-ITHDuZjoHo/java-and-memory-leaks.html" title="Java and Memory Leaks" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/06/java-and-memory-leaks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QFSH06cSp7ImA9WxdXFEw.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-6435280471673306021</id><published>2008-06-25T11:29:00.000-07:00</published><updated>2008-06-25T11:41:59.319-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-25T11:41:59.319-07:00</app:edited><title>Mini-Bio</title><content type="html">I realized as I was e-mailing an introduction to a new business contact today that I never really took the time to properly introduce myself. Here's the same miniature biography that I sent to my new contact:&lt;br /&gt;&lt;br /&gt;I have worked for the last ten years in open source and peer-to-peer software, but in community projects and tech startups. I founded a number of open source peer-to-peer software projects, including &lt;a href="http://www.linux.com/feature/12417"&gt;Freenet&lt;/a&gt;, &lt;a href="http://sourceforge.net/projects/tristero/"&gt;Tristero&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Alluvium_%28peercasting%29"&gt;Alluvium&lt;/a&gt;, and &lt;a href="http://actlab.tv/index.php?option=com_content&amp;amp;task=view&amp;amp;id=26&amp;amp;Itemid=2"&gt;Project Snakebite&lt;/a&gt;. I've also worked in peer-to-peer Interent video delivery at &lt;a href="http://www.swarmcast.com/"&gt;Swarmcast&lt;/a&gt; as Senior Engineer and then at &lt;a href="http://bittorrent.com/"&gt;BitTorrent&lt;/a&gt; as the Director of Product Management.&lt;br /&gt;&lt;br /&gt;I currently have a startup here in Austin called &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt;, where I make social file-sharing software. It can be thought of as "peer-to-peer meets Web 2.0" or "google for your desktop". It indexes all of the files on all of your computers and makes them available on a website, so you can access your files from anywhere that has a web browser, send links to your friends, search, tag, bookmark, etc.&lt;br /&gt;&lt;br /&gt;I also do some consulting in the areas of product design, product management, and engineering architecture.&lt;br /&gt;I'm always happy to meet anyone in Austin with a startup and I'd love to hear what you're working on. Let me know if you'd like to have lunch anytime this week or next. Also, I will be at &lt;a href="http://wiki.workatjelly.com/JellyInAustin"&gt;Jelly&lt;/a&gt; this Friday and most any Friday, so feel free to stop by if you'd like. Jelly is a co-working group that meets on Fridays at &lt;a href="http://cafecaffeine.com/"&gt;Cafe Caffeine&lt;/a&gt;. It's a great place to meet other people in startups.&lt;br /&gt;&lt;br /&gt;Other things to check out if you want to know more about me: &lt;a href="http://stepthreeprofit.com/"&gt;blog&lt;/a&gt;, &lt;a href="http://blanu.net/"&gt;personal website&lt;/a&gt;, &lt;a href="http://twitter.com/blanu"&gt;twitter&lt;/a&gt;,&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;a href="http://www.linkedin.com/in/brandonwiley"&gt;LinkedIn profile&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-6435280471673306021?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=lglk93kjWxM:63XLs1ak0T8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=lglk93kjWxM:63XLs1ak0T8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=lglk93kjWxM:63XLs1ak0T8:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/lglk93kjWxM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/6435280471673306021/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=6435280471673306021" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6435280471673306021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6435280471673306021?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/lglk93kjWxM/mini-bio.html" title="Mini-Bio" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/06/mini-bio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAHQ346eSp7ImA9WxdRF0o.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-455604733625706317</id><published>2008-06-06T10:01:00.000-07:00</published><updated>2008-06-06T11:58:52.011-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-06T11:58:52.011-07:00</app:edited><title>Twitter Integration for your Website</title><content type="html">Social sharing of content is a popular feature for websites. It seems like every blog post these days is accompanied with a list of bookmarklet buttons: Digg, StumbleUpon, del.icio.us, etc. However, what about adding the ability to post links to Twitter from your website? It's not quite as simple as a bookmarklet, but it's still pretty easy to do.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; website is written in Java (client is in python), so when I picked a &lt;a href="http://groups.google.com/group/twitter-development-talk/web/libraries-for-the-twitter-api"&gt;library&lt;/a&gt; for twitter access, I picked &lt;a href="http://thinktankmaths.com/java-twitter"&gt;jtwitter&lt;/a&gt; as it has no external dependencies.&lt;br /&gt;&lt;br /&gt;It's so easy to use that it's almost too easy. Check out my code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;      Twitter twit=new Twitter(username, password);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;      Status status=twit.updateStatus(message);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So easy, right? Now you can go to any &lt;a href="http://ringlight.us/files/FileInfo/cyb/lupiniii/public/Accelerando/accelerando%2Dpdf.zip"&gt;file&lt;/a&gt; on Ringlight, click on &lt;b&gt;Share on Twitter&lt;/b&gt;, and the link is posted on Twitter. You don't even have to be logged into the Ringlight website, so any random user on the Internet can start twittering links to my copy of Accelerando.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-455604733625706317?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=PbM8kpp1mQM:qeA8WcaKntE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=PbM8kpp1mQM:qeA8WcaKntE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=PbM8kpp1mQM:qeA8WcaKntE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/PbM8kpp1mQM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/455604733625706317/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=455604733625706317" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/455604733625706317?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/455604733625706317?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/PbM8kpp1mQM/twitter-integration-for-your-website.html" title="Twitter Integration for your Website" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/06/twitter-integration-for-your-website.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDRXs7fSp7ImA9WxdRFk0.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-5234431233564469397</id><published>2008-06-04T10:53:00.000-07:00</published><updated>2008-06-04T11:54:34.505-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-04T11:54:34.505-07:00</app:edited><title>Cross-Platform Monitoring of Filesystem Events</title><content type="html">A recent problem with deployment of the &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; client has been that users with a large number of folders have been experiencing annoying amounts of CPU usage. This is because the most fundamental functionality that Ringlight provides is periodically rescanning your filesystem to automatically find changes to the filesystem. Rescan too infrequently and changes won't appear on the website when expected, confusing users. Rescan too frequently and users will complain about too much CPU usage. There are many applications that require rescanning the filesystem, from virus scanners to automatic backup programs, and they all have to deal with this problem.&lt;br /&gt;&lt;br /&gt;An attractive alternative to rescanning the filesystem is to use filesystem monitoring events. Rather than periodically scanning to see if anything has changed, instead let the operating system notify you when something has change. Very efficient! Unfortunately, unlike a simple recursive traversal of directories, this approach has to be implemented separately on each major platform and each OS has its own pitfalls and gotchas. I will focus primarily on building this in python, although the same underlying mechanisms can be used in any language with appropriate bindings.&lt;br /&gt;&lt;br /&gt;On Windows, filesystem events are available using the &lt;a href="http://sourceforge.net/projects/pywin32/"&gt;Python for Windows Extensions&lt;/a&gt;. It is not a particularly simple API to use, being a direct binding to the Windows system calls.&lt;br /&gt;&lt;br /&gt;On OS X, &lt;a href="http://people.freebsd.org/%7Edwhite/PyKQueue/"&gt;PyKQueue&lt;/a&gt; offers a binding to kqueue, which is also available on BSD.&lt;br /&gt;&lt;br /&gt;On Linux, there are two kernel interfaces, dnotify and inotify, depending on whether the kernel version is lesser or greater than 2.6.13. You can call inotify directly with &lt;a href="http://pyinotify.sourceforge.net/"&gt;pyinotify&lt;/a&gt;. You can also use a more generic library such as &lt;a href="http://www.gnome.org/%7Eveillard/gamin/python.html"&gt;Gamin&lt;/a&gt;, which will use either inotify or dnotify, whichever is available. Of course, really old versions of Linux don't even have dnotify, and you'll have to fall back to periodic rescanning.&lt;br /&gt;&lt;br /&gt;Every platform's filesystem monitoring API is different and each has different issues, however they generally share a common set of issues as well:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Network drives don't generate events - you'll have to use periodic scanning for these&lt;/li&gt;&lt;li&gt;Every folder to be watched must be registered separately - you can't request notifications for an entire directory tree. You can to register all the directories separately and when a new directory is create you have to remember to register it as well. You sometimes need to keep a file descriptor around for each directory you're watching, so watch out for running out of file descriptors.&lt;/li&gt;&lt;li&gt;No special handling is done for shortcuts, aliases, or symlinks - if you're monitoring, say, a directory, and that directory has a shortcut (or the equivalent for that OS), you need to monitor two objects: the shortcut itself (in case its target is changed), and the targeted file or directory.&lt;/li&gt;&lt;li&gt;Sometimes deleting a directory won't send deletion events for files in that directory or subdirectories. You have to maintain a copy of this information yourself and perform a virtual recursive delete on your database when the parent directory deletion event is received.&lt;/li&gt;&lt;/ul&gt;The Ringlight client, being a cross-platform application the primary function of which is to monitor filesystem changes (and report them to the server, where the real fun happens), naturally takes all this into account. I am planning on release the filesystem monitoring core of the Ringlight client as open source, as there are no good cross-platform filesystem monitoring libraries available and it's really a shame that people have to reimplement all of this for their applications.&lt;br /&gt;&lt;br /&gt;By the way, the users seem quite happy with the new version of the client that users filesystem monitoring events. No complaints about excessive CPU usage anymore!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-5234431233564469397?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=tySE7FayaHk:i-cLuv52lDY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=tySE7FayaHk:i-cLuv52lDY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=tySE7FayaHk:i-cLuv52lDY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/tySE7FayaHk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/5234431233564469397/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=5234431233564469397" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/5234431233564469397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/5234431233564469397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/tySE7FayaHk/cross-platform-monitoring-of-filesystem.html" title="Cross-Platform Monitoring of Filesystem Events" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/06/cross-platform-monitoring-of-filesystem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMR3o_eyp7ImA9WxdREEw.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-2169176585332450456</id><published>2008-05-28T14:54:00.001-07:00</published><updated>2008-05-28T14:54:46.443-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-28T14:54:46.443-07:00</app:edited><title>Adding Search (with Lucene)</title><content type="html">The time has finally come for me to add search functionality to &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt;. There is enough content now that just clicking around is getting tedious. After all, it's up to &lt;a href="http://ringlight.us/stats/SiteStats"&gt;almost 200,000 files&lt;/a&gt; now.&lt;br /&gt;&lt;br /&gt;There are a number of considerations to make when adding search to your site. For instance, you can usually get by pretty well with just &lt;a href="http://code.google.com/apis/ajaxsearch/"&gt;integrating Google search into your website&lt;/a&gt;. This is fast, easy, and doesn't require messing with your backend code at all.&lt;br /&gt;&lt;br /&gt;However, this is not really what I want. I want to let users search for files, not web pages, and I want the results integrated nicely with everything else. For instance, it would be cool to use a search query as a radio playlist like you can do on &lt;a href="http://hypem.com/"&gt;Hype Machine&lt;/a&gt;. So I'll need to build my own search engine.&lt;br /&gt;&lt;br /&gt;This is not really that hard to do. I would recommend you read &lt;a href="http://www.spiteful.com/2008/02/29/design-details-of-audiogalaxycoms-high-performance-mysql-search-engine/#more-24"&gt;some&lt;/a&gt;  &lt;a href="http://www.spiteful.com/2008/03/07/lessons-learned-scaling-the-audiogalaxy-search-engine/#more-28"&gt;articles&lt;/a&gt; and then download &lt;a href="http://mg4j.dsi.unimi.it/"&gt;Managing Gigabytes for Java&lt;/a&gt;. Those articles are by Tom from AudioGalaxy. You may remember AudioGalaxy as the best thing to happen and unhappen to music in my lifetime. I know do. More importantly, it was deliciously scalable and for the most part it was just a search engine. So don't go writing one without learning some tips from the best.&lt;br /&gt;&lt;br /&gt;I'm sure that a little engineering and MG4J could produce a highly scalable search engine. However, I didn't really want to spend that much time on it, so I went with a  higher level solution in the form of &lt;a href="http://lucene.apache.org/"&gt;Lucene for Java&lt;/a&gt;. There is also a popular version for Python. I would recommend waiting a while if you're considering using &lt;a href="http://lucene.apache.org/lucy/"&gt;Lucy&lt;/a&gt; (Lucene in C with Python and Ruby bindings) because I don't consider it mature. I'd also stay away from layers on top of Lucene like &lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt; because if you're looking for tools to make Lucene easier to use then you're missing the point that it's already easy to use.&lt;br /&gt;&lt;br /&gt;Download the official Lucene release and you'll see that it comes with source code for a demo. One class, IndexFiles, shows you how to add information to the search index. Another class, SearchFiles, shows you how to search the index to retrieve items. Like most demo code, it's both too simple (doesn't provide enough use cases of the library to let you fully understand it) and too complex (has a bunch of command line arguements that it has to parse and such). However, it will do. I have &lt;a href="http://ringlight.us/search/SearchResults?q=accelerando"&gt;working search&lt;/a&gt; for my whole site after two days of fiddling around and working on it part-time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-2169176585332450456?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=HtPsW4O4uvU:aoRVGXqu_10:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=HtPsW4O4uvU:aoRVGXqu_10:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=HtPsW4O4uvU:aoRVGXqu_10:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/HtPsW4O4uvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/2169176585332450456/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=2169176585332450456" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/2169176585332450456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/2169176585332450456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/HtPsW4O4uvU/adding-search-with-lucene.html" title="Adding Search (with Lucene)" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/05/adding-search-with-lucene.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08NR3w4eSp7ImA9WxdSE0Q.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-6764389320470384089</id><published>2008-05-21T10:21:00.001-07:00</published><updated>2008-05-21T11:51:36.231-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T11:51:36.231-07:00</app:edited><title>Napster DRM-Free, The Future and Past of Online Music</title><content type="html">As of today, Napster now offers DRM-free MP3 downloads. In one sense, it seems that the war is over, and we won. Let's take a look at the history and future of online music distribution.&lt;br /&gt;&lt;br /&gt;First there was Napster, one of the original three peer-to-peer systems (along with Freenet and Gnutella). Unlike the other two, it was a commercial venture focused on exclusively on music distribution. It became the controversial flagship of the peer-to-peer movement and the conversation about p2p became focused exclusively on the online music distribution debate. While I was going to conference to speak about Freenet, I would introduce it as a censorship-resistant platform for protecting the freedom of speech of political dissidents and the audience would ask me, "&lt;a href="http://howareartistsgoingtogetpaid.com"&gt;How are artists going to get paid?&lt;/a&gt;", the jingoistic slogan propagating by the Recording Industry Association of America. You could argue that that wasn't the point, but by then you'd already gone off the topic of how to revolution media distribution to be efficient and fair and were now talking about the online music debate again. It wasn't even really possible to distribute mp3s over Freenet, but yet it kept coming up again and again.&lt;br /&gt;&lt;br /&gt;After Napster, Grokster, and most notable AudioGalaxy (the best thing to happen and unhappen to music in my lifetime) were shut down, the p2p hackers went mostly underground, becoming assimilated into a number of small startups acquired by big companies. No one wanted to touch music at all. Personally, I stopped buying CDs as I had no desire to contribute funding the the organization attacking my friends, my livelihood, and everything interesting going on in my field. I listened exclusively to my collection of unsigned, obscure bands from AudioGalaxy (bands that had paid to be listed on AudioGalaxy so as to get more exposure) for many years. Have you ever heard of The Blood Group? So good.&lt;br /&gt;&lt;br /&gt;Online music distribution was dead, and then Apple stepped in, with a not particularly new, but well-executed plan to make money off of online music sales by selling an expensive player for their exclusive DRM format (the iPod). This was only the first step of the plan, however. Step two was to bring in DRM-free MP3s at a higher price than DRM files, offering the RIAA what they really wanted from MP3 sales, which was making &lt;span style="font-weight:bold;"&gt;even more&lt;/span&gt; money selling mp3s than CDs. This is, of course, insane, as CDs contain much more value than MP3s in the form of cover art liner notes, a physical object to hold, and of course the costs of CD distribution are higher as well. Having a higher price for something which has both lower value and a lower cost is just not sustainable. However, it must have sounded quite appealing to the record industry that while CD sales were dropping they could actually make &lt;span style="font-weight:bold;"&gt;more money&lt;/span&gt; that ever before. I'm sure those power point charts went over very well in meetings. Then step three from Apple, readjust the price of DRM-free MP3s to be the same as DRM tracks. As iPod sales decline (because everyone already owns an iPod), Apple switches to a business model not dependent on the iPod and becomes the number one online music distributor. Apple has become what Napster and AudioGalaxy tried to be, the future of music distribution.&lt;br /&gt;&lt;br /&gt;So in that sense, we won. Go p2p hackers! Oh but wait, this has nothing to do with p2p hackers, does it? This is just online music distribution. And in this sense, we've lost, or at least are still at war. Peer-to-peer became demonized because of its use for online music distribution. Now that online music distribution is okay, peer-to-peer is still getting picked on. The content industries would have you believe that p2p is only for morally corrupt kleptomaniacs bent on stealing and never paying. This doesn't explain why Limewire is still around as a commercial entity, making money off of Limewire Pro, or how services like TorrentFreedom manage to exist charging $17/month (more than an Napster subscription when they were doing subscriptions).&lt;br /&gt;&lt;br /&gt;The sad fact is that the focus has been on not what you are doing (distributing music online), but how you are doing it (peer-to-peer). This is tragic because peer-to-peer distribution is a technological revolution as important as the printing press, whereas online music distribution is only moderately interesting in the long term, being just one example of the future of media distribution being over the Internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-6764389320470384089?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=NOnL35RtZbQ:Tg8JpimQJ-s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=NOnL35RtZbQ:Tg8JpimQJ-s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=NOnL35RtZbQ:Tg8JpimQJ-s:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/NOnL35RtZbQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/6764389320470384089/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=6764389320470384089" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6764389320470384089?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6764389320470384089?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/NOnL35RtZbQ/napster-drm-free-future-and-past-of.html" title="Napster DRM-Free, The Future and Past of Online Music" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/05/napster-drm-free-future-and-past-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MHQXY-eCp7ImA9WxZaEUk.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-4712895551334619081</id><published>2008-04-25T09:30:00.000-07:00</published><updated>2008-04-25T09:37:10.850-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-25T09:37:10.850-07:00</app:edited><title>Download Party</title><content type="html">There will be a Ringlight Download Party this coming Wednesday, April 30th, at 7pm at Tech Night at Monkey Wrench Books (110 E. North Loop).&lt;br /&gt;&lt;br /&gt;You can check out the &lt;a href="http://blog.ringlight.us/2008/04/download-party.html"&gt;full event info&lt;/a&gt; on the Ringlight news blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-4712895551334619081?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=VsEu9cnX8IQ:H_D5Fcfq9Cw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=VsEu9cnX8IQ:H_D5Fcfq9Cw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=VsEu9cnX8IQ:H_D5Fcfq9Cw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/VsEu9cnX8IQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/4712895551334619081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=4712895551334619081" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/4712895551334619081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/4712895551334619081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/VsEu9cnX8IQ/download-party.html" title="Download Party" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/download-party.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EAQ3k7eip7ImA9WxZbGUs.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-7967512534922008930</id><published>2008-04-23T09:24:00.000-07:00</published><updated>2008-04-23T09:54:02.702-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-23T09:54:02.702-07:00</app:edited><title>Lecture Series Complete, Here Are All The Links</title><content type="html">The last installment of the lecture series was the best day ever. I had the chance to tell some funny stories from my life as a peer-to-peer hacker, and that was really fun for me. We have video and audio podcasts of the lecture, of course. I just want to make a small disclaimer about my last talk for people out there that are going to watch the video. These are anecdotes about the peer-to-peer revolution that I recited from my memories of the past ten years of hacking and hanging out. I did not employ the services of a professional fact checker. There will be inaccuracies, exaggerations, and things I made up because they sounded cool. The talk was meant to be entertaining and to give people a sense of the social history behind things they use every day. If you want an accurate portrayal of the chronology of events, check out the &lt;a href="http://en.wikipedia.org/wiki/Peer-to-peer"&gt;Wikipedia page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are all the files from all the talks:&lt;br /&gt;&lt;br /&gt;Lecture 1: Music, Television, and Film - &lt;a href="http://ringlight.us/files/FileInfo/cyb/lupiniii/anmtsw1.mp3"&gt;Audio&lt;/a&gt;&lt;br /&gt;Lecture 2: Online Communities - &lt;a href="http://ringlight.us/files/FileInfo/cyb/donna/public/projects/spring_2008/new+media+talk2_edited.mp3"&gt;Audo&lt;/a&gt;, &lt;a href="http://ringlight.us/files/GetFile/cyb/donna/public/projects/spring_2008/nmts_2.mov"&gt;Video&lt;/a&gt;&lt;br /&gt;Lecture 3: Peer-to-Peer - &lt;a href="http://ringlight.us/files/FileInfo/cyb/donna/public/projects/spring_2008/new_media_talk3.mp3"&gt;Audio&lt;/a&gt;, &lt;a href="http://ringlight.us/files/FileInfo/cyb/donna/public/projects/spring_2008/nmts3.mov"&gt;Video&lt;/a&gt;, &lt;a href="http://ringlight.us/files/FileInfo/cyb/donna/public/projects/spring_2008/nmts3_brandon.mov"&gt;Video of just my part&lt;/a&gt;, &lt;a href="http://docs.google.com/Presentation?id=ddqrxspn_28srmqr8cf"&gt;Slides&lt;/a&gt;&lt;br /&gt;All lectures: &lt;a href="http://linkosaur.us/users/blanu/tags/actlablectureseries"&gt;Links to websites&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In answer to the unspoken question that I have seen glinting in the eyes of so many members of the audience at these lectures: Yes, I am on &lt;a href="http://twitter.com/blanu"&gt;Twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A special thanks to &lt;a href="http://aimy.org/"&gt;Aimy&lt;/a&gt; for making my slides for me and &lt;a href="http://jtlopez.com"&gt;Joseph&lt;/a&gt; for putting on this lecture series.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-7967512534922008930?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=62PcDEwUfMk:VJkVHqoQAl0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=62PcDEwUfMk:VJkVHqoQAl0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=62PcDEwUfMk:VJkVHqoQAl0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/62PcDEwUfMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/7967512534922008930/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=7967512534922008930" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/7967512534922008930?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/7967512534922008930?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/62PcDEwUfMk/lecture-series-complete-here-are-all.html" title="Lecture Series Complete, Here Are All The Links" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/lecture-series-complete-here-are-all.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMQno7fSp7ImA9WxZbFEg.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-4630168126365523458</id><published>2008-04-17T10:51:00.000-07:00</published><updated>2008-04-17T11:06:23.405-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-17T11:06:23.405-07:00</app:edited><title>Final Lecture Tomorrow, Video of Lecture Two</title><content type="html">The final lecture will be this Friday, April 7th. The same time and place, 6:30pm at the ACTLab (CMB Studio 4B). The topic will be the history and current state of Peer-to-Peer technology.&lt;br /&gt;&lt;br /&gt;This is my area of expertise, so I've very excited! I hope you can make it.&lt;br /&gt;&lt;br /&gt;Also, we have a &lt;a href="http://ringlight.us/files/GetFile/cyb/donna/public/projects/spring_2008/nmts_2.mov"&gt;video of lecture two&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-4630168126365523458?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=-XMZ3wovEbQ:FDJhHBXHbrU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=-XMZ3wovEbQ:FDJhHBXHbrU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=-XMZ3wovEbQ:FDJhHBXHbrU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/-XMZ3wovEbQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/4630168126365523458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=4630168126365523458" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/4630168126365523458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/4630168126365523458?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/-XMZ3wovEbQ/final-lecture-tomorrow-video-of-lecture.html" title="Final Lecture Tomorrow, Video of Lecture Two" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/final-lecture-tomorrow-video-of-lecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QDQns_fyp7ImA9WxZbE0s.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-6124053245828912541</id><published>2008-04-14T09:57:00.000-07:00</published><updated>2008-04-16T11:09:33.547-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-16T11:09:33.547-07:00</app:edited><title>Lecture Two Podcast and Links</title><content type="html">The second installment of the 2008 ACTLab New Media Lecture Series went very well. There were many more people in the audience and this time the audio seemed to record properly. We have video too, but it won't be up for a while longer.&lt;br /&gt;&lt;br /&gt;You can find all of the links for this lecture on my &lt;a href="http://linkosaur.us/users/blanu/tags/actlablectureseries"&gt;linkosaur.us&lt;/a&gt; page.&lt;br /&gt;You can also download the &lt;a href="http://ringlight.us/files/FileInfo/cyb/donna/public/projects/spring_2008/new+media+talk2_edited.mp3"&gt;audio podcast&lt;/a&gt; from &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt;.&lt;br /&gt;I'll let you know when the video is up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-6124053245828912541?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=U1jTLCYHae8:05gUKKSvWjg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=U1jTLCYHae8:05gUKKSvWjg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=U1jTLCYHae8:05gUKKSvWjg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/U1jTLCYHae8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/6124053245828912541/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=6124053245828912541" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6124053245828912541?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/6124053245828912541?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/U1jTLCYHae8/lecture-two-podcast-and-links.html" title="Lecture Two Podcast and Links" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/lecture-two-podcast-and-links.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DQX8zfSp7ImA9WxZUFk0.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-8344113099067534200</id><published>2008-04-07T15:03:00.000-07:00</published><updated>2008-04-07T15:22:50.185-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-07T15:22:50.185-07:00</app:edited><title>Lecture One Podcast, Details on Lecture Two</title><content type="html">The first installment of the lecture series was excellent. Unfortunately, while we are experienced in organizing and recording conferences, this was the first time that we tried to record a presentation while also presenting it! Some unexpected problems arose. First, there was no one to change the videotape so it ran out after an our. Second, there was no one working the mixing board so when halfway through the presentation I demonstrate Pandora, I forget to turn it off therefore covering the rest of the lecture with awesome music.&lt;br /&gt;&lt;br /&gt;Anyway, despite its flawed nature, I decided to put the &lt;a href="http://ringlight.us/files/FileInfo/cyb/lupiniii/anmtsw1.mp3"&gt;podcast&lt;/a&gt; up on Ringlight.&lt;br /&gt;&lt;br /&gt;The next lecture will be this Friday, April 7th. The same time and place, 6:30pm at the ACTLab (CMB Studio 4B). The topic will be interesting new developments in Online Communities. I hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-8344113099067534200?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=B2DeQ0xUeA4:p4omD9oKwFY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=B2DeQ0xUeA4:p4omD9oKwFY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=B2DeQ0xUeA4:p4omD9oKwFY:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/B2DeQ0xUeA4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/8344113099067534200/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=8344113099067534200" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/8344113099067534200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/8344113099067534200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/B2DeQ0xUeA4/lecture-one-podcast-details-on-lecture.html" title="Lecture One Podcast, Details on Lecture Two" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/lecture-one-podcast-details-on-lecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4CR349eCp7ImA9WxZUEks.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-1121829217869376558</id><published>2008-04-03T15:44:00.000-07:00</published><updated>2008-04-03T15:49:26.060-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-03T15:49:26.060-07:00</app:edited><title>ACTLab Lecture Series: Music, TV and Film on the Internet</title><content type="html">For those of you that reside in Austin, Texas, &lt;span style=";font-family:Verdana,Arial,Helvetica;font-size:85%;"  &gt;starting tomorrow (Friday) and for the next two Fridays following, I will be participating in the &lt;a href="http://www.actlab.utexas.edu/new_media_talk_series.html"&gt;ACTLab Lecture Series&lt;/a&gt;. I will be giving tag team talks with my colleagues on what's going on in the world of the Internet.&lt;br /&gt;&lt;br /&gt;This week the topic is:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Music, TV and Film on the Internet&lt;/b&gt;&lt;br /&gt;Have you ever wondered how the media landscape washed into the Internet Sea? In this lecture/seminar we will look at the current state of MTF on the Internet and how technology is changing the way industry, consumers and content creators deal with distribution and consumption.&lt;br /&gt;&lt;br /&gt;I will be covering the top ten things happening right now that you should know about.&lt;br /&gt;&lt;br /&gt;Friday, April 4th, 6:30pm in the ACTLab, CMB Studio 4B on the UT campus on Dean Keaton and Guadalupe, across from Madam Mam's. There is a pay parking lot next to Madam Mam's and a garage behind that.&lt;br /&gt;&lt;br /&gt;I hope to see you there!&lt;br /&gt;&lt;br /&gt;For those of you not residing in Austin, Texas, I will put the videos of the talks on the &lt;a href="http://ringlight.us/files/FilesPage/cyb/donna/"&gt;ACTLab Ringlight share&lt;/a&gt; as they're available.&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/7182371568763719854-1121829217869376558?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=_a08trs0jeA:xXW7fHHT2dg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=_a08trs0jeA:xXW7fHHT2dg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=_a08trs0jeA:xXW7fHHT2dg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/_a08trs0jeA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/1121829217869376558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=1121829217869376558" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/1121829217869376558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/1121829217869376558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/_a08trs0jeA/actlab-lecture-series-music-tv-and-film.html" title="ACTLab Lecture Series: Music, TV and Film on the Internet" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/04/actlab-lecture-series-music-tv-and-film.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYFSHc8cCp7ImA9WxZVF08.&quot;"><id>tag:blogger.com,1999:blog-7182371568763719854.post-446128061907267363</id><published>2008-03-28T10:16:00.000-07:00</published><updated>2008-03-28T10:41:59.978-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-28T10:41:59.978-07:00</app:edited><title>Adobe Flex - Flash Programming for Programmers!</title><content type="html">One of the features that I was really excited about implementing in &lt;a href="http://ringlight.us/"&gt;Ringlight&lt;/a&gt; was a Flash-based media player for browsing photos, videos, and audio files. I like the idea of being able to view all of my files from any computer with a web browser without having to download them first.&lt;br /&gt;&lt;br /&gt;Unfortunately, Flash programming is not the most natural occupation for me. I find the concept of laying your code out on a timeline which trudges ever forward, causing variables to go in and out of scope based on the ticking of a clock... well, I don't like it very much. I don't particularly appreciate the Flash IDE or the fact that Flash source is in a binary file either. I don't mean to malign the art of the Flash programmer. I know you all have heroically found workarounds to all of these inconveniences and I salute your dedication. It's just not my cup of tea.&lt;br /&gt;&lt;br /&gt;However, now we have Adobe's Flex. It fixes most of my problems with Flash programming because it's Flash programming designed for programmers. The entire source for a Flex project is in an XML file. While I am not one to jump on the XML-solves-everything wagon, it does mean that you can edit for Flash applications in a text editor, check them into source control, and cut-and-paste whole projects to your blogs and chats and such.&lt;br /&gt;&lt;br /&gt;Additionally, the compiler is free and cross-platform. This means you can compile your Flash apps right on your server. No more compiling on your desktop, uploading to the server, testing, and repeat. There's even an Apache module which will automatically detect changes in the source and recompile apps for you on demand. Sweet.&lt;br /&gt;&lt;br /&gt;This is not to say that Flex is without problems. Flex coding can be as &lt;a href="http://www.little-gamers.com/index.php?comicID=1775"&gt;frustrating&lt;/a&gt; as Flash programming sometimes. I recently had a terrible time trying to follow online tutorials for making a Flex image browser. They all suggested using the Loader class, but it had some issues with image scaling. However, the suggested workaround for image scaling involves accessing the raw bitmap data of the image. This operation is unfortunately blocked by Adobe's inane and pointless security model, which requires that to access the raw bitmap data of an image the site hosting the image must authorize it in their crossdomain.xml file. So you are totally free to write a Flex image gallery for Flickr photos, but if you want to scale them then that's not allowed! The workaround is to just use the Image class instead of Loader. You don't get the right events to have a fancy loading animation this way, but at least it works.&lt;br /&gt;&lt;br /&gt;Check out my &lt;a href="http://blanu.net/flex/tp4.mxml"&gt;Flex image loader example code&lt;/a&gt;. It's not finished as the buttons don't work yet, but it does load images just fine.&lt;br /&gt;&lt;br /&gt;All in all I'd say that Flex is a breath of fresh air in the world of Flash programming. If you're a programmer then I'd recommend that you try it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7182371568763719854-446128061907267363?l=www.stepthreeprofit.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=F9WrJ7anVDc:tdr8cU6nj5k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?i=F9WrJ7anVDc:tdr8cU6nj5k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StepThreeProfit?a=F9WrJ7anVDc:tdr8cU6nj5k:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StepThreeProfit?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StepThreeProfit/~4/F9WrJ7anVDc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.stepthreeprofit.com/feeds/446128061907267363/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7182371568763719854&amp;postID=446128061907267363" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/446128061907267363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7182371568763719854/posts/default/446128061907267363?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/StepThreeProfit/~3/F9WrJ7anVDc/adobe-flex-flash-programming-for.html" title="Adobe Flex - Flash Programming for Programmers!" /><author><name>blanu</name><uri>http://www.blogger.com/profile/10742095104796078540</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="10901070814875086525" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.stepthreeprofit.com/2008/03/adobe-flex-flash-programming-for.html</feedburner:origLink></entry></feed>
