<?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:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0EBRX4ycSp7ImA9WhRUFkU.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625</id><updated>2012-01-27T11:27:34.099-05:00</updated><category term="linux" /><category term="mobile" /><category term="frisky" /><category term="business" /><category term="javascript" /><category term="java" /><category term="riak" /><category term="erlang" /><category term="apple" /><category term="gwt" /><category term="cloud" /><category term="golang" /><category term="magnum" /><category term="pylons" /><category term="android" /><category term="python" /><category term="spread" /><category term="turbogears" /><category term="nonblocking" /><category term="nosql" /><category term="performance" /><category term="architecture" /><category term="async" /><category term="rant" /><category term="database" /><category term="fawps" /><title>Hacking Thought Blog</title><subtitle type="html">Ranting about writing software...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.hackingthought.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/HackingThoughtBlog" /><feedburner:info uri="hackingthoughtblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C04EQns_eyp7ImA9WhRQEk8.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-7899641461482363029</id><published>2011-12-06T17:23:00.000-05:00</published><updated>2011-12-06T20:38:23.543-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-06T20:38:23.543-05:00</app:edited><title>InfoQ: Events Are Not Just for Notifications</title><content type="html">&lt;a href="http://www.infoq.com/presentations/Events-Are-Not-Just-for-Notifications"&gt;InfoQ: Events Are Not Just for Notifications&lt;/a&gt;: &lt;br /&gt;
&lt;br /&gt;
It is nice to see a fantastic&amp;nbsp;explanation&amp;nbsp;of what I think of as Event Programming. I have blog about a way to implement a simple&lt;a href="http://blog.hackingthought.com/2008/08/event-programming-using-google.html"&gt; Javascript dispatcher&lt;/a&gt; and implementing a&lt;a href="http://blog.hackingthought.com/2009/10/adventures-in-event-everywhere.html"&gt; cross platform event system&lt;/a&gt;. And have been chomping at the bit to implement a fully audited application that stores all the events in one of these new document databases (MongoDB, Riak). To be able to mark any user session with an error (or even allow them to report an error) and then to "replay" that users session would be pretty hot. The concept is difficult but&amp;nbsp;implementation&amp;nbsp;is so much easier especially testing. Now to just&amp;nbsp;evangelize&amp;nbsp;until it is&amp;nbsp;considered&amp;nbsp;a "Best Practice".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-7899641461482363029?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/WZx-Roy9up8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/7899641461482363029/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2011/12/infoq-events-are-not-just-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7899641461482363029?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7899641461482363029?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/WZx-Roy9up8/infoq-events-are-not-just-for.html" title="InfoQ: Events Are Not Just for Notifications" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2011/12/infoq-events-are-not-just-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFRns7cCp7ImA9WhdaEUw.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5919332470267492824</id><published>2011-10-20T08:56:00.002-04:00</published><updated>2011-10-20T08:56:57.508-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-20T08:56:57.508-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="nosql" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>Presentation on Cloud Deployment &amp; Mongodb @ Charlotte Python Group</title><content type="html">A few weeks back I have a presentation on using Fabric to deploy Python WSGI application in the cloud. &amp;nbsp;The slides are:&lt;a href="https://docs.google.com/present/view?id=dg3v9j47_210cxt77g7h"&gt;https://docs.google.com/present/view?id=dg3v9j47_210cxt77g7h&lt;/a&gt; &lt;br /&gt;
The code from the demo is here:&lt;a href="http://www.blogger.com/%C2%A0https://github.com/lateefj/RTC-example"&gt;&amp;nbsp;https://github.com/lateefj/RTC-example&lt;/a&gt;&lt;br /&gt;
In the presentation I displayed how taking down one node in the cluster would not interrupt the other two nodes. Using fabric this was not only&amp;nbsp;feasible&amp;nbsp;but&amp;nbsp;relatively&amp;nbsp;easy once you understand the architecture. I also review the tools that I used like supervisor to restart WSGI (Flask), fabric for deployment and servers setup and finally mongodb for data storage.&lt;br /&gt;
&lt;br /&gt;
I also quickly introduced mongodb:&amp;nbsp;&lt;a href="https://docs.google.com/present/view?id=dg3v9j47_212g2kvq2tv"&gt;https://docs.google.com/present/view?id=dg3v9j47_212g2kvq2tv&lt;/a&gt;&lt;br /&gt;
The main point I was trying to make was that in early development RDBMS strict&amp;nbsp;schema&amp;nbsp;just get in the way of fast development. It is a great tool for prototyping. I use it anytime at the beginning of a project because I don't know the final data model. Also my past experience is that every mature application that has an RDBMS is that the schema is totally crazy to work with. So why not start with a very flexible schema and give it some room to evolve as the application matures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5919332470267492824?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/V3lUqV9BfBc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5919332470267492824/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2011/10/presentation-on-cloud-deployment.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5919332470267492824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5919332470267492824?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/V3lUqV9BfBc/presentation-on-cloud-deployment.html" title="Presentation on Cloud Deployment &amp; Mongodb @ Charlotte Python Group" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2011/10/presentation-on-cloud-deployment.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMDQX47fSp7ImA9WhZaEkQ.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-345314250683420440</id><published>2011-06-12T09:40:00.003-04:00</published><updated>2011-06-28T15:47:50.005-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T15:47:50.005-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>Startup Cloud Cluster on a Budget</title><content type="html">&lt;div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;h3 id="internal-source-marker_0.9483688059262931"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Recently I have been working on a project that needed a highly available service. Since I have been pitching “the three pillars of a service: robust, fast and accessible”. With all the marketing hype around cloud computing and choices from something like Google AppEngine that provides a very restricted environment to something like Amazon AWS which just provides virtual hardware. The problem is that creating a service from scratch but I can’t live with the restrictions of something like AppEngine or Heruku nor do I want to spend a ton of time setting up something like AWS and Cassandra. This is a two part blog on setting up a robust, fast and accessible service in a few hours and for a very affordable price. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This blog will cover the concepts and overview of the solution and the technologies used for the implementation. The second blog will cover the configuration and deployment.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3-legged Table&lt;/span&gt;&lt;/h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I have come to the belief that for any service to compete it has to be supported by a three legged table where the legs are Robust, Fast and Accessible. Without any one of these the table is only valuable to produce heat in the fireplace.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Robust&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Web systems should not have “scheduled downtime”. I think that the convergence of two things have force us web developers to architect for 0 scheduled downtime. The first is to provide a 24/7 business platform for our users. The second is after launch the software is alive with continues updates until it gets turned off. Traditional business systems ran during business hours and then could be “maintained” from 5pm pacific time to 8am eastern time. There is a general move to a continuous updates of software where the more frequently the updates the more stable the system is and faster the technology can adjust to the business need (I am a fan). &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Fast&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Usage can be directly correlated to the performance of a service. In a competitive market slow services will not be able to compete. Premature optimization has been the road to ruin of many a project but the ability to quickly optimize the service after launch will decide the success of the product. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Accessible&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The point of a service is for it to be access by users. One of the reasons I think that JSON became so popular is it simplicity. Again in competitive markets the barrier to entry approaches zero. This mean well document services that support 80% of the platforms (mobile, desktop ect) is a requirement to compete in the marketplace. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Tools&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Linux&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is a given for they types of service that I build. I could see a specific service that was for M$ that required using libraries that only work with Windows however I don’t image easy would be a part of that setup. Specifically I use Ubuntu however the configuration files / deploy script could very quickly be changed to use any Linux / BSD distribution. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://docs.fabfile.org/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;Fabric&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Fabric is a Python tool for doing system administrative tasks. There are a lot of tools that do this most are pretty specific I find this tool provides the best balance between easy of use and flexibility. The problem I have with shell scripts is they tend to be great to start with but quickly find the limits when needing to do some string manipulation. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://nginx.net/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;Nginx&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is my web server of choice at the moment. I don’t think this matters so much but it provides very simple and quick configuration which is key the the easy part of setting up a cloud. Ultimately most web service is going to run proxied by something like this that will do all the gzip compressing and static file serving ect.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://www.mongodb.org/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;MongoDB&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Mongo is one of those new fangled database under the NoSQL (not only SQL). I think it provides the most general purpose and easiest to setup. The console is very easy to manage data. However for this exercise the critical part was the two line configuration change difference between master and slave. This made failover very simple. I think that &lt;/span&gt;&lt;a href="http://redis.io/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;redis&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; would have also been as easy and the configuration probably as simple but I liked having some of mongo’s mixtures of traditional and modern features like having indexes and map/reduce support.&lt;/span&gt;&lt;img height="606px;" src="https://lh6.googleusercontent.com/TAOdUFqnl12ucbK-ZUrZfzTEwmNpVr1UEr5kyUBZygtjPkj8RD46FgSbPgRQP1hoccKYoW_uiS67pykScVuC24bssN-qkw7VIEsnLRs7DYmhdzqzBGk" width="648px;" /&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Architecture&lt;/span&gt;&lt;/h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;In this case I am using a load balancer &lt;/span&gt;&lt;a href="https://docs.google.com/document/d/1MgBaIIk1bU8_ZUh9LweqCCU4mQWjJcg8uMIO-nUUw1I/(http://www.rackspace.com/cloud/cloud_hosting_products/loadbalancers/technology/)"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;(http://www.rackspace.com/cloud/cloud_hosting_products/loadbalancers/technology/)&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; which I am not exact sure the specifics but they suggest only need to configure one load balancer it is automagically high availability. We also assume that the client that is talking to mongo has the proper settings that it will automatically roll over to the slave if the master goes down. There is not panacea we still could have a data center failure (as happend recently with Amazon cloud) so we might want to locate a slave replica in another data center ect. However I wanted to maintain a balance between highly available, easy to maintain, fast to setup and low cost. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 18pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Summary&lt;/span&gt;&lt;/h2&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;My goal to create a starter cluster or cloud infustructure that focused on highly available, setup in an hour, easy to maintain and most critically low cost solution. I have published a basically template code &lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;(&lt;a href="https://bitbucket.org/lateefj/easy_cloud"&gt;https://bitbucket.org/lateefj/easy_cloud&lt;/a&gt;)&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; white-space: pre-wrap;"&gt; which I will highlight the configuration in my next blog. This example setup that I have uses two virtual servers plus you would have to manually configure the load balancer (took me 2 minutes) but the base price is around 35$ a month which is mind blowingly low cost in time and money for what you get (YMMV this is the minimum it can cost with basically 0 &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;bandwidth&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; white-space: pre-wrap;"&gt; usage). I will be hosting all my projects soon on this type of setup soon so I can sleep better at night.&lt;a href="https://bitbucket.org/lateefj/easy_cloud"&gt;https://bitbucket.org/lateefj/easy_cloud&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-345314250683420440?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/xzV3wbNdsZU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/345314250683420440/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2011/06/startup-cloud-cluster-on-budget.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/345314250683420440?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/345314250683420440?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/xzV3wbNdsZU/startup-cloud-cluster-on-budget.html" title="Startup Cloud Cluster on a Budget" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.hackingthought.com/2011/06/startup-cloud-cluster-on-budget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCRX05fip7ImA9Wx9VE0w.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-4725329410781426175</id><published>2011-01-26T09:54:00.001-05:00</published><updated>2011-01-29T09:44:24.326-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-29T09:44:24.326-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Testing in Python with a bit of Django</title><content type="html">Gave a presentation last night (January 25, 2011) to the Charlotte Django and Python group. Base don the feedback I got from the last presentation I tried to change things up. Mainly by using only 4 slides (including title slide) and lots of code. Which I basically just went though writing a test on a django model.&lt;br /&gt;
&lt;br /&gt;
Slides:&amp;nbsp;&lt;a href="https://docs.google.com/present/edit?id=0Af1-cNaYamXFZGczdjlqNDdfMTk4ZGN3dmZod24&amp;amp;hl=en"&gt;https://docs.google.com/present/edit?id=0Af1-cNaYamXFZGczdjlqNDdfMTk4ZGN3dmZod24&amp;amp;hl=en&lt;/a&gt;&lt;br /&gt;
Code:&amp;nbsp;&lt;a href="https://bitbucket.org/lateefj/py_testing/overview"&gt;https://bitbucket.org/lateefj/py_testing/overview&lt;/a&gt; (still have to fix views.py)&lt;br /&gt;
&lt;br /&gt;
The best part was the discussion (as always). I would love to do a full day on this which would include setting up buildbot and selenium.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-4725329410781426175?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/sUZHwUFun3E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/4725329410781426175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2011/01/testing-in-python-with-bit-of-django.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/4725329410781426175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/4725329410781426175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/sUZHwUFun3E/testing-in-python-with-bit-of-django.html" title="Testing in Python with a bit of Django" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2011/01/testing-in-python-with-bit-of-django.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcDQX45eip7ImA9Wx9WGEo.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-2675177554608619768</id><published>2011-01-24T09:07:00.000-05:00</published><updated>2011-01-24T09:07:50.022-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-24T09:07:50.022-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking" /><title>Erlang First Impressions</title><content type="html">I attended an Erlang training Saturday January 22, 2011 taught by &lt;a href="http://weblog.hypotheticalabs.com/"&gt;Kevin Smith&lt;/a&gt;&amp;nbsp;(&lt;a href="http://twitter.com/kevsmith"&gt;twitter&lt;/a&gt;) of much Erlang fame. I first met him last year when he did an &lt;a href="http://wiki.basho.com/"&gt;Riak&lt;/a&gt; presentation to the Charlotte Ruby group. Anyway he is an excellent instructor (maybe a couple to many emacs plugs ;) and it was an amazing class. It was so good I feel like my brain is a little hung over from the experience (or maybe the beer we had after). In an effort to try to medicate I figured I would write up my thoughts.&lt;br /&gt;
&lt;br /&gt;
The good:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Concurrency #1 implementation detail&lt;/li&gt;
&lt;li&gt;Runtime reload of code&lt;/li&gt;
&lt;li&gt;Shell&lt;/li&gt;
&lt;li&gt;Atoms&lt;/li&gt;
&lt;li&gt;Pattern matching parameter over loading / conditional methods&lt;/li&gt;
&lt;li&gt;Message passing as core part of language is easy and wonderful&lt;/li&gt;
&lt;li&gt;Monitor / Subervisor to restart services that fail&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;The bad:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Strings (this is pretty bad since it is the most used datatype)&lt;/li&gt;
&lt;li&gt;Contextual termination ",", ";", "." can all terminate a line / function (I almost like it but don't)&lt;/li&gt;
&lt;li&gt;Syntax is 30 years old and has not aged well&lt;/li&gt;
&lt;li&gt;Immutable types&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Erlang make concurrency very easy in some ways by making a lot of other programming very difficult. Writing simple service oriented things like key/values stores or simple, reliable CRUD task it is perfect for. Where as for algorithms, string processing and other complex operations it is a poor solution for.&amp;nbsp;Unfortunately&amp;nbsp;I don't have many concurrent distributed problems where the difficult part is getting the concurrency right. However I now understand why databases like CouchDB and Riak are written in erlang. At the moment I am not writing a lot of simple services however I can see how it would be helpful in the future for simple services.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-2675177554608619768?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/FieBkfLeWv4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/2675177554608619768/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2011/01/erlang-first-impressions.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2675177554608619768?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2675177554608619768?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/FieBkfLeWv4/erlang-first-impressions.html" title="Erlang First Impressions" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.hackingthought.com/2011/01/erlang-first-impressions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QERXs9eSp7ImA9Wx5bF0g.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-495999269697930704</id><published>2010-11-02T23:35:00.000-04:00</published><updated>2010-11-02T23:35:04.561-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-02T23:35:04.561-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Shelving Java and OS X</title><content type="html">&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;History.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;The nature of the relation I have as a developer is changing with Mac the operating system that I use for development and Java which is currently the language I used second most (could have been #1 but lets not get ahead). I wrote my first Java back in 1998 where I locked myself in a basement to teach myself a programming languge. I started professionally using OS X back in 2003 or so. At the time I was developing J2EE deployed in a JBoss container.&amp;nbsp; So pretty much I have been developing on Mac the last 7 years and Java for 12.&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Why Java?&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;I taught myself Java in college for a couple reasons:&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp; * The compiler was free&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp; * Easier and faster development than C/C++&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp; * Cross platform&lt;/div&gt;&lt;div class="p1"&gt;All in all I am really happy it gave me a good 10 years of employment and I learned a lot more about software development than if I was focusing on keeping track of seg falts, memory and pointers. Sun slapped an @depricated on Java when it decided to never open source it. Sun and friends controlled the language basically killing the evolution of the language. Even though it did make Java very popular in the enterprise market for new products as well as replacing mainframes. As I saw the companies that control Java (mainly Sun) could send an army of typing monkeys to build their products on. My developer interests were for the language to continue to evolve so that I could maximize productivity and have fun. I think if Java was open sourced a couple years back, then it would meet more of my developers interests. On the plus side my experience with writing Java software means a lifetime of work even though the mindshare of developers is waving good bye (hopefully that is including me).&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Why Mac?&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp;&amp;nbsp; * Unix, a decent terminal and all the wonderful developer tools&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp;&amp;nbsp; * Hardware support so plugin monitor and it works, or usb drive or projector&lt;/div&gt;&lt;div class="p1"&gt;&amp;nbsp;&amp;nbsp; * Pretty does matter even as a developer I would rather work on something that is not hurting my eyes&lt;/div&gt;&lt;div class="p1"&gt;The last couple of years with the Mac has been a lot of fun. Even when I decided to get a Apple laptop I always thought the move was somewhat temporary and that in a couple years the Linux desktop would catch up and I would switch back. OS X was a great transition not only because it solved a lot of the hardware issues like plugging in second monitor just works, a unix shell and the list of Windows issues (most of which still exist on Windows 7) to many to mention. Back in the early 2000’s Apple was providing an attractive option. Even though OS X has stagnated since Leopard was release for obvious reasons of the devices that start with an ‘i’ Apple has been changing its attitudes toward developers. My current running theory is that it has something to do with the fact that they have vendor locked a lot of developers via the iPhone. I do write some mobile apps but I do it on Android (it was not rocket science to predict a much larger market share to Android years ago) and I am mostly interested in web applications. I can’t blame Apple for not caring about the small group of developers who they do not make money off of via iTunes app or will not be making money off of. We ultimately are just a small niche user group with really loud mouths ;). Apple got the boost it needed to get back into the game with FreeBSD and focused on a good product and the succeeded. If Apple sees the future as selling consumer devices and making a cut on the software it is distributing to the consumer what can I say I am envious.&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Java on Apple doesn’t matter.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;Apple’s future is on devices and software righten in a platform they control which is currently Objective-C. The more they control the market place and the platform the more value they see they are adding for their customer and I guess they can rationalize charging for it? I am not high and mighty I purchased a Wing IDE license because it save me time and ultimately makes me more valuable. I am a believer paying for software (it is nice to eat). Even I think the small amount for the OS X platform was a good deal with all the software it came with. As a developer the more open the platform / language / environment is the more creative and possibilities there are for me to create value. That is why the web is so awesome. Creative freedom seem to have pass by both Java and Apple these days and that is why Java or Apple or Java on Apple doesn’t matter.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;What operating system then?&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;Short answer: I am working on it. &amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;Long Answer:&lt;/div&gt;&lt;div class="p1"&gt;Windows being the master of the closed platform that is not an option. From what I have seen and played with on Ubuntu the platform seem solid and the hardware issues are no worse than on any of the other Linux distros. They have a really great package management system. The Unity UI looks pretty enough for my needs.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;What about a programming language?&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;Programming language is less clear. I can use Python for most of the backend programming I need to do. Since web development is mainly IO bound with rare exception I can use Python. I use hand coded Javascript only for trivial things where I only need a couple lines. GWT has pretty much converted me into thinking that it is the way to go for web application so I need something that fast enough to be able to render optimized Javascript. As Java currently also supports Android it would be nice if I could learn one language to do all the frontend development.&amp;nbsp;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;Erlang?&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;Erlang sound fantastic for distributed server side coding. I don’t have much need for writing distributed server things like databases. Sometimes I need to hack a little Python web service and maybe a bit more but I really don’t have a use case unless I start hacking databases.&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;Foo on JVM?&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;JVM derived language. Really, I mean really?&amp;nbsp; If any of those languages get ported to another VM that is _OPEN_ we can talk until then GOTO @depricated Java.&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;C# (mono)?&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;C# (mono) might not be a bad option for the near term. There is an Android port for mono already &lt;a href="http://monodroid.net/"&gt;http://monodroid.net/&lt;/a&gt; even if the tutorial talks about using it in visual studio this could be a contender. As far as GWT replacement &lt;a href="http://projects.nikhilk.net/ScriptSharp"&gt;http://projects.nikhilk.net/ScriptSharp&lt;/a&gt; S# or script# is the only thing that comes up when I google it. Will this be an open solution for the long term? Will Microsoft decide to do what Oracle and Apple are doing now? I don’t see this as a long term solution because of the risk of it ending up in the same place.&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;Golang?&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;Golang (Go) is the the language I like the most however it is in such a primitive stage. On the plus side the language was created by sponsored by Google and both Android and GWT are basically Google open source projects. As much as I would rather not look to another company academia doesn’t seem to be interested in creating programming language (or significantly contributing to open source projects) for developers like myself who are on the ground.&amp;nbsp;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Filling the vacuums.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;The Mac vacuum is a relatively small gap to fill since we (open source community) will probably just need to tweak an existing solution. The Java vacuum is much larger one. Java was successful as a backend tool where I think golang and I get the impression erlang could fill. On the frontend I have noticed that Wing IDE written in Python is so much faster than Eclipse or Netbeans (not that this is news).&amp;nbsp; &lt;a href="http://pyjs.org/"&gt;http://pyjs.org/&lt;/a&gt; is a nice port of GWT to Python which means that Python could be a good replacement for both frontend and backend. I think there is still a need for a statically compiled GUI language.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-495999269697930704?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/Qs1ABCHUSKc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/495999269697930704/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/11/shelving-java-and-os-x.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/495999269697930704?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/495999269697930704?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/Qs1ABCHUSKc/shelving-java-and-os-x.html" title="Shelving Java and OS X" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/11/shelving-java-and-os-x.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMQXs8fCp7ImA9Wx5UFEQ.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5525501167749195223</id><published>2010-10-18T18:43:00.001-04:00</published><updated>2010-10-19T10:13:00.574-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-19T10:13:00.574-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="async" /><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Enlightenment though eventlet</title><content type="html">I did a &lt;a href="http://blog.hackingthought.com/2010/08/nonblocking-async-tornado-presentation.html"&gt;presentation on Tornado Web&lt;/a&gt; to the local Python user group a couple weeks ago. There is one annoying thing about Tornado and one show stopper for most development. Tornado&amp;nbsp;depends on&amp;nbsp;pycurl for doing client request which is pretty strange since the core module can do client and server sockets. For any nonblocking to work with Tornado it has to have an implementation using the core Tornado library. So out goes all legacy clients that use Python sockets (very few use nonblocking sockets).&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Blinded By Idealism&lt;/span&gt;&lt;br /&gt;
My first impression was that monkey patching the standard library was ugly. In reality this makes eventlet usable for legacy projects as well as very simple to write backward libraries that support both blocking and nonblocking. I was caught in the idealism trap where I wanted a clean paradigm to exist though the entire stack.&amp;nbsp;Re-implementing&amp;nbsp;all socket libraries is to large a barrier to change mindshare that nonblocking is a better programming paradigm. Especially if the new implementation is dependent on a non standard library like Tornado, Twisted ect.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;a href="http://eventlet.net/"&gt;Eventlet&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
The&lt;a href="http://us.pycon.org/2010/conference/schedule/event/128/"&gt; PyCon 2010 presentation&lt;/a&gt;&amp;nbsp;is excellent overview. Bottom line eventlet provide a synchronous interface to nonblocking io or can just write&amp;nbsp;nonblocking&amp;nbsp;io using coroutines. Eventlet is mature, stable, fast and documented. This makes it very usable right now using existing libraries and the benefit of the improved paradigm/performance can be taken&amp;nbsp;advantage&amp;nbsp;of without much code change. Also as I have had more time to use Go and it concurrency model I am realizing the power of coroutines in any language.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;In Practice&lt;/span&gt;&lt;br /&gt;
This all came about because I needed to write something that would traverse a site and validate the responses based on content type and regexes. Things like correct encoding to making sure the proper data is being displayed on a specific url. So a spider with validators that can be hooked in based on a regex or content type. Writing the test code I was able to create a eventlet server and have it output data so that I could test that the full stack of the spider code.&lt;br /&gt;
&lt;br /&gt;
Yet again I learn though my mistakes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5525501167749195223?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/TkbfLsyL-es" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5525501167749195223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/10/enlightenment-though-eventlet.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5525501167749195223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5525501167749195223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/TkbfLsyL-es/enlightenment-though-eventlet.html" title="Enlightenment though eventlet" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/10/enlightenment-though-eventlet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAAR385eyp7ImA9Wx5WE0s.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-6236713174758547473</id><published>2010-09-24T18:19:00.000-04:00</published><updated>2010-09-24T18:19:06.123-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-24T18:19:06.123-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>Lawyers trade marked me!</title><content type="html">Well first time for everything I suppose. I built this widget which new name will is HT Walkability Score since the old name is trade marked but I can link to the website &lt;a href="http://walkscore.com/"&gt;walkscore.com&lt;/a&gt;. Since this was just a hobby project and something I enjoyed doing and just kicking around to continue to improve my Android skills it is no big deal. I suppose they are about to build there own or something because other wise they wouldn't really care that much I am guessing. Hoping they will ring me up to work on it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-6236713174758547473?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/zZeZLpfOZo0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/6236713174758547473/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/09/lawyers-trade-marked-me.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6236713174758547473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6236713174758547473?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/zZeZLpfOZo0/lawyers-trade-marked-me.html" title="Lawyers trade marked me!" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/09/lawyers-trade-marked-me.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIEQ3cyeyp7ImA9Wx5XEUs.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5201444898231989940</id><published>2010-09-10T21:11:00.002-04:00</published><updated>2010-09-10T21:11:42.993-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-10T21:11:42.993-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>There was life before G1 and now there is life before Nexus One</title><content type="html">My Nexus One arrive today. Since I wrote &lt;a href="http://weruat.com/story"&gt;weruat.com&lt;/a&gt;&amp;nbsp;for the first &lt;a href="http://code.google.com/android/adc/adc_gallery/"&gt;Android Challenge&amp;nbsp;&lt;/a&gt;&amp;nbsp;of which I ended up just paying a chunk load of time. I got a G1 when they first came out and started to play around with some fun mobile applications. Last January I bought my wife a Nexus One (just love the idea of Freedom!). So I kind had an idea of what I was getting myself into.&lt;br /&gt;
&lt;br /&gt;
I didn't think I took for granted the Android Navigation but I think I was not using my phone because it had gotten so slow. It reminds me how important speed is for any software. I was starting to think I would use my phone less now that my Google Voice number ring in gmail so I just answer most calls with my headset. Then I realized how much dead time I have waiting for a meeting to start or end as the case may be.&lt;br /&gt;
&lt;br /&gt;
Just made me realize building a better mouse trap doesn't have to be innovative or more feature filled it could just be FASTER!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5201444898231989940?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/_tAxpVMNy4c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5201444898231989940/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/09/there-was-life-before-g1-and-now-there.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5201444898231989940?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5201444898231989940?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/_tAxpVMNy4c/there-was-life-before-g1-and-now-there.html" title="There was life before G1 and now there is life before Nexus One" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/09/there-was-life-before-g1-and-now-there.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cNQHs9eip7ImA9Wx5QE00.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-7130345466580542648</id><published>2010-08-31T21:38:00.000-04:00</published><updated>2010-08-31T21:38:11.562-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-31T21:38:11.562-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="async" /><category scheme="http://www.blogger.com/atom/ns#" term="nonblocking" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>NonBlocking (Async) Tornado Presentation for CharPy</title><content type="html">&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;NonBlocking (Async) Tornado&amp;nbsp;Presentation&amp;nbsp;for Charlotte Python Group&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
There are &lt;a href="https://docs.google.com/present/view?id=dg3v9j47_184fvtr8qgr"&gt;slides&lt;/a&gt; and &lt;a href="http://bitbucket.org/lateefj/tnio_presentation"&gt;example&amp;nbsp;code&lt;/a&gt;. I had a lot of fun making and giving this presentation. Got some good feedback and would like to give it again so I can continue to improve it and my presentation skill. Please give me feedback to&amp;nbsp;improve&amp;nbsp;the presentation or let me know if any other groups would be&amp;nbsp;interested&amp;nbsp;in it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-7130345466580542648?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/eU_mCNfEdsI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/7130345466580542648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/08/nonblocking-async-tornado-presentation.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7130345466580542648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7130345466580542648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/eU_mCNfEdsI/nonblocking-async-tornado-presentation.html" title="NonBlocking (Async) Tornado Presentation for CharPy" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/08/nonblocking-async-tornado-presentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBSX8yeip7ImA9Wx5SFkw.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5988311295837620911</id><published>2010-08-12T07:44:00.000-04:00</published><updated>2010-08-12T07:44:18.192-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-12T07:44:18.192-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="riak" /><category scheme="http://www.blogger.com/atom/ns#" term="golang" /><title>goriak API tweaks</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;My initial attempt at coding goriak was a mess (as expected). As I started adding read,write and links to the API I started to realize the failing of my modeling. The new API is based on a Document struct:&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Define a basic document to reduce API calls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;type Document struct {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Bucket string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Key string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Value []byte&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Links []*Link&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;JSONObject interface{}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;This encapsulates most of the values that I was passing as parameters to the functions. Since Riak is a key/value it is pretty straight forward that a Put(doc) will store the for the string Key the bytes in Value. However if JSONObject != nil then it will marshal it. This works in reverse for Get(doc) if the JSONObject != nil then it will unmarshal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// Definition of a link from one document to another&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;type Link struct {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Bucket string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Key string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Tag string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Link between documents is such a simple feature but is also very powerful. Using links can quickly turn a key/value database into a graph. Specifically with the linkwalking that will allow traversal of the graph. &amp;nbsp; &amp;nbsp;To support it I just had to parse and set the header "Link:". Both Put and Get now support storing or retrieving the list of Links associated with a document.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The API now:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PutWDWReturn(doc *Document, &amp;nbsp;w, dw int, returnObject bool)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Put(doc *Document)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;DeleteRW(bucketName, key string, rw int)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Delete(bucketName, key string)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;GetR(doc *Document, r int)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Get(doc *Document)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The methods with r,w,dw and rw are all wrappers around the Riak REST API. The default is to use whatever the bucket is configured for node&amp;nbsp;persistence&amp;nbsp;control. Since the expectation is the exception that to override the bucket default configuration I provide the wrapper like Get that&amp;nbsp;wraps&amp;nbsp;GetR to save typing.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Next on my list to implement is LinkWalking!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5988311295837620911?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/__yefMwGccA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5988311295837620911/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/08/goriak-api-tweaks.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5988311295837620911?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5988311295837620911?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/__yefMwGccA/goriak-api-tweaks.html" title="goriak API tweaks" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/08/goriak-api-tweaks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHRHwyeyp7ImA9Wx5TEk0.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-6498138721257363183</id><published>2010-07-27T00:07:00.000-04:00</published><updated>2010-07-27T00:07:15.293-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-27T00:07:15.293-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="riak" /><category scheme="http://www.blogger.com/atom/ns#" term="golang" /><title>Goriak uploaded code to the public</title><content type="html">&lt;a href="https://code.google.com/p/goriak/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Goriak&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt; a &lt;/span&gt;&lt;a href="http://golang.org/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Go&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&amp;nbsp;(golang) library for the &lt;/span&gt;&lt;a href="http://riak.basho.com/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Riak&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt; database.&lt;/span&gt;&amp;nbsp;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Got enough time to learn enough Go to code up a basic key/value interface to Riak. It is still missing a couple of the REST API calls which I plan to implement over the next couple weeks. I figured it had enough work on it to share with the world and hopefully some one else can review my code and contribute to it. I originally looked to just contribute to another project but the only project I could find was &lt;a href="http://github.com/c141charlie/riak.go"&gt;riak.go&lt;/a&gt; and it didn't have as complete an implementation as I had. I was able to use a couple lines of &lt;a href="http://github.com/c141charlie/riak.go"&gt;riak.go&lt;/a&gt; and it really helped me implementing the Put function so I am really glad it is there. Also the author is really nice he is just going off to work on something else so I decided to create a new repository for the project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The current API has three functions:&lt;/div&gt;&lt;div&gt;GetBucket - Retrieves a Bucket type which contains all kinds of information about the bucket&lt;/div&gt;&lt;div&gt;Get - Marshals the JSON that is returned by the request into a the interface that is passed in.&amp;nbsp;&lt;/div&gt;&lt;div&gt;GetCAP - Same as get but support an option for the number of nodes that need to agree before returning&lt;/div&gt;&lt;div&gt;Put - Unmashals the type passed in and uploads it to the server&lt;/div&gt;&lt;div&gt;PutCAP - Same as Put but can specify the number of nodes that need to write the json&lt;/div&gt;&lt;div&gt;Delete - Removes the object from the cluster&lt;/div&gt;&lt;div&gt;DeleteCAP - Same as above but can specify number of nodes to delete it from&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I still need to implement MapReduce, LinkWalk, Ping and ServerStatus. These should come over the next couple weeks as I get time to spend on them. MapReduce being the only non trivial one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I did start to experiment with some concurrent access patterns. The first I call BackgroundWait which can make Get or Put which return a request id. The responses are stuffed in a channel until the code calls Wait(requestId). Instead of waiting for every single request it can do many requests at the same time and just wait when required. This reduces the number of choke points. Assuming web applications do something like this:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Check Authentication&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Application configuration / setup that where user is not required&lt;/li&gt;
&lt;li&gt;Based on user / permissions additional data is requested&lt;/li&gt;
&lt;li&gt;Possible a second round of data based on application data&lt;/li&gt;
&lt;li&gt;Response returned&lt;/li&gt;
&lt;li&gt;Logging&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;As the use of key/value and document databases increase I think this will be more important to maximize backend performance. Riak ability to scale up both for reading and writing allows for this type of access pattern&amp;nbsp;similarly&amp;nbsp;to memcached. I don't know of any RDMBS (maybe VoltDB?) that could handle a large number of concurrent requests since they have very constrained IO or process (thread) resources. It is a lot of fun to think about ways that increase IO distribution could mean potential new access patterns for low latency data access.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Would be happy for any help, code review and contribution much appreciated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-6498138721257363183?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/SfaM22oWI_o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/6498138721257363183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/07/goriak-uploaded-code-to-public.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6498138721257363183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6498138721257363183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/SfaM22oWI_o/goriak-uploaded-code-to-public.html" title="Goriak uploaded code to the public" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/07/goriak-uploaded-code-to-public.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHQHw9cSp7ImA9Wx9RFU0.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-2649548274472861882</id><published>2010-07-20T16:48:00.001-04:00</published><updated>2010-12-16T08:30:31.269-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-16T08:30:31.269-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="golang" /><title>Concurrently golang programming</title><content type="html">I would guess like most developer my first exposure to concurrency was in my parallel programming class in college. MPI and PVM where rather painful libraries to C/C++ experiences to cute my teeth on but it was a very exciting and rewarding experience. When I started writing Java thread programs there was an uneasy sense that parallel programming couldn't be this easy (after all the locks and&amp;nbsp;synchronous&amp;nbsp;calls there wasn't many operations running in parallel) but it sure was a lot of fun. In Python I found threads to be crazy simple but only useful for IO wait and loving miltiprocess programming. &lt;a href="http://www.parallelpython.com/"&gt;Parallel Pytho&lt;/a&gt;n was the only thing that actually provided the same true parallelism as the original MPI and PVM but was also amazingly simple. Goroutines (coroutines) make me never want to see thread programming again. The killer combination of channels (kinda like a queue in the thread world) and coroutines are really enjoyable to code compared to threads and queues.&lt;br /&gt;
&lt;br /&gt;
Currently I am working on creating a library for golang to talk to &lt;a href="http://riak.basho.com/"&gt;riak&lt;/a&gt;. If multiple request need to be made then they can be done using goroutines. Thus reducing round trip wait time. Depending on IO limitations this could increase the speed of web pages that need multiple resource for a specific url. For things like memecache and very fast datastores this would work great. The downside is that potential overloaded IO situations would be made much worse by the increase number of connections. This would probably limit to nonblocking IO datasources which most new datasources can handle a large number of connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-2649548274472861882?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/rsDSJxh5yt8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/2649548274472861882/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/07/concurrently-golang-programming.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2649548274472861882?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2649548274472861882?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/rsDSJxh5yt8/concurrently-golang-programming.html" title="Concurrently golang programming" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/07/concurrently-golang-programming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQCSX84fip7ImA9WxFUGU4.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-8004015093637308550</id><published>2010-06-30T18:19:00.000-04:00</published><updated>2010-06-30T18:19:28.136-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-30T18:19:28.136-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="golang" /><title>First Impressions of golang</title><content type="html">&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Another language?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
Yep &lt;a href="http://golang.org/"&gt;golang&lt;/a&gt; or just go depending if you want to find anything from a search result. For me I write mainly in Python, Java, Javascript. Python as my GOTO (pun intended) language because I can write thing extremely quickly and sometimes even cleanly. Java for embedded platforms and GWT. Javascript the language of the web so that mean almost all developers use it (or should be). It is inevitable that a new language will replace older ones but I think there are two things that might have delayed the creation of golang and&amp;nbsp;ultimately&amp;nbsp;what I intend to use it for.&lt;br /&gt;
The first and largest is if Java continued to evolve not just its libraries but significant syntactical changes. Java from a completeness of implementation is great and the toolset is wonderful. Java requires way to much code volume. Code generators help however the code that is not generated has to access a majority of the generated code and no matter what there is a feeling of bloat. All the performance improvements in Java have yet to make development feel faster.&lt;br /&gt;
The second thing is Objective-C lack of popularity. Maybe because like Darwin it has a kinda of open source aspect to it but really the only significant implementation is&amp;nbsp;proprietary&amp;nbsp;implementation by Apple. Even though the IPhone has help its popularity it has reduced it&amp;nbsp;openness&amp;nbsp;and reduced its ability to become a general purpose language.&lt;br /&gt;
Golang fate could be&amp;nbsp;similar&amp;nbsp;because Google could be the Sun of Java (even more bad&amp;nbsp;punning) or the Apple of Objective-C. Golang is not currently on that projection but I would not rule it out as a&amp;nbsp;possibility.&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Golang's Niche&lt;/span&gt;&lt;br /&gt;
I would like golang to replace everything I use Java and Objective-C. There is a lot of Python code that I think should be in a statically typed language but for various reasons mainly time I will note rewrite but golang would be great. Even though golang is very productive to develop in for a static language, on occasion my face slams into STATIC TYPE. For real stable API's that could have a real a large amount of dependent code I can see it will fit nicely. Until I get proficient with it I am going to try to keep working with it on simple projects.&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Tasty Features&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Terse Syntax&lt;/b&gt;&lt;br /&gt;
With exceptions of languages like Perl less typing is better. Golang shines in this manner. It is the most&amp;nbsp;terse&amp;nbsp;static typed language I have ever programmed in. Refreshing from a Java perspective and surprisingly close to Python.&lt;br /&gt;
&lt;b&gt;Type System&lt;/b&gt;&lt;br /&gt;
I must say I really loved C when I first learned about stucts and header files to define functions. There is something really solid about the type system that I haven't felt since a C header file except more terse. Make me never want to see another Java interface in my life.&lt;br /&gt;
&lt;b&gt;Channel&lt;/b&gt;&lt;br /&gt;
I am a bit of a server&amp;nbsp;performance&amp;nbsp;geek and well what can I say channels are just awesome. I have yet to write any code with channels but it is one of the things I am most excited about. I plan to use it when I write a golang driver for Riak. I would like to write a WSGI inspired web server in golang that I could access from Python and that is where I look forward to testing the mettle of channels.&lt;br /&gt;
&lt;b&gt;Testing&lt;/b&gt;&lt;br /&gt;
When it come to code it is all about "hitting the ground testing". The development tool gotest makes this fast and easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-8004015093637308550?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/S4MEj7OJZ2c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/8004015093637308550/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/06/first-impressions-of-golang.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/8004015093637308550?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/8004015093637308550?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/S4MEj7OJZ2c/first-impressions-of-golang.html" title="First Impressions of golang" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/06/first-impressions-of-golang.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MASXs_cSp7ImA9WxFVEkQ.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-2010429176801676842</id><published>2010-06-11T17:24:00.000-04:00</published><updated>2010-06-11T17:24:08.549-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-11T17:24:08.549-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Walkscore Widget with Ads!</title><content type="html">So my adventure into mobile development continues. The new version of Walkscore Widgets has ads!&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gdF4RvqRiIw/TBKosOBJxLI/AAAAAAAAE3E/-Apnyvd7MaM/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_gdF4RvqRiIw/TBKosOBJxLI/AAAAAAAAE3E/-Apnyvd7MaM/s320/device.png" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The widget didn't change much. The app got a lot of features besides Ads (going to need to support my habit of writing code somehow). Progress bar and better messaging to explain why a lookup failed. The progress bar was difficult until I figured out that threads are really needed for good UI development. Over all I am pretty happy about it. As always I figured out more features I would like to add and I had a bug fix 24 hours after the release but in general I am much happier. Still could use some graphic design help but maybe the next app...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-2010429176801676842?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/5W1mJYY3KNc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/2010429176801676842/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/06/walkscore-widget-with-ads.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2010429176801676842?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/2010429176801676842?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/5W1mJYY3KNc/walkscore-widget-with-ads.html" title="Walkscore Widget with Ads!" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_gdF4RvqRiIw/TBKosOBJxLI/AAAAAAAAE3E/-Apnyvd7MaM/s72-c/device.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/06/walkscore-widget-with-ads.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQCQ304fSp7ImA9WxFVEk0.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-3496744671002147106</id><published>2010-06-10T16:39:00.000-04:00</published><updated>2010-06-10T16:39:22.335-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-10T16:39:22.335-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><title>It is good to be a geek (me)!</title><content type="html">As I sit in a franchise&amp;nbsp;restaurant&amp;nbsp;waiting for an Android developer group meeting I realize that there are people envious of my coding skills. I can't believe I take for granted the decade I have spent learning Java, Python, C, SQL, Javascript, Linux, OS X, Android ect. Makes my current frustration trying to get an Android progress bar seem&amp;nbsp;ridiculous. Going to Google I/O and spending time in coffee shops where everyone is using modern technology has made me&amp;nbsp;complacent. I think I just saw someone using OUTLOOK! I mean who uses Outlook never mind exchange any more? Ok back to progress bar land with a lot less frustration and complacency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-3496744671002147106?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/PHMm7fxkKfM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/3496744671002147106/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/06/it-is-good-to-be-geek-me.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/3496744671002147106?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/3496744671002147106?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/PHMm7fxkKfM/it-is-good-to-be-geek-me.html" title="It is good to be a geek (me)!" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/06/it-is-good-to-be-geek-me.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHSHc4fSp7ImA9WxFXE0U.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5033912668657697969</id><published>2010-05-20T15:45:00.000-04:00</published><updated>2010-05-20T15:45:39.935-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-20T15:45:39.935-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><title>GWT is great except for that pesky little Java problem.</title><content type="html">First Java is really the only language option in the current language options. During the Google I/O keynote GWT actually mentions a spring tool that generates boiler plate code. This is&amp;nbsp;ultimately&amp;nbsp;my problem with Java it is not expressive enough. With some exceptions (low level languages like C) this is a FAIL mode for any language. Just can't beat the GWT UX though from performance to maintainability.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5033912668657697969?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/kS63zBPK5z0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5033912668657697969/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/05/gwt-is-great-except-for-that-pesky.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5033912668657697969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5033912668657697969?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/kS63zBPK5z0/gwt-is-great-except-for-that-pesky.html" title="GWT is great except for that pesky little Java problem." /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/05/gwt-is-great-except-for-that-pesky.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYBRHc7eyp7ImA9WxFSFEs.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-6533593192109080634</id><published>2010-04-16T09:21:00.002-04:00</published><updated>2010-04-16T21:35:55.903-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-16T21:35:55.903-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>Cloud application (AppEngine) or server (Rackspace, amazon)?</title><content type="html">Flexibility&amp;nbsp;vs Productivity vs Creativity&lt;br /&gt;
&lt;div&gt;Starting out building an application the thing we don't know is the path the application is going to go. Like the &lt;a href="http://en.wikipedia.org/wiki/CAP_theorem"&gt;CAP theorom&lt;/a&gt; that states pick two of the three options (Constancy, Availability, Partition&amp;nbsp;Tolerance) we have to pick two of Flexibility, Productivity and Creativity.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Take Hardware Off The Table&lt;/div&gt;&lt;div&gt;We have enough to worry about with all the laptops, monitors and cell phones but add rack of servers and we are really not happy. These type of resources are also very cost&amp;nbsp;prohibitive&amp;nbsp;especially for a startup or poorly funded project. Physical servers, switches, battery backups, facility (with special sprinkler system), security systems on physical access to equipment, power redundancy, network&amp;nbsp;redundancy&amp;nbsp;and capacity are all things that are enjoyable engineering tasks but a complete distraction from focusing on the project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Hosted Server Overhead&lt;/div&gt;&lt;div&gt;Amazon user experience for managing servers is horrible so I am only going to talk about what I think the viable option is something like Rackspace. Come down to 3 things:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Setup - still need to manage configuration and setup of all the services that are running database, web servers ect. Even a small deployments can get complex quickly and require lots of resources.&lt;/li&gt;
&lt;li&gt;Deployment - getting code actually onto the servers (this is harder than it sounds especial with web servers, databases, message queues ect)&lt;/li&gt;
&lt;li&gt;Scaling - If your application is at all useful then people will want to use it and so you will need to figure out how to add more web servers, databases (RDBMS big piles of pain and expensive consultants licking there lips)&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Hosted Application Constraints&lt;/div&gt;&lt;/div&gt;&lt;div&gt;AppEngine since that is the most popular and I have and am currently using I will point out some of the issues.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Development and testing can only use a very limited sample data set because of the way the development&amp;nbsp;environment&amp;nbsp;is.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Simple and easy crojob that &lt;a href="http://code.google.com/appengine/docs/python/taskqueue/"&gt;taskqueue&lt;/a&gt;&amp;nbsp;is not. (probably going to end up using cron hitting a url anyway)&lt;/li&gt;
&lt;li&gt;It is very expensive when the traffic hits!&lt;/li&gt;
&lt;li&gt;Limited on which software libraries can use!&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;How about Hybrid&lt;/div&gt;&lt;div&gt;What constraints that AppEngine places will limit creativity and flexibility however is very productive. Rackspace allows for maximizing&amp;nbsp;flexibility&amp;nbsp;and creativity on tools to solve the problem but puts a large&amp;nbsp;burden&amp;nbsp;on productivity. A hybrid approach might be exactly what the doctor ordered. Starting out with AppEngine and migrating to a solution like Rackspace as the needs arise to be more flexible and creative.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-6533593192109080634?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/uvFP-yMDbqc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/6533593192109080634/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/04/hosted-application-appengine-or-server.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6533593192109080634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6533593192109080634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/uvFP-yMDbqc/hosted-application-appengine-or-server.html" title="Cloud application (AppEngine) or server (Rackspace, amazon)?" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/04/hosted-application-appengine-or-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ECQnk6fip7ImA9WxFTFkk.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-753838473680077499</id><published>2010-04-07T09:06:00.001-04:00</published><updated>2010-04-07T09:07:43.716-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-07T09:07:43.716-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Everyone codes!</title><content type="html">At Pycon 2010 the last day Keynote&amp;nbsp;(&lt;a href="http://pycon.blip.tv/file/3332807/"&gt;video here&lt;/a&gt;)&amp;nbsp;was given by &lt;a href="http://theonda.org/pages/antonio"&gt;Antonio Rodriguez&lt;/a&gt; and I really dug his presentation. Since then I have been thinking about how to enable everyone in an organization to write code. It seem obvious that us coders / managers would want to enable everyone in the organization to have the tools to solve thier own problems.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;So like how&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;?&lt;/span&gt;&lt;br /&gt;
Well there are some technologies/methods that I think are converging that in combination could make it much easier to develop features, reports ect in.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://bespin.mozillalabs.com/"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Bespin&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
First thing we need is an editor and&amp;nbsp;environment&amp;nbsp;for all these new developers in our organizations. Reasons I think Bespin is the right solution for this:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Browser based: so don't have to set up client(s) on X machine&lt;/li&gt;
&lt;li&gt;Extensible: Seem like it is pretty easy to extend to support what ever custom needs of setup there might be&lt;/li&gt;
&lt;li&gt;Hosted: If it is running in the cloud and need more instances to support more users easy. Development&amp;nbsp;environment&amp;nbsp;can be managed centrally. Maybe even on demand?&lt;/li&gt;
&lt;li&gt;Sharing: Code review, training and help can be giving though the tools provided.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Simple Data Model&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Normalization is not the friend of a simple data model. This came to me because I designed an address book many years ago and recently I was trying to explain this to someone who could solve their own problems. So a table of user that has a contact where a contact has a list of email address. So to get a users email address need to write a join with 3 tables. Sure could create a view for this, but then when they find an issue how will they modify the record?&lt;br /&gt;
Document databases with map/reduce I think lends itself to creating simpler data models. Because:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Most computer users think of databases as documents. There is probably more data in spreadsheets than in RDBMS. So this will be comfortable for them.&lt;/li&gt;
&lt;li&gt;Document database model tend to be less normalized and thus not having to traverse many documents to find things like email addresses. (Side note that &lt;a href="https://wiki.basho.com/display/RIAK/Links"&gt;Riak links&lt;/a&gt; are a darn good way to traverse documents)&lt;/li&gt;
&lt;li&gt;Map/Reduce is simple and easy to understand conceptually. SQL is a mind bending to switch from a modern programming language like Javascript or Python to one from the 70's.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Better API's&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;There is a big difference when writing an API for internal development team vs for a third party. My memory is not very good so a couple months down the road I have to read way to much code to use my own API's. It has come to me because I was writing the original code just for core developers.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;A question of language?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I would like to say that Python is the best choice. I know it would have the fastest learning curve but there are some downsides. I think right now Javascript has a leg up for this type of implementation.&lt;/div&gt;&lt;div&gt;Javascript&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Upside:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Web is the unifying platform and Javascript is the language of that platform.&lt;/li&gt;
&lt;li&gt;Map/Reduce javascript is supported in Mongo, CouchDB, Riak which are the document databases that come to mind for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Downside:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Is not an easy&amp;nbsp;language&amp;nbsp;to quickly learn how to use and play with. Would need to use something like &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Small community of backend development.&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Python&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Upside:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Very easy to learn and experiment with in terminal.&lt;/li&gt;
&lt;li&gt;Has lots of web backend supported libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Downside:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Map/Reduce with Python would need to be something like &lt;a href="http://www.zodb.org/"&gt;ZODB&lt;/a&gt; which has a lot of other pitfalls.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Would need to use &lt;a href="http://pyjs.org/"&gt;pyjamas&lt;/a&gt; or something like it for front end. As I have been writing a lot of GWT (in Java) this is not a short learning curve.&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
Maybe I am underestimating these new coders and they can handle a mixture of Javascript and Python just fine.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Dreaming&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
So my pie in the sky for this solution would be a very scalable database like Riak with a Python map/reduce plus a WSGI Python and finally Javascript with jQuery. Python would cover most of the use cases (reporting, data management) and for the intern or advanced non developer could write Javascript to create a better end user experience. Now just need the time and money to create such a solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-753838473680077499?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/d8F5T6xKkDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/753838473680077499/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/04/everyone-codes.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/753838473680077499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/753838473680077499?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/d8F5T6xKkDs/everyone-codes.html" title="Everyone codes!" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/04/everyone-codes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMQ309eyp7ImA9WxFTFkw.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-22977063141645679</id><published>2010-04-06T23:24:00.000-04:00</published><updated>2010-04-06T23:24:42.363-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-06T23:24:42.363-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="riak" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>Riak Presentation at Charlotte Ruby meeting</title><content type="html">Saw an great introduction to Riak tonight. It is really an amazing product that is moving very fast. There where some surprises that I didn't realize that came along with the decentralized model. One of which is the inability to do averages. It is also very impressive how robust and potentially scalable Riak is. After the presentation I asked some of the more common questions and found out some things.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Pre and post commit hooks&lt;/span&gt;&lt;br /&gt;
Sounds like they are close to actually adding a pre and post commit hook. In RDBMS we would call these triggers. This came up when I was asking about making indexes easier to manage.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Distributed Indexes&lt;/span&gt;&lt;br /&gt;
I had read somewhere that they had been working on full index searches that worked just like all the other data stored in Riak. So I asked a bit more if that would also support regular indexes on that data so that performance could be greatly improved. The answer was it is in development but it will be a while before a production release is ready.&lt;br /&gt;
&lt;br /&gt;
Very exciting stuff. I am hoping to continue learning Riak and using it with my Python and Javascript projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-22977063141645679?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/K7_rXyzgbvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/22977063141645679/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/04/riak-presentation-at-charlotte-ruby.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/22977063141645679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/22977063141645679?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/K7_rXyzgbvw/riak-presentation-at-charlotte-ruby.html" title="Riak Presentation at Charlotte Ruby meeting" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/04/riak-presentation-at-charlotte-ruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEDQX4yfip7ImA9WxBaFk0.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5274366938720188500</id><published>2010-03-26T07:24:00.000-04:00</published><updated>2010-03-26T07:24:30.096-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-26T07:24:30.096-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><title>Out with Flextable and in with FlowPanel for the designer</title><content type="html">Thanks to a good friend and awesome web designer &lt;a href="http://www.dukeofcheese.com/"&gt;Wylie&lt;/a&gt; I have been cleaning up my GWT to make it more designer friendly. At first I was thinking maybe all this generated HTML is a really bad idea but I am starting to come around that it is much cleaner if the design is limited to just CSS changes. Wylie is great about pointing out poorly generated code:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gdF4RvqRiIw/S6uPSLM7kbI/AAAAAAAAE1c/Je_GVDWk3E8/s1600/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="299" src="http://1.bp.blogspot.com/_gdF4RvqRiIw/S6uPSLM7kbI/AAAAAAAAE1c/Je_GVDWk3E8/s640/Picture+2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
When I was originally trying to lay things out I was using GWT layouts that where creating lots of tables. FlowPanel to the&amp;nbsp;rescue&amp;nbsp;that is now using div tags. One of the glaring missing layout types in GWT are list type. Since HTML supports lists it is strange that GWT does not support them natively. I created a wrapper for a list in about 15 minutes. For my current project I am glad I picked GWT and for a full blown web app still think it is better than the alternatives. The big test will be how easy it integrates into the backend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5274366938720188500?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/ecKbkclVlcY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5274366938720188500/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/03/out-with-flextable-and-in-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5274366938720188500?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5274366938720188500?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/ecKbkclVlcY/out-with-flextable-and-in-with.html" title="Out with Flextable and in with FlowPanel for the designer" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_gdF4RvqRiIw/S6uPSLM7kbI/AAAAAAAAE1c/Je_GVDWk3E8/s72-c/Picture+2.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/03/out-with-flextable-and-in-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGR3szeSp7ImA9WxBbEks.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-6449062602587088578</id><published>2010-03-10T18:33:00.001-05:00</published><updated>2010-03-10T18:35:26.581-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T18:35:26.581-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Upgrade to Walkscore Widget</title><content type="html">As with most things a good does of FAIL makes things better. So why not make a list of all the things that I did wrong.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Ugly is not OK. Sure in development land ugly works but users don't use ugly crap with maybe a few exceptions like myspace.&lt;/li&gt;
&lt;li&gt;Small is good. Especially on a mobile phone's home screen. Yep my widget was taking up twice the space it needed. I ended up having to create a full activity to do this but such is life.&lt;/li&gt;
&lt;li&gt;Noise. Basically I had some&amp;nbsp;additional&amp;nbsp;text to help explain that they could not get walkscore if they had disabled the phones ability to locate them. Now that I added the feature to lookup any address they can have all phone location disabled and still use walkscore from the phone.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gdF4RvqRiIw/S5gqxl2dJYI/AAAAAAAAE1A/CuibjcNX6So/s1600-h/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_gdF4RvqRiIw/S5gq5lMR5rI/AAAAAAAAE1I/L5zY1bR_nl4/s1600-h/device2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gdF4RvqRiIw/S5gq5lMR5rI/AAAAAAAAE1I/L5zY1bR_nl4/s320/device2.png" /&gt;&lt;/a&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gdF4RvqRiIw/S5gqxl2dJYI/AAAAAAAAE1A/CuibjcNX6So/s320/device.png" /&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The only user comment I got also said they wanted more options.&amp;nbsp;Unfortunately&amp;nbsp;there are not many options to give. Either you have a walkscore for the current location or the address entered or you don't.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;A couple features I would like to add are first an address suggestion. If the user enters an address in that has a list of suggestions then I need to let them choose the address currently I just pick the first one. Another feature I need to add is to track the number of times the score is retrieved because I am currently limited on how many request I can make to the walkscore servers a day. Mega thanks for the icons goes to the great &lt;a href="http://www.dukeofcheese.com/"&gt;Wylie Fisther&lt;/a&gt;!&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-6449062602587088578?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/njG7LGYPS90" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/6449062602587088578/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/03/upgrade-to-walkscore-widget.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6449062602587088578?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/6449062602587088578?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/njG7LGYPS90/upgrade-to-walkscore-widget.html" title="Upgrade to Walkscore Widget" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_gdF4RvqRiIw/S5gq5lMR5rI/AAAAAAAAE1I/L5zY1bR_nl4/s72-c/device2.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/03/upgrade-to-walkscore-widget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACSH4_eip7ImA9WxFVEUw.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-7574196234024274672</id><published>2010-03-03T08:00:00.001-05:00</published><updated>2010-06-09T15:46:09.042-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-09T15:46:09.042-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><title>GWT FlexTable is nice</title><content type="html">UPDATE: More recent post&amp;nbsp;&lt;a href="http://blog.hackingthought.com/2010/03/out-with-flextable-and-in-with.html"&gt;Out with Flextable and in with FlowPanel for the designer&lt;/a&gt;&amp;nbsp;where I point out the downside of trying to design with FlexTable.&lt;br /&gt;
Compared to YUI's &lt;a href="http://developer.yahoo.com/yui/datatable/"&gt;Datatable&lt;/a&gt;&amp;nbsp;GWT &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/gwt/user/client/ui/FlexTable.html"&gt;FlexTable&lt;/a&gt; is so much easier to work with.&lt;br /&gt;
I spent a couple months developing in YUI2 which I generally had a great experience developing it in. At times I felt it was a bit slow but batteries are included and could get a prototype built fast! Also I love that it is just Javascript code so it seems very potable and easy for other developers. Since I have been writing Android apps and Java is one of my first loves (all those twice bitten) GWT has not been difficult for me. Most recently working with FlexTable I have learned where GWT has a great advantage over YUI2.&lt;br /&gt;
&lt;br /&gt;
I was trying to find out how to hook up mouse events on a table of data when I ran into the &lt;a href="http://stackoverflow.com/questions/691446/how-do-you-add-a-row-listener-to-a-flextable-in-gwt"&gt;exact example I needed on stackoverflow&lt;/a&gt;. This was a cleaner and easier implementation for mouse events in GWT than in YUI. I have found this to be generally true that GWT much easier to organize the code base in for large projects. I still feel simple user interfaces are better off with something like jQuery and that GWT is on the other end of the spectrum with really large complex user interfaces.&lt;br /&gt;
&lt;br /&gt;
Rendering and entire page seems slow to me now. AJAX interfaces are&amp;nbsp;raising&amp;nbsp;the bar for us web developers. No longer can we just cache pages in memcache and expect them to be fast. Render time is like 70% of the user waiting for the page to load. That is the new true measurement of performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-7574196234024274672?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/6lUuvkQ3E5I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/7574196234024274672/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/03/gwt-flextable-is-nice.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7574196234024274672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/7574196234024274672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/6lUuvkQ3E5I/gwt-flextable-is-nice.html" title="GWT FlexTable is nice" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/03/gwt-flextable-is-nice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAESX85eyp7ImA9WxBVGEQ.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-4772712977878654426</id><published>2010-02-22T22:11:00.000-05:00</published><updated>2010-02-22T22:11:48.123-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-22T22:11:48.123-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Code tools</title><content type="html">Yes that is a dual meaning. I was reading this &lt;a href="http://theonda.org/articles/2010/02/19/i-am-quitting-textmate-and-going-back-to-emacs"&gt;blog&lt;/a&gt; about text editors. The truth is that I am an editor slut. I use different editors for the different things that I need them for. I am not just a one trick pony nor am I one language coder or a one editor kinda guy.&lt;br /&gt;
&lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; is my Java editor. I would use something less bloated but the Java code I develop in have extremely awesome integrations into Eclipse. Android apps that I develop are so much easier to develop, test and deploy using eclipse. I can deploy straight to my phone plugged into the USB port which is just such a time saver. I have become a big fan of GWT because of its performance for the end user. Not to mention it works fast and great on mobile browsers. GWT is much faster to develop using Eclipse just be saving the file and refreshing the browser.&lt;br /&gt;
&lt;a href="http://wingware.com/"&gt;WingIDE&lt;/a&gt; I just started trying out since PyCon. I am feeling kind a hooked for hacking hard core in Python. I was using &lt;a href="http://www.activestate.com/komodo_edit/"&gt;Komodo Edit &lt;/a&gt;which also had good Javascript support but it is way lacking in Python support. The downside being I am going to have to pay for WingIDE and I don't think I can afford the professional version but it is probably worth it since I spend like 6 hours a day hacking Python.&lt;br /&gt;
Emacs I use for basically commit messages but I am thinking I might use it entirely instead of TextMate which I purchase years back and it is nice but not all that for making my editing life easier.&lt;br /&gt;
&lt;br /&gt;
Since I wear many hats as a developer entrepreneur then I need to use whatever is the most productive tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-4772712977878654426?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/7yIuc8_IJW4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/4772712977878654426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/02/code-tools.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/4772712977878654426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/4772712977878654426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/7yIuc8_IJW4/code-tools.html" title="Code tools" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/02/code-tools.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBRns4eip7ImA9WxBVGEQ.&quot;"><id>tag:blogger.com,1999:blog-1280594010967081625.post-5764659053236944015</id><published>2010-02-22T21:44:00.000-05:00</published><updated>2010-02-22T21:44:17.532-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-22T21:44:17.532-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>PyCon 2010 was awesome!</title><content type="html">This years PyCon 2010 was pretty much awesome! Really enjoyed the entire experience. My favorite talk was the last keynote Antonio Rodriguez &amp;nbsp;&lt;a href="http://theonda.org/pages/pycon2010"&gt;the slides are onlin&lt;/a&gt;e but I could not find the video yet. &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;I enjoyed the async non-blocking talk by&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt; Peter A Portante. I took the time out to speak with him about it more and he pointed out that we need better access to kernel non-blocking to create a standard Python API that would be uber fast. I agree that is long term goal I am just focused on advocacy right now. Mark Ramm is one of my favorites folks out there. He is a real hands dirty funny kind of person. We discussed NoSQL which was mostly him teaching me stuff about his actual deployment and us agreeing on everything else. Right now I am leading NoSQL as time savings not so much as performance because I think people don't realize the are getting shafted by the performance issues with RDBMS. Anyway I tried to push Riak on Mark by sending him and email and pointing out a bug on his blog (I am sure that didn't help). I am planning on going again next year! Excited that I am going to go to Google IO also this year :)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1280594010967081625-5764659053236944015?l=blog.hackingthought.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HackingThoughtBlog/~4/DFAtTFH5br4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.hackingthought.com/feeds/5764659053236944015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.hackingthought.com/2010/02/pycon-2010-was-awesome.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5764659053236944015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1280594010967081625/posts/default/5764659053236944015?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HackingThoughtBlog/~3/DFAtTFH5br4/pycon-2010-was-awesome.html" title="PyCon 2010 was awesome!" /><author><name>Lateef Jackson</name><uri>https://profiles.google.com/104965469689680679178</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-kwKiEJ2Nxbw/AAAAAAAAAAI/AAAAAAAAISo/geXHcllCq9w/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.hackingthought.com/2010/02/pycon-2010-was-awesome.html</feedburner:origLink></entry></feed>

