tag:blogger.com,1999:blog-33760752024-03-12T20:05:10.908-07:00KineticMessages bouncing aroundMike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.comBlogger408125tag:blogger.com,1999:blog-3376075.post-33560930897415406512012-09-20T23:48:00.002-07:002012-09-20T23:48:36.404-07:00Career AdviceMy reply to someone asking for career advice of sorts -
I can certainly relate - quite a while ago I had looked for a line to put on my resume that summed up my goal and what I came up with was "Help people do things they couldn't do before, using computers." It may sound trite but that's been the center of my career orbit. Sometimes I am closer to the heart of the vision, sometimes further away. Your desire to help people "solve their problems" definitely will extend beyond coding. Without even meeting you I suspect that it does already. How you use your skills and passion will be driven by that desire to help people and solve problems. What role you take on will change over time and I wholeheartedly recommend trying things outside pure coding or engineering. The most important skills that I learned beyond engineering have been people oriented. Being an "engineering lead" let me understand how very different individuals actually are and how groups of people interact - the 'emergent behavior' of a group is not always immediately obvious but it is something that can be learned with experience. Being a "project manager" let me understand how groups of technical and non-technical people work together effectively and also quite often how they don't work together. Together these have taught me how products are built and how customers are helped to be happy. Along they way I have picked up some entrepreneurial attitude - but perhaps that attitude is what got me to jump into different roles and join different startups over the years.
As you look to the future, I would suggest that rather than thinking of 'career options' as the one true way forward forever and ever, think of careers or roles as a learning experience that makes you more adept and capable in different situations. This builds your skill in service to your ultimate vision - helping people. From this point, you may want to find a role that can use your engineering skill as a base to build on while you learn new things. I took a position as a technical project manager to learn how companies organize themselves to get things done. My engineering background let me not worry about understanding the technology (that part was easy) and instead soak in the experience of trying to coordinate many groups - herding cats basically. If you are able to not be too concerned about money you have many choices in how you spend your time. For example, you could work in the online advertising industry as an engineering lead - being less concerned about engineering (which you could do easily) and more concerned about team building and team coordination. You could spend a year being a project manager which is not making technology decisions at all (but you can call BS on silly design approaches), or you could find a small software technology company that needs a product manager - maybe something you haven't done before but it gives you a chance to dig in and learn.
I hope this lengthy reply isn't too confusing. My recommendation is to definitely branch out, but use your strengths to move into new areas. I hope this helps.Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-49315108524566317512012-04-18T22:39:00.000-07:002012-04-18T22:39:55.964-07:00PHP : you know it's good because semicolons are requiredWhile I don't normally write PHP code, I have had a bit of experience and so this very thorough rant made me chuckle.
<a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP: a fractal of bad design</a> I wish there were pages like this one on every programming language - I'm sure each has it's own set of dust bunnies we'd rather forget.<br />
<br />
After getting a link to a <a href="http://www.tiobe.com/index.php/paperinfo/tpci/PHP.html">"community index" for PHP</a>, I thought I'd check with indeed.com to see what they say about a few languages. It looks like PHP isn't dead yet.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.tiobe.com/index.php/paperinfo/tpci/PHP.html" imageanchor="1"><img border="0" height="240" src="http://www.tiobe.com/content/paperinfo/tpci/images/history_PHP.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-D2UVTKex-vo/T4-jScQEraI/AAAAAAAAAJU/b5ZylFwBxjI/s1600/php-ruby-python.png" imageanchor="1"><img border="0" height="178" src="http://3.bp.blogspot.com/-D2UVTKex-vo/T4-jScQEraI/AAAAAAAAAJU/b5ZylFwBxjI/s320/php-ruby-python.png" width="320" /></a></div>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-42334960651500424622011-12-13T22:58:00.000-08:002011-12-13T23:04:30.209-08:00Mobile and Web job trendsHere's a great graph from indeed.com (resume trends) showing mobile and HTML5 job trends - all are surging strong. The second graph shows RoR compared to mobile - the hip web app framework isn't the new hotness any longer.
<a href="http://www.indeed.com/jobtrends?q=iOS%2C+android%2C+html5" title="iOS, android, html5 Job Trends"><img alt="iOS, android, html5 Job Trends graph" border="0" height="300" src="http://www.indeed.com/trendgraph/jobgraph.png?q=iOS%2C+android%2C+html5" width="540" /></a>
<a href="http://www.indeed.com/jobtrends?q=ios%2C+android%2C+ruby+on+rails" title="ruby on rails, android, ios Job Trends">
<img width="540" height="300" src="http://www.indeed.com/trendgraph/jobgraph.png?q=ruby+on+rails%2C+android%2C+ios" border="0" alt="ruby on rails, android, ios Job Trends graph">
</a>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-46960935803273084722011-09-05T13:45:00.001-07:002011-09-05T13:46:08.009-07:00MongoDB replica sets - high level overview<br />
Here is a very very brief overview of MongoDB replica sets and a tip to enable read access to read-only replica slaves.<br />
<a href="http://www.codypowell.com/taods/2011/08/a-cloud-hosting-architecture-for-mongodb.html">http://www.codypowell.com/taods/2011/08/a-cloud-hosting-architecture-for-mongodb.html</a><br />
<br />
The full definition from the MongoDB site is here <a href="http://www.mongodb.org/display/DOCS/Replica+Sets">http://www.mongodb.org/display/DOCS/Replica+Sets</a>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-39245596424444155202011-03-29T23:15:00.000-07:002011-03-29T23:15:27.975-07:00Browser geolocation APIsMany mobile web browsers provide access to the current geo location via JavaScript (see <a href="http://dev.w3.org/geo/api/spec-source.html">the W3C spec</a>). It's very easy to use but there are a couple gotchas to be aware of. First, not all browsers support the API so you will need to take that into consideration when designing your user experience. Next, requesting the geo location from the browser will prompt the viewer to approve the request. On every page view. This is very annoying. You should store the location data away in a cookie and only periodically request updated location information. Another cool function is that the geolocation API allows your code to be notified as the location moves - perhaps your visitors take the bus or use their mobile devices while riding a bike. This is done with callbacks which is very compatible with client development and makes total sense.<br />
<br />
Here is some sample script showing how you could use this geolocation API in your mobile or location aware web apps.<br />
<code><br />
function onLocationUpdated(position)<br />
{<br />
// do something useful<br />
savePosition(position);<br />
createCookie("s_geo","on",3600);<br />
updateLocationDisplay(position);<br />
}<br />
<br />
// request location<br />
if (navigator.geolocation && !readCookie("s_geo"))<br />
{<br />
navigator.geolocation.getCurrentPosition(onLocationUpdated);<br />
<br />
var watchID = navigator.geolocation.watchPosition(<br />
onLocationUpdated, null, {<br />
enableHighAccuracy : true,<br />
timeout : 30000<br />
});<br />
}<br />
<br />
</code>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com2tag:blogger.com,1999:blog-3376075.post-45204371765861717532011-03-29T22:44:00.000-07:002011-03-29T22:44:07.572-07:00geonote.org - sharing the world around youOver the past month I've put together a mobile friendly web app which lets people share notes about the places they visit. Building the basic web app for storing and sharing notes about a place was pretty straightforward, but like any new application meant to be social the biggest problem is the empty room syndrome - if there is nothing to see, most people just wander off. It takes a special person to start sharing in an empty space.<br />
<br />
Rather than try to build up functionality and features to attract a crowd, it seemed that showing information that already exists would be a good way to bootstrap the app. Since I originally envisioned this app as something like Wikipedia for places, but more of an open medium that people can use for any purpose they can put it to, I first thought to look at ways to index Wikipedia entries by their geo location. I quickly found that other folks had already done the indexing and provided an API - <a href="http://geonames.org/">geonames.org</a> Pulling this data in was pretty easy, they have a simple HTTP API that returns XML, which <a href="http://geonote.org/">geonote.org</a> simply formats into a mobile friendly display. Once there was a web app for sharing notes and viewing 'atlas' pages (the Wikipedia entries), I went in search of other location based APIs and found several great ones.<br />
<br />
Here's the list of geo location APIs I've used so far<br />
<ul><li>GeoNames.org (Wikipedia entries and more) - <a href="http://www.geonames.org/export/ws-overview.html">http://www.geonames.org/export/ws-overview.html</a></li>
<li>Flickr.com (Photos) - <a href="http://www.flickr.com/services/api/">http://www.flickr.com/services/api/</a></li>
<li>Plancast.com (Events) - <a href="http://groups.google.com/group/plancast-api/web/overview?pli=1">http://groups.google.com/group/plancast-api/web/overview?pli=1</a></li>
<li>Hunch (Recommendations) - <a href="http://hunch.com/developers/v1/">http://hunch.com/developers/v1/</a></li>
<li>Twitter (chitter chatter) - <a href="http://apiwiki.twitter.com/Twitter-API-Documentation">http://apiwiki.twitter.com/Twitter-API-Documentation</a></li>
</ul><br />
<br />
The Plancast crew especially was extremely helpful. Their forum described upcoming support for searching by latitude and longitude, but it had not been released at the time. After posting a comment they were able to build and release that feature in only a few days (on a weekend too!)<br />
One of the most intriguing APIs was the Hunch API for recommendations. Although it has a lot of power, it requires a Twitter username to provide personalized recommendations and the geonote.org app is too simple to try to do real Twitter authentication integration. I'm sure to revisit the Hunch API though.Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-9026672489920324962011-03-13T13:45:00.000-07:002011-03-13T13:49:06.262-07:00Mobile webapps and the JQuery Mobile library<div class="separator" style="clear: both; text-align: center;"><a href="http://farm4.static.flickr.com/3038/2985287353_340d11843c_m.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="160" width="240" src="http://farm4.static.flickr.com/3038/2985287353_340d11843c_m.jpg" /></a></div>Recently I've been experimenting with geo location APIs and mobile friendly web applications. Building a native mobile application felt like it would have too steep a learning curve for the miniscule amount of time I have so I looked at what mobile browsers can deliver with just HTML, CSS and JavaScript. It turns out to be pretty easy to build a good looking mobile web application from scratch and I found the <a href="http://jquerymobile.com/">JQuery Mobile framework</a> works well to style pages with a native look and feel.<br />
You can see the results at <a href="http://geonote.org/places/plans">http://geonote.org/places/plans</a> for a 'from scratch' look and <a href="http://m.geonote.org/places/plans">http://m.geonote.org/places/plans</a> for the JQuery Mobile look.<br />
<br />
The first thing to take to heart is the spartan look of mobile web apps. There simply isn't room for multiple crowded top nav and side nav bars or for the data dense (but information poor) layouts of most sites. Take a look at a sample page from AllRecipes (which is a great site) - <a href="http://allrecipes.com/Cook/SHORECOOK/Photo.aspx?photoID=602783">http://allrecipes.com/Cook/SHORECOOK/Photo.aspx?photoID=602783</a> - there are nav bars for site section, tabs, breadcrumbs, sub-page navigation and so on. Not to mention a right nav bar with even more links. These are all useful I'm sure, but for a mobile web app you need to start from a blank page and work you way up and consider the information value of each pixel used. (Every pixel is sacred, every pixel is great. If any pixel is wasted, Tufte gets quite irate.) Another way to think of this is to consider each link as an internal advertisement for a page the user doesn't want to visit. There is a name for unwanted links on a page put there for commerical gain and that is 'spam'. Don't let your designs become link spammy.<br />
<br />
Next, you will want to have a way to preview your web app on a mobile device. If you have a modern phone then you can use it's browser and point it to your local dev environment, but another way is to use an iframe wrapped in a phone mockup. Here's the one I use <a href="http://geonote.org/html/iphone/">http://geonote.org/html/iphone/</a> There may be better mobile browser emulators but I didn't spend much time looking for something once I had the iframe based "emulator" working.<br />
<br />
Building pages for the 'from scratch' look follows the typical web app development path - you can use most any framework you are comfortable with, but be careful with approaches that are 'client heavy'. You'll want the smallest HTML, few images and the least number of resources downloaded for rendering each page.<br />
Many scripting libraries have a way to package only the necessary modules into a single resource - this cuts down on the network time needed to get the page rendered. Personally, I avoid client libraries since they are mostly meant for whiz-bang interactivity and on a mobile device the interaction feels better when it is as direct as possible. Common web app performance advice applies here - caching is your friend, the network is not.<br />
<br />
The <a href="http://jquerymobile.com/">JQuery Mobile</a> look was the most interesting part of building the UI for this site. I was really looking forward to getting a native look and feel for free. Although the library is currently in Alpha 3 stage it's very usable and I haven't run into any bugs in my limited testing. The JQuery Mobile library changes how you think of browser based pages. Not only does it try to use Ajax for most things it also introduces "compound pages" which results in an ever-growing DOM with 'sub pages' or panels that are shown and hidden during screen navigation. This allows for JQuery to perform the animated transitions between screens that give the hip 'mobile look' which is so captivating.<br />
<br />
The downside to using an Ajax approach is the use of local anchors (the part of a URL after the '#' character) for tracking state. While this is certanly a popular and Ajaxy way of doing things it does have it's problems. If you aren't familiar with the details it really mucks up how you work when building pages and causes things to simply not work and breaks the page (requiring the user to manually refresh the page). I still don't have forms working and had to disable the Ajax loading of some pages due to this hash-based URL trickery. You will need to rigorously test all pages and transitions between all pages to ensure that it actually works.<br />
<br />
Another downside to using JQuery Mobile is that the user interaction is noticably slower than just a simple HTML and CSS page. It is almost not "interactive", which is not a good thing for client applications. There is a lot of promise though and I haven't even looked at the built-in capabilities of JQuery Mobile for wider screen devices like tablets.Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-67396024603521804192010-08-15T17:17:00.000-07:002010-08-18T23:09:55.146-07:00Non-blocking operations and deferred execution with node.jsIf you write high volume server applications with high concurrency or low latency requirements you have probably heard about node.js This is a relatively easy to understand system that came out in 2009 and has some pretty amazing characteristics. An early presentation by the main author is here - <a href="http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf">http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf<br />
</a><br />
<br />
Node.js is an environment for writing Javascript based server applications with a big twist - all IO operations are non-blocking. This non-blocking aspect introduces a concurrency model that may be new to most developers but enables node.js applications to scale to a huge number of concurrent operations - it scales like crazy. <br />
<br />
Using non-blocking operations means code that would normally wait for data from a disk file or from a network connection does not wait and waste CPU cycles - your code returns control to the runtime environment and will be called later when the data actually is available. This allows the runtime environment to execute some other code whose data is ready at the moment and gains efficiency by avoiding context switches. This also means there is a single thread accessing data and no synchronization or semaphores are needed to prevent corruption of data due to concurrent access, making your application even more efficient.<br />
<br />
Although writing applications in Javascript makes node.js very approachable, the use of non-blocking operations isn't very common in most server applications and results in code that looks similar but is oddly different from what is familiar to most developers. For example, consider a simple program that reads data from a file and processes that data. In a typical procedural program the steps would be : <br />
<br />
<pre>file = open("filname");
read(file,buffer);
close(file);
do_something(buffer);
</pre><br />
This pseudo-code example is easy to understand and probably familiar to most developers. The step-by-step sequence of operations is the way most languages work and how most application logic is described. However, in a non-blocking version the open() function returns immediately - even though the file is not yet open. This introduces some challenges. <br />
<br />
<pre>file = open("filename");
// the 'file' is not yet open! what to do?
read(file,buffer);
close(file);
do_something(buffer);
</pre><br />
If the open() function were a blocking operation, the runtime environment would defer execution of the remaining sequence of operations until the data was available and then pick up where it left off. In node.js the way that code after a non-blocking operation is paused and picked up later is through the use of callback functions. All the steps listed after using the open() function are bundled into a new function and that bundle of steps is passed as a parameter to the open() function itself. The open() function will return immediately and your code has the choice of doing some work unrelated to the data that is not yet available or simply returning control to the runtime environment by exiting the current function.<br />
When the data for the opened file actually does become available your callback function is invoked by the runtime and your bundle of steps will then proceed.<br />
<br />
<pre>open("filename",function (f) {
read(f,buffer);
close(f);
do_something(buffer);
});
</pre><br />
The parameters to the callback function are defined by the non-blocking operation. In node.js opening files uses a callback that provides an error object (in case opening the file fails) and a file descriptor that can be used to actually read data. In node.js most callback functions have an error object and a list of parameters with the desired data.<br />
<br />
In the non-blocking example above you may have noticed the read(f,buffer) function call and guessed that this might be a non-blocking operation. This requires an additional callback function holding the remaining sequence of operations to execute once the data is read into a buffer.<br />
<br />
<pre>open("filename",function (f) {
read(f,buffer, function(err,count) {
close(f);
do_something(buffer);
});
});
</pre><br />
Some people feel this is a natural way to structure your code. Those people would be wrong.<br />
<br />
Here is an actual node.js example of reading from a file<br />
<br />
<pre>var fs=require('fs'),
sys=require('sys');
fs.open("sample.txt",'r',0666,function(err,fd) {
fs.read(fd,10000,null,'utf8',function(err,str,count) {
fs.close(fd);
sys.puts(str);
});
});
</pre><br />
Although this may appear a bit complex for such a simple task, and you can imagine what happens with more complex application logic, the benefit of this approach becomes more apparent when thinking about more interesting situations. For example, consider reading from two files and merging the contents. Normally a program would read one file, then read another file, then merge the results. The total time taken would be the sum of the time to read each file. With non-blocking operations, reading both files can be started at the same time and the total time taken would only be the longest time to read either of the two files.Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-25930167458604095512010-01-15T16:30:00.001-08:002010-01-15T17:27:09.266-08:00Hiring a Sr Engineer at the Rubicon Project<div class='posterous_autopost'><p>Hey everybody - I'm looking to hire a few engineers and thought I'd send out a note to let you all know. The Rubicon Project is truly an /awesome/ company to work for and the work we are doing is really exciting, challenging, very high scale and fun! It's like a startup - with benefits. So if you are ready to take charge of some big technology or know someone that is up to it, please shoot me an email. I've included the obligatory job description below. The position is in Seattle by the way.</p><p></p><p>Mike</p><p></p><p>Sr Software Engineer</p><p>the Rubicon Project is looking for several senior software engineers to help build out new products and features for the Data Intelligence area of our cutting edge online advertising platform. We are looking for people with experience building and operating large-scale, high-traffic Web applications and customer facing Web services. If you are an extremely productive contributor with a get-it-done attitude, work well in a highly collaborative team and want to work in an environment where software engineers are not just cubicle coders but full participants in shaping the product and the business then this job is for you. Serious experience with the following technologies is desired - Linux, Apache, HAProxy, memcached, memcacheq, Java, JSON, Tokyo Tyrant, MongoDB and MySQL.</p><p style="font-size: 10px;"><a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/hiring-a-sr-engineer-at-the-rubicon-project">Kinetic</a> </p></div>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-57916282009533504932009-12-24T10:10:00.001-08:002010-01-15T16:20:26.489-08:00Sunset BBQ
The view while barbecuing some chicken from a local market. (Not pictured - the Mirror Pond Ale I had, the local brews have all been disappointing)<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/1Hrd0djLLhIPEWp5evTBQU7RcmW2LRHo3HvxFNNxwziZUdJTG4D81DIiSnXS/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/WylNZ00UMlBKSxBDQ3FGHU5fLoz3oKZErQo7S0kgb3SgUzHM0sHs8KKm8zfI/photo.jpg.scaled.500.jpg" width="500" height="375"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/sunset-bbq">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-65477824605497914692009-12-21T20:12:00.001-08:002010-01-15T16:20:26.490-08:00Evening on Maui
We've finally settled into our condo for the week. Spent the day snorkeling and wandering. Things are wonderfully quiet.<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/3mVzIoLqv3GQkvVKTu31e1G9TSqnKodU0C03pPy92Wz3jxboen7hqLgKjPGB/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/YD6oRBGYqS6vUFljZqSzeK4gwM3aJxEtiBjjsN8rCJrvgNmyKaP6d8S8AJE3/photo.jpg.scaled.500.jpg" width="500" height="375"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/evening-on-maui">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-49917535955449228692009-12-17T22:55:00.001-08:002010-01-15T16:20:26.491-08:00Holiday cookies
My kitchen is a hazard - it's full of Christmas cookies.<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/CQSM0HkyIqb1mFfX6AmQsdSnmzNw56AYHcRTyuCeFCy9V3QXlec9vSORytKI/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/6QGXvDNCAxwC9ZLs2bLHP8ibRNXHo2hYQMOkK2Vnc5ZoFq36IGEcuPml7Jir/photo.jpg.scaled.500.jpg" width="500" height="667"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/holiday-cookies-2">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-13214000515718286792009-12-17T11:40:00.001-08:002009-12-17T23:20:59.352-08:00Algorithmic (almost) content creationThis article from Wired on <a href="http://www.wired.com/magazine/2009/10/ff_demandmedia/all/1">Demand Media</a> and their demand-based creation and delivery of 'content' is an important movement on the Web (and off the Web too).<br /><br />The choice quote is : <br /><blockquote>Instead of trying to raise the market value of online content to match the cost of producing it — perhaps an impossible proposition — the secret is to cut costs until they match the market value.</blockquote><br /><br />The costs to be cut are the costs of creation (manufacturing). The delivery costs are already nearly zero. Currently Demand Media is generating answers to unfulfilled questions using 'crowd sourcing' and blending media assets like video and photos and quickly written text. I wonder if someday even the text could be auto-generated.<br /><br />I'm sure in the next six months we'll see a blooming of clones - 'DemandMedia for FooBar' style.<br /><br />Quite a while ago I had thought about what it would take to build a content site with heavy automation on the gathering, review and approval of content. But I had not thought of optimizing that process based on audience demand. Quite clever really.<br /><br /><b>update</b><br />Just found this post on ReadWriteWeb from a writer that previously worked with DemandMedia - required reading to see things from the viewpoint of someone <a href="http://www.readwriteweb.com/archives/what_its_like_to_write_for_demand_media.php">actually creating DemandMedia content</a>.<br /><br />Choice quote:<br /><blockquote>They [writers] appear to be overwhelmingly women, often with children, often English majors or journalism students, looking for a way to do what they love and make a little money at it.<br /><br />Compare those demographics to Wikipedia: more than 80% male, more than 65% single, more than 85% without children, around 70% under the age of 30. </blockquote>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-5664227675216051862009-12-07T07:34:00.001-08:002009-12-07T07:34:17.807-08:00Sunrise over Rainier
A beautiful day to be flying<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/owABo6rodPEDVyODxlzPiVwCHtrPALO0CRF8pSVYMzA4CmI0GTrb62WcovFp/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/6zkjpa4JBxsEZniNNB8DtAXiI0h8fuEziPOH8Lt7apKjpVh4zbHmt4WvIxqf/photo.jpg.scaled.500.jpg" width="500" height="375"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/sunrise-over-rainier">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-90910482025721137002009-12-06T18:40:00.001-08:002010-01-15T16:20:26.492-08:00A gift from St. Nicholas
Look what I found in my shoe from St. Nicholas (or Sinterklaas if you prefer).<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/QgHPWJXubPfnNGGBzwdRRAJebNGxcnSLJS8sEha0JMQwyKvB1fqBCe4WEHwA/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/m4z0dzqBY77QZlyujhnmxef22YxEZ4tu07jeYEx3n9uJVoXqtCWIC5yU7mae/photo.jpg.scaled.500.jpg" width="500" height="667"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/a-gift-from-st-nicholas">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-89932906134929391762009-11-18T22:36:00.001-08:002009-11-19T09:39:02.146-08:00The Fables of Aesop<p>I like to collect folk tales and old books - especially ones with good illustrations. Here are some scans from a book originally copyright in 1894 (the edition I have was printed in 1917).</p> <p><a href='http://posterous.com/getfile/files.posterous.com/dierken/Pgva2s0zAZ9GIxoOf7zhE2MrXI5Pyl9KBpuJa1sQGt3wePOAEsgacMQ8Woj9/The_Fables_of_Aesop_-_Richard_.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/jKKcbZlon5L2jWhpUuoxIMJjtwOfdmMJBQdmAesrVTvs9IBDLoQQbjGNvCFy/The_Fables_of_Aesop_-_Richard_.jpg.scaled.500.jpg" width="250" height="364"/></a> <a href='http://posterous.com/getfile/files.posterous.com/dierken/hsHtyUZiNwanV3FAAdM7bLRWYbybGucwSkKldFLQNd9Ii7UDXZ9LLdySaKn2/The_Tortoise_and_the_Birds_-_R.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/8Kp3ZKrMI23LwapTGaP2tpREozSMrq6FtU3RHosP4daKvaR8xn1n5Flf8v69/The_Tortoise_and_the_Birds_-_R.jpg.scaled.500.jpg" width="500" height="692"/></a> <a href='http://posterous.com/getfile/files.posterous.com/dierken/MiGzS4kt1i2qUZjuiUGD8ZCTgVCaq2cUx5uLyRkVHrki3utcXKnbieFhhNXy/The_And_and_the_Grasshopper_-_.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/87KXOZkztyf617mlaz7skdxFo7t2dT6py1sddwsEqk5DExioUS4sOd5S5W7L/The_And_and_the_Grasshopper_-_.jpg.scaled.500.jpg" width="500" height="291"/></a> <a href='http://posterous.com/getfile/files.posterous.com/dierken/hn7xyiOcV2rvJZerSe2cQIvoJfO1qmq4DCNhOM8aCYKv6PIqjV6sxW2pkl1I/The_Bat_the_Birds_and_the_Beas.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/cd0d0ftoikIawcvzYUH5aelMkG4XHGQyrZgiVW3Pohenuxu1jLFaciKE5Uxw/The_Bat_the_Birds_and_the_Beas.jpg.scaled.500.jpg" width="500" height="198"/></a> <a href='http://posterous.com/getfile/files.posterous.com/dierken/g39Qjjkx9LdGlHuxTkbbfcV4Ps93vDtH70CloVKJRVywUQUQCVbiLYbMUPT6/The_Fox_and_The_Crow_title_-_R.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/o3fbzFKPZosAyvfRctSU4IiBYOAKaceWiFXwgfds3vZDPYkxvmOccKRozPN1/The_Fox_and_The_Crow_title_-_R.jpg.scaled.500.jpg" width="500" height="181"/> <a href='http://posterous.com/getfile/files.posterous.com/dierken/IXqci70CYlWJumivOgHO0pGsFVht7GVATQ5IPqdzA3wzxKB2TRLBVheuyi9w/The_Fox_and_The_Crow_-_Richard.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/zlIzP6Iefdbmgk9sgRsbfdzlNU6KdqGkLLQG4JOfHnUnTddlipTlIUCcE0Ab/The_Fox_and_The_Crow_-_Richard.jpg.scaled.500.jpg" width="500" height="694"/></a> </a> <a href='http://posterous.com/getfile/files.posterous.com/dierken/JZ92fsGDTDZhor9MsYE4E3oATydjYLqjT1TWtLn1gVFJ0OZwEwapWdBKz0YZ/The_Raven_and_the_Pitcher_-_Ri.jpg.scaled.1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/7wkxTlqnUXt8CWKjFeUtwyBIifO8cP0i6bJ8tMr7OrklU1BT8d7A4gcFUo1A/The_Raven_and_the_Pitcher_-_Ri.jpg.scaled.500.jpg" width="500" height="726"/></a> <div><a href='http://dierken.posterous.com/the-fables-of-aesop'>See and download the full gallery on posterous</a></div></p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/the-fables-of-aesop">Kinetic</a> </p>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-44276580700690085522009-11-16T19:53:00.000-08:002009-11-16T20:01:17.876-08:00Making the Web faster - SPDYThose crafty people at Google are doing some cool work to "make the Web faster". The first I had heard of this initiative it turned out to be <a href="http://code.google.com/speed/articles/">how to make "pages" faster</a> - a decent thing, but fairly well known. But recently some folks over there have started to look at the actual underlying issues with the gears grinding out the Web - mainly networking latency. Trying to improve the network protocol of the Web is a tricky thing - lots of people (and egos) can get involved. Surprisingly their effort seems to be off to a good start and everybody is taking it at face value and being supporting and questioning things in a positive way.<br /><br />One really cool thing mentioned in their whitepaper isn't a direct 'latency' thing - it's about 'server push'. If they can really make this happen a whole knew world of application development would open up.<br /><br /><blockquote>To enable the server to initiate communications with the client and push data to the client whenever possible.</blockquote>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-70331451355179196632009-11-06T12:20:00.000-08:002009-11-06T12:27:14.207-08:00IE and heinous "operation aborted" errorWe ran into a heinous bug in IE regarding using Javascript to modify the DOM while the page is loading. It turns out that IE6 and IE7 will show a modal error dialog and then clear the page when the user dismisses the error message. On IE8 it was fixed to merely stop rendering the page at that point. How helpful.<br /><br />You can find out more here on an <a href="http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx">MDSN blog</a><br /><br />If you are unable to defer Javascript execution until after the page finishes loading, the following snippet may work in your use case.<br /><pre><br />var tags = document.getElementsByTagName("*");<br />tags[tags.length-1].parentNode.appendChild(n);<br /></pre>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-75046121696742034472009-10-20T15:30:00.001-07:002010-01-15T16:20:26.497-08:00Coffee at Zokas in Kirkland
Haven't been to the new coffee place in Kirkland. They have the largest single block of wood table I've ever seen<p><a href='http://posterous.com/getfile/files.posterous.com/dierken/dlHdyAr5eS6JmFgH13BYKiUTkRrknEsbVBZY7LX8pJVPCigFR78GSKAAJoeV/photo.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/gu9PFHXQKYXYtsw1VQU46epkfNGtMEH1DN0RLy91LUCGGSOX4ekYfRqjpSR5/photo.jpg.scaled.500.jpg" width="500" height="375"/></a> </p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/coffee-at-zokas-in-kirkland">Kinetic</a> </p> Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-22181933856897648652009-10-12T17:29:00.001-07:002010-01-15T16:20:26.498-08:00The UnderTown in Pt TownsendThis past weekend we headed out of town to visit Pt. Townsend on the Peninsula. The weather couldn't have been better for this time of year - blue sky and sunny from the time we arrive to when we left on Sunday. We did a little walking around the beaches and forests of Ft Worden doing some geocaching and after a dinner we were looking for a cool place to hang out. Rinneke spotted this brightly lit stairway going down underground into who knows where. We could hear music drifting up so we went down. It turned out to be the UnderTown, a coffee/wine bar and they had live music on Saturday night.<br />It was a great way to relax, have a warm drink and spend some time together. If you are ever in Pt Townsend check it out.<p><a href="http://posterous.com/getfile/files.posterous.com/dierken/mL1JraNFo7buQ02QqLbaNpQWOECcFOZttzYOg4D3M9ZjVBR9nJlLdhXsjtrI/012.jpg.scaled.1000.jpg"><img src="http://posterous.com/getfile/files.posterous.com/dierken/xlpEpqEXOMBeJScX07W2oqFGQoRvTerwRkMG1CGH3KF4Z9f1CqjVT1mswUMe/012.jpg.scaled.500.jpg" width="500" height="375" /></a> <a href="http://posterous.com/getfile/files.posterous.com/dierken/XgnqAlRCfxzqoFwYZqm9XbI9YR7JTsfNGWTZTx2ACM3gpomvQywbrtNFpOkJ/014.jpg"><img src="http://posterous.com/getfile/files.posterous.com/dierken/GvEDz4yZXXBoXsBr89VmYfe2IaJLmNS9NIPNly11F6nOlOxxPEydaYWcBfud/014.jpg.scaled.500.jpg" width="500" height="667" /></a> <a href="http://posterous.com/getfile/files.posterous.com/dierken/hKDD0Z94O4otGZXddve6NAocrn8ZbUdS8ImNF9a26JxEuFhe9YKcIblTGMmF/017.jpg"><img src="http://posterous.com/getfile/files.posterous.com/dierken/wxC7TBOY5VEItbql17hARogcORcv7hEeGI5wSwons7AnNiQk98JImlcaBkqr/017.jpg.scaled.500.jpg" width="500" height="667" /></a> </p><div><a href="http://dierken.posterous.com/the-undertown-in-pt-townsend">See and download the full gallery on posterous</a></div><p></p><p style="font-size: 10px;"> <a href="http://posterous.com/">Posted via email</a> from <a href="http://dierken.posterous.com/the-undertown-in-pt-townsend">Kinetic</a> </p>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-39192628446702784262009-09-29T21:40:00.000-07:002009-09-29T22:34:36.787-07:00Tokyo Tyrant tuning parametersWe've been working with Tokyo Tyrant for some large scale key-value lookups and the performance has been very nice, but has degraded over time. I've been poking around the various options to try to improve the performance and although there is documentation of various options, the pages are hard to read and figure out what's what. So I thought I'd collect them here for reference. I'll describe the results of tuning and tweaking in a future post.<br /><br />The most recent authoritative references are here:<br /><ul><li><a href="http://1978th.net/tokyocabinet/spex-en.html">http://1978th.net/tokyocabinet/spex-en.html</a></li><li><a href="http://1978th.net/tokyotyrant/spex.html#installation">http://1978th.net/tokyotyrant/spex.html#installation</a></li></ul><br />Tokyo Tyrant (actually Tokyo Cabinet – the storage engine) supports various types of storage – <a href="http://en.wikipedia.org/wiki/B%2B_tree">B+ Tree</a> indexing, hash index, etc. This is configured by setting the filename or file extension to a particular value:<br /><ul><li>If the name is "*", the database will be an in-memory hash database. </li><li>If it is "+", the database will be an in-memory tree database. </li><li>If its suffix is ".tch", the database will be a hash database. </li><li>If its suffix is ".tcb", the database will be a B+ tree database. </li><li>If its suffix is ".tcf", the database will be a fixed-length database. </li><li>If its suffix is ".tct", the database will be a table database. </li></ul>Each has its own set of options and while different flavors of storage may accept the same option name (like bnum), the optimal value likely should be different across storage types.<br />Tuning parameters can trail the filename, separated by "#". Each parameter is composed of the name and the value, separated by "=". For example, "casket.tch#bnum=1000000#opts=ld" means that the name of the database file is "casket.tch", and the bucket array size is 1000000, and the options are large and deflate.<br /><br />For disk-based storage, several tuning parameters specify the on-disk layout while others specify memory and caching settings. Changing the on-disk layout requires scanning and re-writing the database data file which requires exclusive access to the file – which means taking the database offline. This scanning and re-writing process is done via tools provided with the distribution (ex: tchmgr and tcbmgr). Changing the memory and caching settings only requires a restart of Tokyo Tyrant.<br /><br />We've been working only with on-disk storage via the hash and B+ Tree database engines. For a hash database the tuning parameters for the on-disk layout is limited to the size of the bucket array and the size of an element in the bucket array (choosing 'large' gets you 64-bit addressing and addressable data greater than 2GB). When a hash database file is first created, space is allocated on disk for the full bucket array. For example a database with 100M bucket size and 'large' option would start out at around 800MB. This region of the data file is accessed via memory mapped IO. There is an additional 'extra mapped memory' setting which default to 64MB – I'm not sure what this is used for, but for performance more memory is always better.<br /><br />For a B+ Tree database, there are additional tuning parameters for the structure of the B+ Tree – how many members (links to child nodes) in an interior non-leaf node and how many members in a leaf node. Records are not stored in the B-Tree leaf nodes, but within 'pages'. The leaf nodes point to these pages and each page holds multiple records and is accessed via an internal hash database (and since this is a B+ Tree the records within a page are of course stored in sorted order). There is also a parameter for the bucket size of this internal hash database. One subtle detail is that the bucket size for a B+Tree database is the number of pages, not the number of elements (records) being stored – so this would likely be a smaller number than a hash database for the same number of records.<br /><br />I've not yet figured out how the dfunit tuning parameter works or what impact that has on a running server, but it looks interesting.<br /><br /><br /><dl><span style="font-weight: bold;">In memory hash </span><br /><dt>bnum </dt><dd>the number of buckets<br /></dd><dt>capnum </dt><dd>the capacity number of records<br /></dd><dt>capsiz </dt><dd>the capacity size of using memory. Note - records spilled the capacity are removed by the storing order.<br /></dd></dl><br /><br /><dl><br /><span style="font-weight: bold;">In memory tree</span><br /><dt>capnum </dt><dd>the capacity number of records<br /></dd><dt>capsiz </dt><dd>the capacity size of using memory. Note - records spilled the capacity are removed by the storing order.<br /></dd></dl><br /><dl><br /><span style="font-weight: bold;">Hash</span><br /><dt>opts </dt><dd>"l" of large option (the size of the database can be larger than 2GB by using 64-bit bucket array.), "d" of Deflate option (each record is compressed with Deflate encoding), "b" of BZIP2 option, "t" of TCBS option<br /></dd><dt>bnum </dt><dd>number of elements of the bucket array. If it is not more than 0, the default value is specified. The default value is 131071 (128K). Suggested size of the bucket array is about from 0.5 to 4 times of the number of all records to be stored.<br /></dd><dt>rcnum </dt><dd>maximum number of records to be cached. If it is not more than 0, the record cache is disabled. It is disabled by default.<br /></dd><dt>xmsiz </dt><dd>size of the extra mapped memory. If it is not more than 0, the extra mapped memory is disabled. The default size is 67108864 (64MB).<br /></dd><dt>apow </dt><dd>size of record alignment by power of 2. If it is negative, the default value is specified. The default value is 4 standing for 2^4=16.<br /></dd><dt>fpow </dt><dd>maximum number of elements of the free block pool by power of 2. If it is negative, the default value is specified. The default value is 10 standing for 2^10=1024.<br /></dd><dt>dfunit </dt><dd>unit step number of auto defragmentation. If it is not more than 0, the auto defragmentation is disabled. It is disabled by default.<br /></dd><dt>mode </dt><dd>"w" of writer, "r" of reader,"c" of creating,"t" of truncating ,"e" of no locking,"f" of non-blocking lock<br /></dd></dl><br /><dl><br /><span style="font-weight: bold;">B-tree</span><br /><dt>opts </dt><dd>"l" of large option,"d" of Deflate option,"b" of BZIP2 option,"t" of TCBS option<br /></dd><dt>bnum </dt><dd>number of elements of the bucket array. If it is not more than 0, the default value is specified. The default value is 32749 (32K). Suggested size of the bucket array is about from 1 to 4 times of the number of all pages to be stored.<br /></dd><dt>nmemb </dt><dd>number of members in each non-leaf page. If it is not more than 0, the default value is specified. The default value is 256.<br /></dd><dt>ncnum </dt><dd>maximum number of non-leaf nodes to be cached. If it is not more than 0, the default value is specified. The default value is 512.<br /></dd><dt>lmemb </dt><dd>number of members in each leaf page. If it is not more than 0, the default value is specified. The default value is 128.<br /></dd><dt>lcnum </dt><dd>maximum number of leaf nodes to be cached. If it is not more than 0, the default value is specified. The default value is 1024.<br /></dd><dt>apow </dt><dd>size of record alignment by power of 2. If it is negative, the default value is specified. The default value is 8 standing for 2^8=256.<br /></dd><dt>fpow </dt><dd>maximum number of elements of the free block pool by power of 2. If it is negative, the default value is specified. The default value is 10 standing for 2^10=1024.<br /></dd><dt>xmsiz </dt><dd>size of the extra mapped memory. If it is not more than 0, the extra mapped memory is disabled. It is disabled by default.<br /></dd><dt>dfunit </dt><dd>unit step number of auto defragmentation. If it is not more than 0, the auto defragmentation is disabled. It is disabled by default.<br /></dd><dt>mode </dt><dd>"w" of writer, "r" of reader,"c" of creating,"t" of truncating ,"e" of no locking,"f" of non-blocking lock<br /></dd></dl><br /><dl><br /><span style="font-weight: bold;">Fixed-length</span><br /><dt>width </dt><dd>width of the value of each record. If it is not more than 0, the default value is specified. The default value is 255.<br /></dd><dt>limsiz </dt><dd>limit size of the database file. If it is not more than 0, the default value is specified. The default value is 268435456 (256MB).<br /></dd><dt>mode </dt><dd>"w" of writer, "r" of reader,"c" of creating,"t" of truncating ,"e" of no locking,"f" of non-blocking lock<br /></dd></dl><br /><br /><dl><br /><span style="font-weight: bold;">Table</span><br /><dt>opts </dt><dd>"l" of large option,"d" of Deflate option,"b" of BZIP2 option,"t" of TCBS option<br /></dd><dt>idx </dt><dd>specifies the column name of an index and its type separated by ":"<br /></dd><dt>bnum </dt><dd>number of elements of the bucket array. If it is not more than 0, the default value is specified. The default value is 131071. Suggested size of the bucket array is about from 0.5 to 4 times of the number of all records to be stored.<br /></dd><dt>rcnum </dt><dd>maximum number of records to be cached. If it is not more than 0, the record cache is disabled. It is disabled by default.<br /></dd><dt>lcnum </dt><dd>maximum number of leaf nodes to be cached. If it is not more than 0, the default value is specified. The default value is 4096.<br /></dd><dt>ncnum </dt><dd>maximum number of non-leaf nodes to be cached. If it is not more than 0, the default value is specified. The default value is 512.<br /></dd><dt>xmsiz </dt><dd>size of the extra mapped memory. If it is not more than 0, the extra mapped memory is disabled. The default size is 67108864.<br /></dd><dt>apow </dt><dd>size of record alignment by power of 2. If it is negative, the default value is specified. The default value is 4 standing for 2^4=16.<br /></dd><dt>fpow </dt><dd>maximum number of elements of the free block pool by power of 2. If it is negative, the default value is specified. The default value is 10 standing for 2^10=1024.<br /></dd><dt>dfunit </dt><dd>unit step number of auto defragmentation. If it is not more than 0, the auto defragmentation is disabled. It is disabled by default.<br /></dd><dt>mode </dt><dd>"w" of writer, "r" of reader,"c" of creating,"t" of truncating ,"e" of no locking,"f" of non-blocking lock<br /></dd></dl>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com6tag:blogger.com,1999:blog-3376075.post-32374019898714994202009-09-25T22:36:00.000-07:002009-09-25T22:38:43.438-07:00Working hard is overratedVery insightful post about startups and hard work from someone who has been there.<br /><br /><blockquote>We agreed that a lot of what we then considered "working hard" was actually "freaking out". Freaking out included panicking, working on things just to be working on something, not knowing what we were doing, fearing failure, worrying about things we needn't have worried about, thinking about fund raising rather than product building, building too many features, getting distracted by competitors, being at the office since just being there seemed productive even if it wasn't -- and other time-consuming activities.</blockquote><br /><br /><blockquote>Much more important than working hard is knowing how to find the right thing to work on. Paying attention to what is going on in the world. Seeing patterns. Seeing things as they are rather than how you want them to be. Being able to read what people want. Putting yourself in the right place where information is flowing freely and interesting new juxtapositions can be seen. But you can save yourself a lot of time by working on the right thing. Working hard, even, if that's what you like to do.</blockquote>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-40063146851393589272009-09-25T08:43:00.001-07:002009-09-25T22:39:54.593-07:00Korean BBQ with Rubicon teamThis past Wednesday several of the Rubicon Project engineering team went out for dinner at a Korean BBQ in LA. It was a good mix of a working meeting - talking about engineering practices and development in general - and good food and drink. The meat was all very tasty and only at the end did I find out what some of it was. I had never had beef tongue before - I always swore I wouldn't taste anything that could taste me back - but it was all really good, especially the soju (a lot like vodka).<p><img src="http://posterous.com/getfile/files.posterous.com/dierken/F4Cszn1hizbUMWNUjEOQrzHTWcHegIBn5SBA0yaep3IcZOrgtUcjkZoLHm2r/Korean_BBQ_2009-09-23_001.jpg" width="450" height="600"/> <img src="http://posterous.com/getfile/files.posterous.com/dierken/sVOHZ9rTQURBrwTeXwnzADWkwCf0QUTk8hcQe2vaYu3a6hRH6cW7rx6zwj4L/Korean_BBQ_2009-09-23_005.jpg" width="450" height="600"/> <img src="http://posterous.com/getfile/files.posterous.com/dierken/F18HbYurnhwukVCEDSEvJcKzh5zUh18FImIFTljt6NacJymgEqtm5Plp5zDq/Korean_BBQ_2009-09-23_006.jpg" width="450" height="600"/> <img src="http://posterous.com/getfile/files.posterous.com/dierken/cCqpJlvNk79frKKHNuyxbBp1m3NIQfZRJVpm4cNJv2KFFBG8uohCiTrtugr7/Korean_BBQ_2009-09-23_007.jpg" width="450" height="600"/> <img src="http://posterous.com/getfile/files.posterous.com/dierken/Ozsa53zKqbJ90kmMPpPnDP2166U5dkvvITUIsF98a5FXCKwZFLrliDvO76vj/Korean_BBQ_2009-09-23_010.jpg" width="450" height="600"/> <img src="http://posterous.com/getfile/files.posterous.com/dierken/z7ydErEYlnPGqRXrjn2TS5FHO5GgGgIaK688CCKy4rIbvjps2RGEAHcJgTsi/Korean_BBQ_2009-09-23_011.jpg" width="450" height="600"/> <a href='http://posterous.com/getfile/files.posterous.com/dierken/bXo7bAE4nwFthcnZMsq4QJQc0kRwsVLJW19epXtuVUfmAioLpt2LIfIyCxhm/Korean_BBQ_2009-09-23_012.jpg'><img src="http://posterous.com/getfile/files.posterous.com/dierken/393G5COGrMKKZxFPPCe4Y3lulVr1bmYxF8HcEK50FcrWiWXipMN8gi8TpnN9/Korean_BBQ_2009-09-23_012.jpg.scaled.500.jpg" width="500" height="375"/></a> <div><a href='http://dierken.posterous.com/korean-bbq-with-rubicon-team'>See and download the full gallery on posterous</a></div></p><p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://dierken.posterous.com/korean-bbq-with-rubicon-team">Kinetic</a> </p>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-26773140490517526062009-09-20T16:39:00.000-07:002009-09-20T16:43:06.933-07:00PubSubHubBub - feed futuresCool - Bob Wyman is involved in the PubSubHubBub discussion group. In this post he hints at content-based routing - not just topic based routing - being possible in the future with PSHB. It's time to find some excuse to use this new PSHB technology at my day job.<br /><br /><blockquote>For instance, while today we think mostly about "topic-based" distribution -- i.e. subscribing to known feeds by name, in the future, people might like to subscribe to "concepts" or "words" that appear in the content of updates. Rather than saying "Tell me whenever Tom's feed changes!", you might like to say: "Tell me whenever any feed mentions PSHB." In that case, down stream systems are going to want to have the content (not just a notification of change) in order to match updates to subscriptions.</blockquote>Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0tag:blogger.com,1999:blog-3376075.post-76780741387403708492009-09-18T15:15:00.000-07:002009-09-18T15:18:30.102-07:00Real-time web, take 2Bernard Lunn has a good post over on ReadWriteWeb putting the recent <a href="http://www.readwriteweb.com/archives/where_is_the_real_time_web_message_bus.php">PubSubHubBub/RSSCloud</a> news into context. Very funny that he calls KnowNow a "blow out", but I think he correctly identified their issue being a focus on the enterprise market (when that market had fairly established solutions).<br /><br />Wish I hadn't been so busy over the past two years and could have worked on helping build PubSubHubBub-style technology.Mike Dierkenhttp://www.blogger.com/profile/02406913273929110651noreply@blogger.com0