<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-15084382</id><updated>2010-01-08T13:38:01.664-08:00</updated><title type='text'>Ken's Blog</title><subtitle type='html'>A personal web log of things I think about.  Recurring topics include Los Angeles public transportation, bicycling, urban planning, computer software, gardening, and jazz music.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default?start-index=26&amp;max-results=25'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>207</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15084382.post-9056937890343564994</id><published>2009-11-30T21:52:00.000-08:00</published><updated>2009-11-30T22:12:35.836-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='graphs'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><category scheme='http://www.blogger.com/atom/ns#' term='swivel4j'/><category scheme='http://www.blogger.com/atom/ns#' term='swivel'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Swivel4J - A New Java Client for Swivel</title><content type='html'>At work, we were looking for a simple way to visualize business data without having to build and host it ourselves.  This led us to &lt;a href="http://business.swivel.com/"&gt;Swivel&lt;/a&gt; (the &lt;span style="font-style: italic;"&gt;new Swivel&lt;/span&gt; as they call it which is geared towards private data shared within an organization).  With Swivel, we can upload our data, create pretty charts and graphs, and share them privately within our company.&lt;br /&gt;&lt;br /&gt;Swivel has a &lt;a href="http://wiki.github.com/swivel/api"&gt;REST API&lt;/a&gt; for managing the charts.  Though not difficult, we found it a little unwieldy to have to use an &lt;a href="http://hc.apache.org/httpclient-3.x/"&gt;HTTP client&lt;/a&gt; to setup each API call.  This naturally led to a small library that wrapped the REST API calls in a native Java API.&lt;br /&gt;&lt;br /&gt;We decided to make this library available to everyone as &lt;a href="http://code.google.com/p/swivel4j/"&gt;Swivel4J&lt;/a&gt; which is open source and hosted on Google Code.  We hope this makes it easier for Java, Groovy, and Scala developers to get started with Swivel and promotes the use of Swivel in general.&lt;br /&gt;&lt;br /&gt;Please try it out and give feedback, submit patches, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-9056937890343564994?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/9056937890343564994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=9056937890343564994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/9056937890343564994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/9056937890343564994'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2009/11/swivel4j-new-java-client-for-swivel.html' title='Swivel4J - A New Java Client for Swivel'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-4677685859897427559</id><published>2009-09-12T20:19:00.000-07:00</published><updated>2009-09-12T21:16:52.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='elb'/><category scheme='http://www.blogger.com/atom/ns#' term='x-forwarded-for'/><category scheme='http://www.blogger.com/atom/ns#' term='remote host'/><category scheme='http://www.blogger.com/atom/ns#' term='client IP address'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='elastic load balancer'/><category scheme='http://www.blogger.com/atom/ns#' term='access logs'/><title type='text'>Amazon ELB - Capturing Client IP Address</title><content type='html'>If you're using Amazon EC2's &lt;a href="http://aws.amazon.com/elasticloadbalancing/"&gt;Elastic Load Balancer&lt;/a&gt; (ELB) for load balancing web applications, you may have noticed that in your web access logs, the remote host IP address is the same for every request.  The IP address you see is the private IP address of the load balancer.&lt;br /&gt;&lt;br /&gt;If you want to see the IP address of the client (called remote host in access log documentation), you'll need to look at the value of the &lt;a href="http://en.wikipedia.org/wiki/X-Forwarded-For"&gt;X-Forwarded-For&lt;/a&gt; request header which ELB populates when it forwards the request.&lt;br /&gt;&lt;br /&gt;This can be achieved in an Apache access log by using the syntax: &lt;pre&gt;%{X-Forwarded-For}i&lt;/pre&gt;You Apache log format would then look something like this:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-agent}i\"" combined-elb&lt;br /&gt;CustomLog log/acces_log combined-elb&lt;/code&gt;&lt;/pre&gt;See &lt;a href="http://httpd.apache.org/docs/1.3/mod/mod_log_config.html#formats"&gt;Apache Custom Log Formats&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you're using a Tomcat application server, you could define an access log Valve like this:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&amp;lt;Valve className="org.apache.catalina.valves.AccessLogValve"&lt;br /&gt;    directory="logs" prefix="access_log." suffix=".txt"&lt;br /&gt;    pattern="%{X-Forwarded-For}i %l %u %t &amp;amp;quot;%r&amp;amp;quot; %s %b &amp;amp;quot;%{Referer}i&amp;amp;quot; &amp;amp;quot;%{User-Agent}i&amp;amp;quot;"&lt;br /&gt;    resolveHosts="false"/&gt;&lt;/code&gt;&lt;/pre&gt;See &lt;a href="http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html"&gt;Tomcat 6 Valve Configuration Reference&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're trying to capture the client IP address within your application code, simply use whatever API you have to read the X-Forwarded-For request header.  For example in Java use the HttpServletRequest:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;String clientIpAddress = request.getHeader("X-Forwarded-For");&lt;/code&gt;&lt;/pre&gt;instead of&lt;pre class="source-code"&gt;&lt;code&gt;String clientIpAddress = request.getRemoteAddr();&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4677685859897427559?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/4677685859897427559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=4677685859897427559' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4677685859897427559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4677685859897427559'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2009/09/amazon-elb-capturing-client-ip-address.html' title='Amazon ELB - Capturing Client IP Address'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-820388072648911732</id><published>2009-08-31T22:49:00.000-07:00</published><updated>2009-08-31T23:03:17.300-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='CloudFront'/><category scheme='http://www.blogger.com/atom/ns#' term='Gzip'/><title type='text'>Serving Gzipped Javascript Files from Amazon CloudFront</title><content type='html'>It is well-known that using a &lt;a href="http://developer.yahoo.net/blog/archives/2007/04/high_performanc_1.html"&gt;content delivery network (CDN)&lt;/a&gt; and &lt;a href="http://developer.yahoo.net/blog/archives/2007/07/high_performanc_3.html"&gt;compressing an HTTP response&lt;/a&gt; with gzip can significantly improve the performance and reduce the cost of a web site.  If your CDN is Amazon's &lt;a href="http://aws.amazon.com/cloudfront/"&gt;CloudFront&lt;/a&gt;, you'll face difficulties serving gzipped content to browsers that support it.  Most web servers are able to examine the HTTP request headers sent by the browser and dynamically choose whether to deliver compressed or uncompressed content.  CloudFront, however, &lt;a href="http://developer.amazonwebservices.com/connect/thread.jspa?messageID=107725&amp;amp;#107725"&gt;does not yet offer this feature&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;People have overcome this problem by manually inspecting the &lt;i&gt;Accept-Encoding &lt;/i&gt;request header for a dynamically served page and writing references to either original or compressed files accordingly using a naming convention like myscript.js and myscript.js.gz for regular and compressed files respectively.&lt;br /&gt;&lt;br /&gt;If all your pages are statically served from CloudFront, however, there is no opportunity to inspect the request headers.  Javascript running on a statically served page has no ability to ask the browser if it supports gzipped content. We found ourselves in this situation and resorted to the following solution to determine if the browser supports gzip:&lt;br /&gt;&lt;br /&gt;1) Create a small gzipped file, gzipcheck.js.jgz, and make it available in CloudFront. This file should contain one line of code:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;gzipEnabled = true;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;2) Use the following code to attempt to load and run this file.  You'll probably want to put it in the HTML HEAD section before any other Javascript code.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;&amp;#60;script type="text/javascript" src="gzipcheck.js.jgz"&amp;#62;&lt;br /&gt;&amp;#60;/script&amp;#62;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If the file loads, it sets a flag, gzipEnabled, that indicates whether or not the browser supports gzip.&lt;br /&gt;&lt;br /&gt;Use the result to drive a file naming convention for references to other static files. For example, you can upload and reference each compressed Javascript file with an additional .jgz extension.  Why .jgz instead of .gz?  Because of an &lt;a href="http://www.webveteran.com/blog/index.php/web-coding/coldfusion/fix-for-safari-and-gzip-compressed-javascripts/"&gt;annoying limitation of Safari&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When you upload your files to S3/CloudFront, make sure to set the proper HTTP response headers on your files that end in .jgz:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;Content-Encoding = gzip&lt;br /&gt;Content-Type = application/x-javascript&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;And if you want browsers to cache your files forever (almost):&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;Cache-Control = max-age=315360000&lt;br /&gt;Expires = Tue, 31 Dec 2019 20:00:00 GMT&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.linkedin.com/in/ricardoe"&gt;Ricardo Rangel&lt;/a&gt; who helped design and code this solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-820388072648911732?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/820388072648911732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=820388072648911732' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/820388072648911732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/820388072648911732'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2009/08/serving-gzipped-javascript-files-from.html' title='Serving Gzipped Javascript Files from Amazon CloudFront'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7968959792995293264</id><published>2009-04-08T09:49:00.000-07:00</published><updated>2009-04-10T22:43:36.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='10 freeway'/><category scheme='http://www.blogger.com/atom/ns#' term='santa monica freeway'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu License Plate on the Santa Monica Freeway</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5QIU8D7GfDs/SdztFmGaeSI/AAAAAAAAARg/vdIUU3_VB6g/s1600-h/ubuntu-plate-10-fwy.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_5QIU8D7GfDs/SdztFmGaeSI/AAAAAAAAARg/vdIUU3_VB6g/s400/ubuntu-plate-10-fwy.jpg" alt="" id="BLOGGER_PHOTO_ID_5322389540027660578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I came across this car while driving eastbound on the Santa Monica Freeway this past Saturday.  Do you think the license plate is referring to the &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu Linux OS&lt;/a&gt; or just the &lt;a href="http://en.wikipedia.org/wiki/Ubuntu_%28philosophy%29"&gt;Ubuntu philosophy&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;It also had some funny stickers and decals:&lt;br /&gt;* &lt;a href="http://www.amazon.com/gp/product/B0013O5VOW?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0013O5VOW"&gt;Evolve FISH Logo Decorative Silver Car Emblem&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B0013O5VOW" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt;&lt;br /&gt;* &lt;a href="http://www.amazon.com/gp/product/031604041X?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=031604041X"&gt;Goodnight Bush: A Parody&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=031604041X" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt;&lt;br /&gt;* &lt;a href="http://www.zazzle.com/got_hope_bumper_sticker-128712145080642676"&gt;Got Hope Bumper Sticker&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7968959792995293264?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7968959792995293264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7968959792995293264' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7968959792995293264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7968959792995293264'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2009/04/ubuntu-license-plate-on-santa-monica.html' title='Ubuntu License Plate on the Santa Monica Freeway'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_5QIU8D7GfDs/SdztFmGaeSI/AAAAAAAAARg/vdIUU3_VB6g/s72-c/ubuntu-plate-10-fwy.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-4137797323024640513</id><published>2009-01-14T21:50:00.000-08:00</published><updated>2009-01-14T22:57:44.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delicious'/><category scheme='http://www.blogger.com/atom/ns#' term='google reader'/><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='jungle disk'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='remember the milk'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='rtm'/><category scheme='http://www.blogger.com/atom/ns#' term='google sites'/><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><category scheme='http://www.blogger.com/atom/ns#' term='f-spot'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><category scheme='http://www.blogger.com/atom/ns#' term='quicken'/><title type='text'>Products I Can't Live Without - 2009</title><content type='html'>Inspired by &lt;a href="http://www.techcrunch.com/2009/01/04/2009-products-i-cant-live-without/"&gt;this post&lt;/a&gt; from Michael Arrington of TechCrunch, I thought it would be interesting to make my own annual list of products and services that I can't live without.  Here we go for 2009 (in the order that they came to mind):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mail.google.com/"&gt;Gmail&lt;/a&gt;, &lt;a href="http://www.google.com/calendar/"&gt;Google Calendar&lt;/a&gt;, &lt;a href="http://www.rememberthemilk.com/"&gt;Remember The Milk&lt;/a&gt;, &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt;, &lt;a href="http://f-spot.org/"&gt;F-Spot&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/B001D1Q7PM?ie=UTF8&amp;amp;tag=kenweiner&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001D1Q7PM"&gt;Quicken&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kenweiner&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001D1Q7PM" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;, &lt;a href="http://facebook.com/"&gt;Facebook&lt;/a&gt;, &lt;a href="http://sites.google.com/"&gt;Google Sites&lt;/a&gt;, &lt;a href="http://flickr.com/"&gt;Flickr&lt;/a&gt;, &lt;a href="http://itunes.com/"&gt;iTunes&lt;/a&gt;, &lt;a href="http://twiiter.com/"&gt;Twitter&lt;/a&gt;, &lt;a href="http://jungledisk.com/"&gt;Jungle Disk&lt;/a&gt;, &lt;a href="http://getdropbox.com/"&gt;Dropbox&lt;/a&gt;, &lt;a href="http://delicious.com/"&gt;Delicious&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mail.google.com/"&gt;Gmail&lt;/a&gt;&lt;br /&gt;I use this every minute every day for both personal and work email (my company uses Google Apps for email and calendar).  I just love the user interface and ease of accessing it on the web and the iPhone.  Beats the hell out of Outlook for work email.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/calendar/"&gt;Google Calendar&lt;/a&gt;&lt;br /&gt;Again, this is how I keep track of temporal events in my life both at home and at work.  I love that I can get text messages with alerts for calendar events.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rememberthemilk.com/"&gt;Remember The Milk&lt;/a&gt;&lt;br /&gt;Ever since reading David Allan's &lt;a href="http://www.amazon.com/gp/product/0142000280?ie=UTF8&amp;amp;tag=kweiner-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0142000280"&gt;Getting Things Done&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kweiner-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0142000280" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, I was in search of a tool to put his ideas to work.  About a year ago, I settled with Remember The Milk (RTM) and have used it ever since for task management.  The user interface is outstanding and I can access it from the web and iPhone.  Perhaps the best feature is that it &lt;a href="http://www.rememberthemilk.com/services/gmail/gadget/"&gt;integrates&lt;/a&gt; perfectly with Gmail as a "Gadget".&lt;br /&gt;&lt;a href="http://www.apple.com/iphone/"&gt;&lt;br /&gt;iPhone&lt;/a&gt;&lt;br /&gt;I don't identify with being an Apple person, but I couldn't resist the lure of the iPhone.  It really adds a lot of value to my life as I can manage email, read blogs, listen to Podcasts, use Google Maps, &lt;a href="http://www.tuaw.com/2008/07/19/iphone-101-geocaching-with-an-iphone-3g/"&gt;locate GeoCaches&lt;/a&gt;, and even SSH to a server at work.  Oh, and &lt;a href="http://en.wikipedia.org/wiki/Visual_voicemail"&gt;visual voice mail&lt;/a&gt; rocks!&lt;br /&gt;&lt;a href="http://f-spot.org/"&gt;&lt;br /&gt;F-Spot&lt;/a&gt;&lt;br /&gt;This &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt; desktop application is what I use to manage photos.  It stores photo metadata in a SQLite database which I can easily access if I ever want to export the data somewhere else.  It also makes it easy to upload photos to Flickr.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/B001D1Q7PM?ie=UTF8&amp;amp;tag=kenweiner&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001D1Q7PM"&gt;Quicken&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kenweiner&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001D1Q7PM" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;I have been using Quicken for years to manage my personal finances.  I upgrade it to the latest version every even year, so right now I have Quicken 2008.  Honestly, I would love to stop using Quicken and switch to a web-based solution, but I can't find one that is fully-featured enough for me.  I just have to have the ability to create arbitrary asset accounts for my wallet (cash), reimbursements, etc.  Most web-based services don't offer this yet.  I've got my eye on &lt;a href="http://www.mint.com/"&gt;Mint&lt;/a&gt; which, I have a feeling, will get good enough for me to make the switch one day.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;&lt;br /&gt;I read a lot of blogs.  I couldn't possibly keep up if I didn't use a blog reader.  In late 2008, I switched from &lt;a href="http://www.bloglines.com/"&gt;Bloglines&lt;/a&gt; to Google Reader because the user interface for Google Reader just kept getting better and eventually it won me over.  A big part of this was the excellent user interface of Google Reader on the iPhone.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://facebook.com"&gt;Facebook&lt;/a&gt;&lt;br /&gt;This barely made it to my list.  Maybe I could live without it, but I do find myself checking it almost daily because so many of my friends use it and somehow it makes me feel like I'm in touch with all of them without ever really talking to them :).  Also, Facebook is the platform I used to develop and launch my book sharing application &lt;a href="http://apps.new.facebook.com/we-read/"&gt;We Read&lt;/a&gt; which continues to grow slowly, but steadily each day and recently passed 1000 users.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/"&gt;Google Sites&lt;/a&gt;&lt;br /&gt;This past year I finally committed to using a wiki for my family.  I have been using wikis for years for work and open source software projects, and always thought it would be useful for keeping track of personal things like lists of gifts to get people, account information for utilities, financial services, and contractors, etc, etc.  I tried setting up and hosting wikis like &lt;a href="http://www.xwiki.org/"&gt;XWiki&lt;/a&gt; and &lt;a href="http://www.atlassian.com/software/confluence/personal-wiki.jsp"&gt;Confluence&lt;/a&gt;, but ultimately went with the free, online Google Sites which was &lt;a href="http://www.jot.com/"&gt;formerly JotSpot&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt;&lt;br /&gt;I purchased the Pro Account and now use Flickr for all my online photo sharing needs.  The pro account allows me to upload an unlimited amount of photos for about $25/year.  My family depends on this to see the many photos I take of my son as he grows up.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itunes.com"&gt;iTunes&lt;/a&gt;&lt;br /&gt;I hate the fact that iTunes doesn't run on Linux machines, but I can't resist it because it is really the only good option for managing music and videos on an iPod.  I use it daily to load up my iPhone with podcasts.&lt;br /&gt;&lt;a href="http://twiiter.com"&gt;&lt;br /&gt;Twitter&lt;/a&gt;&lt;br /&gt;I use Twitter a lot.  I blame Twitter for killing my urge to blog.  It is just so much easier to share things 140 characters at a time.  I have Twitter linked with Facebook so that each Tweet I send out ends up updating my Facebook status.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jungledisk.com"&gt;Jungle Disk&lt;/a&gt;&lt;br /&gt;This might be one of the most important services I use.  It keeps my music, videos, photos, and other important files backed up on &lt;a href="http://aws.amazon.com/s3/"&gt;Amazon's S3&lt;/a&gt; network.  At only $.15/GB, it ends up being pretty cheap to store a lot of data.  This way, if my house ever burns down or someone steals my computers, or I experience a hard disk failure,  I will always be able to restore my precious data.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://getdropbox.com"&gt;Dropbox&lt;/a&gt;&lt;br /&gt;I have started storing all files that I access often in a special directory on each computer (home, work, laptop, etc) called the Dropbox.  Each directory gets automatically synchronized so I have easy, local, access to the files I need wherever I am.  It also makes it extremely easy to share files with other people that use Dropbox.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://delicious.com"&gt;Delicious&lt;/a&gt;&lt;br /&gt;I store all my bookmarks in Delicious and take advantage of its &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3615"&gt;Firefox plugin&lt;/a&gt; to easily tag sites and recall sites I've already tagged.  I don't do a lot with the social features of Delicious like bookmark sharing, though.  Maybe it's just because I don't know which of my friends use Delicious too.&lt;br /&gt;&lt;br /&gt;Well, there you have it!  I can't wait to see how this list compares to the one I'll make in January 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4137797323024640513?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/4137797323024640513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=4137797323024640513' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4137797323024640513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4137797323024640513'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2009/01/products-i-cant-live-without-2009.html' title='Products I Can&apos;t Live Without - 2009'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7344389379746606220</id><published>2008-12-03T20:32:00.000-08:00</published><updated>2008-12-04T10:04:09.137-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linear regression'/><category scheme='http://www.blogger.com/atom/ns#' term='regression'/><category scheme='http://www.blogger.com/atom/ns#' term='best fit line'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy Best Fit Line</title><content type='html'>An engineer on my team at work asked if I could help with coding an algorithm for calculating a line that best fits a given set of data points.  I thought, "what a great excuse to practice some Groovy", and got started right away.&lt;br /&gt;&lt;br /&gt;A few Google searches led me to this 10-yr-old page on &lt;a href="http://people.hofstra.edu/stefan_waner/realworld/calctopic1/regression.html"&gt;Regression Functions&lt;/a&gt; by Stefan Waner from Hofstra University.  Stefan outlined the exact algorithm I was looking for.&lt;br /&gt;&lt;br /&gt;Here is my implementation in Groovy:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;// Prints the start/end points of a line that best fits 4 sample data points&lt;br /&gt;pts = [[1, 1.5], [2, 1.6], [3, 2.1], [4, 3.0]]&lt;br /&gt;println bestFit(pts)&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Given a set of points, uses a linear regression algorithm to find the start and end points&lt;br /&gt;* of a line that best fits the set of points.&lt;br /&gt;* Returns the two points as [[x1, y1], [x2, y2]].&lt;br /&gt;* The algorithm is from&lt;br /&gt;* http://people.hofstra.edu/stefan_waner/realworld/calctopic1/regression.html.&lt;br /&gt;*/&lt;br /&gt;def bestFit(pts) {&lt;br /&gt;  // Find sums of x, y, xy, x^2&lt;br /&gt;  n = pts.size()&lt;br /&gt;  xSum = pts.collect() {p -&gt; p[0]}.sum()&lt;br /&gt;  ySum = pts.collect() {p -&gt; p[1]}.sum()&lt;br /&gt;  xySum = pts.collect() {p -&gt; p[0]*p[1]}.sum()&lt;br /&gt;  xSqSum = pts.collect() {p -&gt; p[0]*p[0]}.sum()&lt;br /&gt;&lt;br /&gt;  // Find m and b such that y = mx + b&lt;br /&gt;  // m is the slope of the line and b is the y-intercept&lt;br /&gt;  m = (n*xySum - xSum*ySum) / (n*xSqSum - xSum*xSum)&lt;br /&gt;  b = (ySum - m*xSum) / n&lt;br /&gt;&lt;br /&gt;  // Find start and end points based on the left-most and right-most points&lt;br /&gt;  x1 = pts.collect() {p -&gt; p[0]}.min()&lt;br /&gt;  y1 = m*x1 + b&lt;br /&gt;  x2 = pts.collect() {p -&gt; p[0]}.max()&lt;br /&gt;  y2 = m*x2 + b&lt;br /&gt;&lt;br /&gt;  [[x1, y1], [x2, y2]]&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Running this script prints the following:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;[[1, 1.3], [4, 2.8]]&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You gotta love Groovy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7344389379746606220?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7344389379746606220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7344389379746606220' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7344389379746606220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7344389379746606220'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/12/groovy-best-fit-line.html' title='Groovy Best Fit Line'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-6461964558665262780</id><published>2008-11-22T22:26:00.000-08:00</published><updated>2008-12-03T20:41:31.119-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='morph appspace'/><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='personal confluence'/><category scheme='http://www.blogger.com/atom/ns#' term='confluence'/><category scheme='http://www.blogger.com/atom/ns#' term='mor.ph'/><category scheme='http://www.blogger.com/atom/ns#' term='morph labs'/><category scheme='http://www.blogger.com/atom/ns#' term='morph'/><category scheme='http://www.blogger.com/atom/ns#' term='personal wiki'/><title type='text'>A Personal Hosted Confluence Wiki for Free</title><content type='html'>I had been searching for a way to use Confluence as a personal wiki for me and my wife.  I couldn't find a cheap hosted solution where I could just get an account for 2 people on an instance of Confluence maintained by someone else.  I also didn't really want to pay a hosting company like Linode or Slicehost $20 a month for my own virtual machine on which I'd have to install and maintain Confluence myself.&lt;br /&gt;&lt;br /&gt;Recently I heard about Morph Labs which describes themselves as a Platform as a Service (PaaS).  They offer free hosting accounts that give you up to a 1GB database.  I immediately got the idea to try running the personal edition of Confluence on this service.  Eventually I got it working, but the process to get up and running was not at all easy.  In fact, I struggled for serveral nights.&lt;br /&gt;&lt;br /&gt;The rest of this post documents the process I went through.  I hope it will help someone else avoid the many hours I spent learning how to work within Morph AppSpace with a third-party Java web application.  Good luck, and if you have any tips or corrections, please comment and I'll update this post.&lt;br /&gt;&lt;br /&gt;Start by signing up for a &lt;a href="http://www.mor.ph/products_appspace"&gt;Morph AppSpace&lt;/a&gt; account with Morph Labs.  Create a new subscription and setup a new database for that subscription.  Be sure to choose Java, not the default Ruby on Rails, when setting up your subscription.  Choose PostgreSQL for your database as this seems to work best with Confluence.  Once your subscription is setup, download the Properties File, &lt;span style="font-weight: bold;"&gt;morph_deploy.properties&lt;/span&gt;, and Deployment Jar File, &lt;span style="font-weight: bold;"&gt;morph-deploy.jar&lt;/span&gt;, that can be found in the Java Tools for Morph AppSpace Deployment section.&lt;br /&gt;&lt;br /&gt;Next, go &lt;a href="http://www.atlassian.com/software/confluence/personal-wiki.jsp"&gt;get your free license&lt;/a&gt; for personal Confluence.  It allows you to register 2 users.  Hold on to that license text.  You'll need to activate Confluence once it is installed.  Then &lt;a href="http://www.atlassian.com/software/confluence/downloads/binary/confluence-2.9.2.tar.gz"&gt;download&lt;/a&gt; the latest version of Confluence which is currently 2.9.2.&lt;br /&gt;&lt;br /&gt;Unpack the file you downloaded somewhere on your computer.  Inside, you should find an &lt;span style="font-weight: bold;"&gt;edit-webapp&lt;/span&gt; directory.  Any files you need to modify should get copied into this directory.  The contents of this directory get overlayed on top of the contents of the eventual Confluence WAR file that you're going to build, so make sure to adhere to the standard WAR directory structure.  The whole purpose of the edit-webapp directory is to keep your local changes separate from the distribution so when it comes time to upgrade Confluence, you can just replace it and you'll know what you had to modify.&lt;br /&gt;&lt;br /&gt;Copy &lt;span style="font-weight: bold;"&gt;confluence/WEB-INF/classes/confluence-init.properties&lt;/span&gt; to &lt;span style="font-weight: bold;"&gt;edit-webapp/WEB-INF/classes/confluence-init.properties&lt;/span&gt;.&lt;br /&gt;Edit the copied &lt;span style="font-weight: bold;"&gt;confluence-init.properties&lt;/span&gt;, specifying the home dir as &lt;span style="font-weight: bold;"&gt;/var/java/&lt;app_name&gt;&lt;/app_name&gt;&lt;/span&gt; where &lt;span style="font-weight: bold;"&gt;APP_NAME&lt;/span&gt; is whatever name you chose as your subdomain at Morph.  For example, if your domain is &lt;span style="font-weight: bold;"&gt;family-wiki.morphexchange.com&lt;/span&gt;, then your home directory path would be &lt;span style="font-weight: bold;"&gt;/var/java/family-wiki&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Copy &lt;span style="font-weight: bold;"&gt;confluence/WEB-INF/web.xml&lt;/span&gt; into &lt;span style="font-weight: bold;"&gt;edit-webapp/WEB-INF/web.xml&lt;/span&gt;.&lt;br /&gt;Edit &lt;span style="font-weight: bold;"&gt;web.xml&lt;/span&gt; adding the jdbc datasource:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;resource-ref&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;Morphlabs Datasource&amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;!-- any name will do for the res-ref-name --&amp;gt;&lt;br /&gt;  &amp;lt;res-ref-name&amp;gt;jdbc/morph-ds&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;res-type&amp;gt;javax.sql.DataSource&amp;lt;/res-type&amp;gt;&lt;br /&gt;  &amp;lt;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and the JavaMail session:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;resource-ref&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;Morphlabs Mail Session&amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;!-- any name will do for the res-ref-name --&amp;gt;&lt;br /&gt;  &amp;lt;res-ref-name&amp;gt;mail/Session&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;res-type&amp;gt;javax.mail.Session&amp;lt;/res-type&amp;gt;&lt;br /&gt;  &amp;lt;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I had to disable Confluence's JMX-based monitoring because of problems registering MBeans.  This isn't a big deal since, for a personal instance of Confluence, I don't really have any need to monitor performance and gather statistics.  &lt;a href="http://confluence.atlassian.com/display/DOC/Live+Monitoring+Using+the+JMX+Interface"&gt;This web page&lt;/a&gt; explained how to disable JMX.  Download &lt;span style="font-weight: bold;"&gt;jmanageContext.xml&lt;/span&gt; from the URL shown on that page.  Then, copy &lt;span style="font-weight: bold;"&gt;jmanageContext.xml&lt;/span&gt; into &lt;span style="font-weight: bold;"&gt;edit-webapp/WEB-INF/classes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Remove &lt;span style="font-weight: bold;"&gt;mail.jar&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;activation.jar&lt;/span&gt; from &lt;span style="font-weight: bold;"&gt;confluence/WEB-INF/lib&lt;/span&gt;. Morph AppSpace already includes those in the Jetty server and having an extra copy in your WAR might cause class loader issues that would prevent JavaMail from working properly.  This is the only change that you'd have to remember to do again if you were to ever download a new version of Confluence.&lt;br /&gt;&lt;br /&gt;Now it is time to build the WAR file.  Run &lt;span style="font-weight: bold;"&gt;./build.sh&lt;/span&gt; which creates &lt;span style="font-weight: bold;"&gt;dist/confluence-2.9.2.war&lt;/span&gt;.  If you need to make any changes to any files, be sure to run this build script again.&lt;br /&gt;&lt;br /&gt;Download &lt;span style="font-weight: bold;"&gt;morph_deploy.properties&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;morph-deploy.jar&lt;/span&gt; from your subscription within the &lt;a href="http://panel.mor.ph/"&gt;Morph Control Panel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Run&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;&lt;br /&gt;java -Xmx512m -jar morph-deploy.jar --config morph_deploy.properties confluence-2.9.2/dist/confluence-2.9.2.war&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, sit back, relax, and wait while your WAR is being uploaded and deployed on Morph AppSpace.  This could take up to 15 minutes, so be patient.&lt;br /&gt;&lt;br /&gt;Hit &lt;span style="font-weight: bold;"&gt;your-subscription-name.morphexchange.com&lt;/span&gt; and if all went well, you should see a Confluence installation web page.  Following the Confluence installation wizard, entering your personal license text.  Choose Custom Installation, External Database, Connect via a Datasource.&lt;br /&gt;Enter &lt;span style="font-weight: bold;"&gt;java:comp/env/jdbc/morph-ds&lt;/span&gt; as the datasource.&lt;br /&gt;&lt;br /&gt;Confluence takes a long time to setup the database, so the page may appear to hang.  Each time I tried this (I had to try many times before figuring all this out), the page timed out.  I don't know if something went wrong or Morph AppSpace just has a time limit on waiting for a page to render.  Even though the page timed out and I saw some kind of "Proxy error" message, the database still seems to have been initialized properly, but the application wasn't able to recover.  I had to go into the Morph Control Panel to restart the application.  Once I did that, Confluence was up and running!&lt;br /&gt;&lt;br /&gt;Coming soon to this post: Setting up a mail server and using Groovy and XML-RPC to perform a daily backup of your confluence data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-6461964558665262780?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/6461964558665262780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=6461964558665262780' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/6461964558665262780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/6461964558665262780'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/11/personal-hosted-confluence-wiki-for.html' title='A Personal Hosted Confluence Wiki for Free'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7904930708412121777</id><published>2008-09-28T22:17:00.001-07:00</published><updated>2008-09-28T22:36:58.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Belkin'/><category scheme='http://www.blogger.com/atom/ns#' term='external monitor'/><category scheme='http://www.blogger.com/atom/ns#' term='Mini DVI'/><category scheme='http://www.blogger.com/atom/ns#' term='HDTV'/><category scheme='http://www.blogger.com/atom/ns#' term='HDMI'/><category scheme='http://www.blogger.com/atom/ns#' term='Denon'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharp'/><category scheme='http://www.blogger.com/atom/ns#' term='DVI'/><category scheme='http://www.blogger.com/atom/ns#' term='macbook'/><title type='text'>MacBook to HDTV via Mini DVI to DVI to HDMI</title><content type='html'>Since the MacBook is so good at playing different kinds of media, I plan to make it the media center of my life.  I will store all music, videos, and photos there.&lt;br /&gt;&lt;br /&gt;This led me to try to connect my &lt;a type="amzn" asin="B0013FPYRK"&gt;MacBook&lt;/a&gt; to my &lt;a type="amzn" asin="B000UN7JXS"&gt;Sharp Aquos LC46D64U 46-Inch 1080p LCD HDTV&lt;/a&gt;.  I did some research and found that there was only one option if I wanted to have digital picture quality.  I needed 2 cables because there is no such thing yet as a Mini DVI to HDMI cable:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a type="amzn" asin="B000EK76K8"&gt;Mini DVI to DVI Adapter ($19.95)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a type="amzn" asin="B00155WNQS"&gt;DVI to HDMI Cable ($19.95)&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;I picked these up, connected the Mini DVI end of the first cable to my MacBook, connected the DVI end of the second cable to the first cable, and finally the HDMI end of the second cable to an open HDMI slot in my TV.  Then I switched the TV's input to the HDMI port I just plugged into, and voila! - it worked immediately! The 1920 by 1080 picture looked great.&lt;br /&gt;&lt;br /&gt;The MacBook lets you choose between having 2 monitors and mirroring the same monitor.  The settings are all under System Preferences &gt; Displays.&lt;br /&gt;&lt;br /&gt;Now, I can show photo slide shows when the family is over, I can watch video podcasts and YouTube videos on the big screen, and I can even enjoy the &lt;a href="http://election.twitter.com/"&gt;Twitter election feed&lt;/a&gt; from my couch.&lt;br /&gt;&lt;br /&gt;Next I will look for the best way to get the sound from my MacBook hooked up to my Denon receiver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7904930708412121777?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7904930708412121777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7904930708412121777' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7904930708412121777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7904930708412121777'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/09/macbook-to-hdtv-via-mini-dvi-to-dvi-to.html' title='MacBook to HDTV via Mini DVI to DVI to HDMI'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-4726072714071306342</id><published>2008-09-23T21:37:00.000-07:00</published><updated>2008-09-28T22:16:45.431-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gripes'/><category scheme='http://www.blogger.com/atom/ns#' term='open office'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='macbook'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Giving In and Buying a MacBook</title><content type='html'>I finally caved in to the marketing pressure from Apple and a lot of my Apple-religious friends.  I bought a MacBook.  Why would I do this after many years of trying to do everything with open source software?  The main reasons are iTunes and my wife's need to use MS Office.&lt;br /&gt;&lt;br /&gt;I need iTunes to manage my family's 3 iPods (2 of which I got for free at tech conferences and users groups).  I also will need iTunes if I decide to buy an iPhone.  I have been thinking about it because I am surrounded by friends and co-workers who swear up and down that the iPhone is the answer to all of life's problems. Anyway, Apple won't produce a version of iTunes that runs on Linux and that's a shame, but there's nothing I can do about it.&lt;br /&gt;&lt;br /&gt;My wife has been using our &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; linux desktop for the last few years, and has gotten along quite nicely until recently when she needed some advanced spreadsheet functionality like &lt;a href="http://kb.iu.edu/data/agiy.html"&gt;mail merge&lt;/a&gt;. I am disappointed to say that &lt;a href="http://www.openoffice.org/"&gt;Open Office&lt;/a&gt; just wasn't cutting it.  The feature set was either lacking or buggy.  She was longing for MS Excel.  MS Office is available for the Mac, so that problem could get solved too.&lt;br /&gt;&lt;br /&gt;So far, the best thing about that Mac has been its packaging.  It came in a slick box with fancy designer Styrofoam.  It has stylish body and the l.e.d. lights have a pleasing glow.  Also the screen has a great, kind of glossy, picture.&lt;br /&gt;&lt;br /&gt;I do have some gripes:&lt;br /&gt;&lt;br /&gt;For one thing, I can't find a way to turn of that annoying sound the computer makes when booting.  A few blog posts I read say that you have to download some 3rd party software to disable it.&lt;br /&gt;&lt;br /&gt;After 20 minutes of surfing the web when I first booted up, the computer crashed and the wireless card stopped working.  I had to take the computer back to the Apple store.  Thankfully they exchanged it even though I had purchased the MacBook from the online Apple store.&lt;br /&gt;&lt;br /&gt;There doesn't appear to be any way to maximize a window.  There is a green plus button on each window that makes the window larger, but it doesn't make it go full screen.  Why can't I have this functionality on a Mac?&lt;br /&gt;&lt;br /&gt;There is no concept of right-click!  To get a context menu, I have to put 2 fingers on the trackpad and click the button.  I guess I can get used to this, but come-on, would it be so hard for Apple to make the right side of the button do what Windows and Linux users expect?&lt;br /&gt;&lt;br /&gt;You can only resize a window from the lower-right corner.  This is unbelieveable.  Both Windows and Linux allow you to resize a window from any edge of the window.  I find this really annoying.&lt;br /&gt;&lt;br /&gt;There are no Page Up, Page Down, Home, and End keys!   The function key + up or down arrows will do the same thing as Page Up and Page Down.  Also the Apple key + the left and right arrow will do the same thing as Home and End, but I'm just not used to it yet.&lt;br /&gt;&lt;br /&gt;Pressing the red X button on a window closes the window, but doesn't close the application even if it is the last window open in that application.  You have to remember to explicitly quit the application with an Apple key + Q.  I always forget to do this and am left with many open applications as a result.&lt;br /&gt;&lt;br /&gt;Despite all these gripes, I am happy to be getting to know my way around a Mac now.  I have always felt completely lost on a Mac and these days, it feels like everyone and their mother has one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4726072714071306342?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/4726072714071306342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=4726072714071306342' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4726072714071306342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4726072714071306342'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/09/giving-in-and-buying-macbook.html' title='Giving In and Buying a MacBook'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-8956344715439327306</id><published>2008-07-13T21:01:00.000-07:00</published><updated>2008-07-14T21:21:51.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='101 coffee shop'/><category scheme='http://www.blogger.com/atom/ns#' term='lower beachwood canyon'/><category scheme='http://www.blogger.com/atom/ns#' term='vedanta society'/><title type='text'>Walking L.A. #20 - Lower Beachwood Canyon</title><content type='html'>Again, Erin Mahoney, the author of our guide book, took us back to Hollywood.  This time we visited Lower Beachwood Canyon which is just a little bit east of the &lt;a href="http://kweiner.blogspot.com/2008/07/walking-la-19-whitley-heights-and.html"&gt;last walk&lt;/a&gt; in Whitley Heights.  Again there were many steep roads, but I enjoyed this walk a little more than last week's because we went earlier in the morning to avoid the heat, and I saw an area I've never seen before, even though I've lived in LA for over 15 years.&lt;br /&gt;&lt;br /&gt;We began at the bottom of Vista del Mar Ave where it meets Franklin Ave.  We stopped for coffee at the &lt;a href="http://www.yelp.com/biz/101-coffee-shop-los-angeles"&gt;101 Coffee Shop&lt;/a&gt; which was a 70's-looking diner with some character.  I'd return there sometime to try the food, but never again for a cup of coffee which was pretty lousy even for a diner.&lt;br /&gt;&lt;br /&gt;Again this week we saw beautiful houses, many with enviable views of Hollywood and Downtown LA.  Many parts of the neighborhood were quiet with narrow, curvy streets, which reminded me of hillside towns in Europe.  Other parts were extremely noisy from the roaring cars on the adjacent 101 Freeway.&lt;br /&gt;&lt;br /&gt;One of the noisiest areas, ironically, was home to the &lt;a href="http://www.vedanta.org/"&gt;Vedanta Society of Southern California&lt;/a&gt;. We stopped in to admire their white temple which looked like a mini Taj Mahal.  We also browsed through their bookstore where we almost bought our son a &lt;a type="amzn" asin="0807563803"&gt;Peaceful Piggy Meditation&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0807563803?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0807563803"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/519H724QA7L._SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0807563803" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next walk is Upper Beachwood Canyon.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51LURd73LFL._SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-8956344715439327306?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/8956344715439327306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=8956344715439327306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/8956344715439327306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/8956344715439327306'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/07/walking-la-20-lower-beachwood-canyon.html' title='Walking L.A. #20 - Lower Beachwood Canyon'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7364226020553906333</id><published>2008-07-06T20:31:00.000-07:00</published><updated>2008-07-14T20:59:18.324-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='hollywood and highland'/><category scheme='http://www.blogger.com/atom/ns#' term='whitley heights'/><category scheme='http://www.blogger.com/atom/ns#' term='build-a-bear'/><category scheme='http://www.blogger.com/atom/ns#' term='hollywood pop academy'/><title type='text'>Walking L.A. #19 - Whitley Heights and Hollywood Boulevard</title><content type='html'>This walk was just on the other side of Highland Ave from the &lt;a href="http://kweiner.blogspot.com/2008/06/walking-la-18-high-tower-and-hollywood.html"&gt;last walk&lt;/a&gt;.  You can tell that Whitley Heights was once a very prestigious neighborhood by the many fancy Mediterranean style homes.  Unfortunately the 101 Freeway was built right through it and now the residents have to put up with the noise.&lt;br /&gt;&lt;br /&gt;It was really hot today and the many steep roads on this walk contributed to a lot of sweating.  After walking through Whitley Heights we descended down Whitley Ave to Hollywood Blvd where we walked west to the &lt;a href="http://www.hollywoodandhighland.com/"&gt;Hollywood and Highland&lt;/a&gt; complex.  The boulevard was full of the usual tourists.  We had been here many times before so instead of sightseeing, we headed into a &lt;a href="http://www.yelp.com/biz/build-a-bear-work-shop-los-angeles"&gt;Build-a-Bear&lt;/a&gt; store to cool off.  Yes, there is actually a store that is like a Subway Restaurant for teddy bears.  You start with a naked bear and then pick its name, clothes, and accessories.&lt;br /&gt;&lt;br /&gt;After the bear store, we stopped to watch some dancers rehearsing their moves at the &lt;a href="http://www.hollywoodpopacademy.com/"&gt;Hollywood Pop Academy&lt;/a&gt; while we fed our baby.  Finally, we grabbed some coffee at Starbucks and then headed back to Whitley Heights to end our walk.&lt;br /&gt;&lt;br /&gt;The next walk is Lower Beachwood Canyon.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;tag=blogkw-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0899973639"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51LURd73LFL._SL160_.jpg"&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;l=as2&amp;o=1&amp;a=0899973639" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7364226020553906333?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7364226020553906333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7364226020553906333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7364226020553906333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7364226020553906333'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/07/walking-la-19-whitley-heights-and.html' title='Walking L.A. #19 - Whitley Heights and Hollywood Boulevard'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-6676945500411487062</id><published>2008-06-08T20:46:00.000-07:00</published><updated>2008-07-14T21:00:17.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='hollywood bowl'/><category scheme='http://www.blogger.com/atom/ns#' term='high tower'/><title type='text'>Walking L.A. #18 - High Tower and the Hollywood Bowl</title><content type='html'>Before the walk, we stopped for breakfast at the &lt;a href="http://marvistafarmersmarket.org/"&gt;Mar Vista Farmers Market&lt;/a&gt; getting omelettes and French toast from &lt;a href="http://www.cafelaurent.com/"&gt;Cafe Laurent&lt;/a&gt;.  Two good friends who were visiting from San Francisco joined us today.&lt;br /&gt;&lt;br /&gt;The first part of the walk was interesting.   We walked through the &lt;a href="http://www.hollywoodheights.org/"&gt;Hollywood Heights&lt;/a&gt; neighborhood which is just south of the Hollywood Bowl.  At the center of this hillside neighborhood stood a tall elevator tower known as High Tower. The tower is closed to everyone except residents with a key, so we had to climb many cement staircases to get to the top.  This was a challenge considering we had our baby and stroller with us.  Luckily my friends took turns helping me out.   One of the things I liked the most about this neighborhood was that many of the homes were accessible only by footpath.  This gave it a quiet, neighborly feel similar to places I've seen in Europe.&lt;br /&gt;&lt;br /&gt;The next part of the walk took us to the famous &lt;a href="http://en.wikipedia.org/wiki/Hollywood_Bowl"&gt;Hollywood Bowl&lt;/a&gt;.  There were no shows going on and the bowl was open for people to just walk in and check it out.  We walked to the boxed seat area, took a seat in one of the boxes, and dreamt about how nice it would be to attend a concert or show in one of the boxes eating cheese and sipping wine.&lt;br /&gt;&lt;br /&gt;The next walk is Whitley Heights and Hollywood Boulevard.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;tag=blogkw-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0899973639"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51LURd73LFL._SL160_.jpg"&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;l=as2&amp;o=1&amp;a=0899973639" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-6676945500411487062?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/6676945500411487062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=6676945500411487062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/6676945500411487062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/6676945500411487062'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/06/walking-la-18-high-tower-and-hollywood.html' title='Walking L.A. #18 - High Tower and the Hollywood Bowl'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7941073909504628995</id><published>2008-06-02T23:38:00.000-07:00</published><updated>2008-06-02T23:52:10.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='get satisfaction'/><category scheme='http://www.blogger.com/atom/ns#' term='lost account'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>My Twitter Account Has Disappeared!</title><content type='html'>I was about to Twitter just now and for some reason Twitter wouldn't let me login.  I tried visiting my Twitter feed page at &lt;a href="https://twitter.com/kweiner"&gt;http://twitter.com/kweiner&lt;/a&gt; and Twitter responded with the message "That page doesn't exist!".  Figuring that Twitter was just down, I tried a friend's page, and that page loaded just fine.  In the "Following" section of my friend's page, I noticed that my picture was missing!  Next I tried to reset my password, and when I entered my email address, Twitter responded with "Oh, snap! We couldn't find you!".&lt;br /&gt;&lt;br /&gt;What is going on?  Is my Twitter account really gone and my data lost forever?  I know they have had problems scaling recently, but losing someone's account is way worse than having a temporary outage.   I submitted a support ticket and also &lt;a href="http://getsatisfaction.com/twitter/topics/my_twitter_account_has_disappeared"&gt;posted a message&lt;/a&gt; to Get Satisfaction.  Let's see what happens...  If this doesn't get resolved, I am just going to give up on Twitter which will probably make my wife happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7941073909504628995?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7941073909504628995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7941073909504628995' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7941073909504628995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7941073909504628995'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/06/my-twitter-account-has-disappeared.html' title='My Twitter Account Has Disappeared!'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7701135069467983396</id><published>2008-06-01T20:31:00.000-07:00</published><updated>2008-06-09T20:45:52.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='south carthay'/><category scheme='http://www.blogger.com/atom/ns#' term='carthay circle'/><title type='text'>Walking L.A. #17 - Carthay Circle and South Carthay</title><content type='html'>There wasn't anything that exciting about today's walk which was a little south of &lt;a href="http://kweiner.blogspot.com/2008/05/walking-la-16-miracle-mile.html"&gt;last week's walk&lt;/a&gt; in the Miracle Mile area.  We explored 2 of 3 neighborhoods within a residential district called&lt;a href="http://en.wikipedia.org/wiki/Carthay,_Los_Angeles,_California"&gt; Carthay&lt;/a&gt;: Carthay Circle and South Carthay.  Our book says that these neighborhoods are in the Miracle Mile district, but Wikipedia says Carthay is its own district.  Both neighborhoods contain &lt;a href="http://www.preservation.lacity.org/hpoz"&gt;HPOZ&lt;/a&gt;'s for their architectural integrity and cohesiveness.  The styles include &lt;a href="http://en.wikipedia.org/wiki/Spanish_Colonial_Revival_Style_architecture"&gt;Spanish Colonial Revival&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Tudorbethan_architecture"&gt;Tudor Revival&lt;/a&gt;.  I can't think of much else to say about this walk.&lt;br /&gt;&lt;br /&gt;The next walk is High Tower and the Hollywood Bowl.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31hEQFGOipL._AA_SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7701135069467983396?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7701135069467983396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7701135069467983396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7701135069467983396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7701135069467983396'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/06/walking-la-17-carthay-circle-and-south.html' title='Walking L.A. #17 - Carthay Circle and South Carthay'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-5779786421400741620</id><published>2008-05-25T19:55:00.000-07:00</published><updated>2008-06-01T21:28:42.542-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='la brea tar pits'/><category scheme='http://www.blogger.com/atom/ns#' term='lacma'/><category scheme='http://www.blogger.com/atom/ns#' term='miracle mile'/><title type='text'>Walking L.A. #16 - Miracle Mile</title><content type='html'>Our friend Kevin joined us for this walk which meandered through the Miracle Mile district where he works at &lt;a href="http://www.eentertainment.com/"&gt;E! Networks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The walk began at Hancock Park (a real park, not the wealthy LA neighborhood of the same name).  This park is home to the infamous &lt;a href="http://en.wikipedia.org/wiki/La_Brea_Tar_Pits"&gt;La Brea Tar Pits&lt;/a&gt; and the adjacent &lt;a href="http://www.lacma.org/"&gt;LA Country Museum of Art&lt;/a&gt;.  We paused briefly by the tar pits to see if we could get the smell to trigger our memory of childhood playground asphalt on a hot day, something our book mentioned we might experience.  It didn't work at first, but as we walked away from the tar pits, a gentle breeze indeed carried the scent we were waiting for.  We skipped the Page Museum which is dedicated the ancient history of the area since we'd all been there at some point in our lives.&lt;br /&gt;&lt;br /&gt;Next we passed by a &lt;a href="http://www.la.cityzine.com/2008/02/23/the-new-lacma-arrives-phase-1/"&gt;new part of LACMA&lt;/a&gt; called BCAM which stands for Broad Contemporary Art Museum.  In front of BCAM was a giant red &lt;a href="http://www.flickr.com/photos/catheadsix/2409675794/"&gt;toy firetruck&lt;/a&gt; and closer to Wilshire was a display of &lt;a href="http://www.flickr.com/photos/alavengood/2414123637/"&gt;lamp posts&lt;/a&gt;.  We paused here to take some pictures.&lt;br /&gt;&lt;br /&gt;We stopped for lunch at &lt;a href="http://www.farmersmarketla.com/"&gt;Farmers Market&lt;/a&gt; on 3rd and Fairfax.  I had fried catfish and jambalaya at one of my favorite eateries, &lt;a href="http://www.farmersmarketla.com/directory/vendor/the_gumbo_pot/"&gt;The Gumbo Pot&lt;/a&gt;.  My friend Kevin grabbed a savory crepe from the &lt;a href="http://www.farmersmarketla.com/directory/vendor/the_french_crepe_company/"&gt;French Crepe Company&lt;/a&gt;.  After lunch we walked quickly through &lt;a href="http://www.thegrovela.com/"&gt;The Grove&lt;/a&gt;, one of those generic, outdoor, fake-urban, Disneylandesque shopping malls that everyone but me seems to love.&lt;br /&gt;&lt;br /&gt;We left The Grove to walk through a nice neighborhood called &lt;a href="http://www.preservation.lacity.org/hpoz/la/miracle-mile"&gt;Miracle Mile North&lt;/a&gt;, one of the district's several &lt;a href="http://www.preservation.lacity.org/hpoz"&gt;HPOZ&lt;/a&gt;'s.  Very nice homes in a very central location.  Wish we could afford to live there.  We finished up the walk passing through the Park La Brea high-rises.  It was the first time I had walked through Park La Brea, and I wasn't impressed, although it seems that many people &lt;a href="http://www.latimes.com/classified/realestate/printedition/la-re-guide23may23,0,1036326.story?coll=la-class-realestate"&gt;like it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The next walk is Carthay Circle and South Carthay.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31hEQFGOipL._AA_SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-5779786421400741620?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/5779786421400741620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=5779786421400741620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5779786421400741620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5779786421400741620'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/05/walking-la-16-miracle-mile.html' title='Walking L.A. #16 - Miracle Mile'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-3384968647140155092</id><published>2008-05-17T19:32:00.000-07:00</published><updated>2008-05-17T19:51:46.097-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='elasticfox'/><category scheme='http://www.blogger.com/atom/ns#' term='simpledb'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><category scheme='http://www.blogger.com/atom/ns#' term='sqs'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud studio'/><title type='text'>Cloud Studio Released</title><content type='html'>&lt;a href="http://www.service-cloud.com/"&gt;Cloud Services&lt;/a&gt; just launched &lt;a href="http://www.service-cloud.com/?page_id=14"&gt;Cloud Studio&lt;/a&gt; which is a java-based desktop application for managing images and instances in Amazon's &lt;a href="http://www.amazon.com/EC2-AWS-Service-Pricing/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=201590011&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA"&gt;EC2&lt;/a&gt;.  I've yet to try it, but from the &lt;a href="http://www.service-cloud.com/?page_id=15"&gt;screenshots&lt;/a&gt;, it looks really nice.  I'm not sure, though, if it does anything more than the very capable &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?entryID=609"&gt;Elasticfox&lt;/a&gt; which runs right in your Firefox browser.  Cloud Studio is also available as an &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; plugin which is really convenient for Java developers and users of the popular open source IDE.&lt;br /&gt;&lt;br /&gt;GUI's like Elasticfox and Cloud Studio make working with Amazon EC2 really easy.  Now I wish someone would create similar management tools for Amazon's SQS and SimpleDB.  I'd like to be able to list, see stats for, and manage my &lt;a href="http://www.amazon.com/Simple-Queue-Service-home-page/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=13584001&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA"&gt;SQS&lt;/a&gt; queues and &lt;a href="http://www.amazon.com/SimpleDB-AWS-Service-Pricing/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=342335011&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA"&gt;SimpleDB&lt;/a&gt; domains, items, and attributes without having to run command line scripts.  Hint, hint, Cloud Services!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-3384968647140155092?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/3384968647140155092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=3384968647140155092' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/3384968647140155092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/3384968647140155092'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/05/cloud-studio-released.html' title='Cloud Studio Released'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-1066626397746423165</id><published>2008-05-11T10:21:00.000-07:00</published><updated>2008-05-11T20:55:07.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejabberd'/><category scheme='http://www.blogger.com/atom/ns#' term='jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='xmpp'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>ejabberd on Amazon EC2 Ubuntu AMI</title><content type='html'>&lt;style type="text/css"&gt;pre.source-code { font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace;   color: #000000; background-color: #eee;  font-size: 12px;  border: 1px dashed #999999; line-height: 14px;  padding: 5px; overflow: auto; width: 100%}&lt;/style&gt;It turned out to be harder that I expected to setup a Jabber (XMPP) server on an Ubuntu virtual machine (&lt;a href="http://ec2hardy.notlong.com/"&gt;&lt;tt&gt;ami-ce44a1a7&lt;/tt&gt;&lt;/a&gt;) within &lt;a href="http://www.amazon.com/gp/browse.html?node=201590011"&gt;Amazon EC2&lt;/a&gt;.  I chose to setup &lt;a href="http://www.ejabberd.im/"&gt;ejabberd&lt;/a&gt; since it was an easy to install via apt-get.  I was a little nervous about working with a server built  with &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt; since I knew nothing about it, but it was a reputable server and I was counting on not needing to have any Erlang knowledge to work with ejabberd.  That was a correct assumption for the most part.&lt;br /&gt;&lt;br /&gt;First, I logged into the VM and installed ejabberd:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;apt-get install ejabberd&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Next I edited the ejabberd config file, &lt;code&gt;/etc/ejabberd/ejabberd.cfg&lt;/code&gt;, making &lt;code&gt;kweiner@jabber.pop140.com&lt;/code&gt; an admin user and setting the hostname as &lt;code&gt;jabber.pop140.com&lt;/code&gt;:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;%% Admin user&lt;/code&gt;&lt;br /&gt;&lt;code&gt;{acl, admin, {user, "kweiner", "jabber.pop140.com"}}.&lt;br /&gt;&lt;br /&gt;%% Hostname&lt;br /&gt;{hosts, ["jabber.pop140.com"]}.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Next, I restarted the server and registered kweiner as a new user:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;/etc/init.d/ejabberd rest&lt;/code&gt;&lt;code&gt;art&lt;br /&gt;ejabberdctl register kweiner jabber.pop140.com mypasswd&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Then I authorized traffic on ports 5222 (Jabber), 5223 (Jabber encrypted for old clients), 5269 (Other Jabber servers), and 5280 (Jabber web admin tool):&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;ec2-authorize default -p 5222&lt;br /&gt;ec2-authorize default -p 5223&lt;br /&gt;ec2-authorize default -p 5269&lt;br /&gt;ec2-authorize default -p 5280&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I could now hit the admin screen on which I logged in as &lt;code&gt;kweiner@jabber.pop140.com&lt;/code&gt;:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;http://jabber.pop140.com:5280/admin/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;From here it was possible to add new users and browse server statistics. I experimented with adding users and using various Jabber clients like &lt;a href="http://www.gajim.org/"&gt;Gajim&lt;/a&gt; to send messages from one user to another.&lt;br /&gt;&lt;br /&gt;My first problem came when I tried to communicate with users registered in other Jabber servers like &lt;a href="http://www.jabber.org/"&gt;Jabber.org&lt;/a&gt; and &lt;a href="http://www.google.com/talk/"&gt;Google Talk&lt;/a&gt;.  I struggled for hours trying to figure out why users on my server couldn't communicate with users from these other servers.  Thankfully &lt;a href="http://www.oreillynet.com/pub/au/3175"&gt;James Murty&lt;/a&gt; gave me a bit of help on this &lt;a href="http://developer.amazonwebservices.com/connect/thread.jspa?messageID=88823"&gt;Jabber on EC2&lt;/a&gt; message board thread.  It turned out that I needed to configure &lt;a href="http://en.wikipedia.org/wiki/SRV_record"&gt;SRV records&lt;/a&gt; in my DNS settings.&lt;br /&gt;&lt;br /&gt;I logged into GoDaddy where my domain is registered and configured SRV records as follows:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5QIU8D7GfDs/SCc3Gq49yiI/AAAAAAAAAJI/VCRmhGgBGJQ/s1600-h/srv-go-daddy.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://1.bp.blogspot.com/_5QIU8D7GfDs/SCc3Gq49yiI/AAAAAAAAAJI/VCRmhGgBGJQ/s320/srv-go-daddy.png" alt="" id="BLOGGER_PHOTO_ID_5199184882554489378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After this, I was able to use nslookup to verify that the SRV records were setup properly:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;kweiner~$ nslookup&lt;br /&gt;&amp;gt; set type=srv&lt;br /&gt;&amp;gt; _xmpp-server._tcp.pop140.com&lt;br /&gt;Server:         66.75.160.63&lt;br /&gt;Address:        66.75.160.63#53&lt;br /&gt;&lt;br /&gt;Non-authoritative answer:&lt;br /&gt;_xmpp-server._tcp.pop140.com    service = 10 10 5269 jabber.pop140.com.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;That did it!  My jabber server was finally federating with other jabber servers and my users could talk to their users.&lt;br /&gt;&lt;br /&gt;I encountered my next big problem when I tried to use jabber again after terminating and relaunching my AMI. ejabberd failed to start and I found the following error message in the &lt;code&gt;/var/log/ejabberd/ejabberd.log&lt;/code&gt;:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;application: ejabberd&lt;br /&gt;exited: {bad_return,{{ejabberd_app,start,[normal,[]]},&lt;br /&gt;           {'EXIT',{{badmatch,{aborted,{no_exists,config}}},&lt;br /&gt;                    [{ejabberd_config,set_opts,1},&lt;br /&gt;                     {ejabberd_app,start,2},&lt;br /&gt;                     {application_master,start_it_old,4}]}}}}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;After some googling, I found that ejabberd associates itself with an Erlang node name, a concept I don't really understand that well.  By default the node name was dynamically set based on the hostname for the machine.  It looked something like this: &lt;code&gt;ejabberd@domU-12-31-38-00-9D-63&lt;/code&gt;.  This node name is somehow linked to the &lt;a href="http://www.erlang.org/doc/apps/mnesia/"&gt;Mnesia&lt;/a&gt; database stored as files within &lt;code&gt;/var/lib/ejabberd&lt;/code&gt;.  The problem is that the hostname and therefore the node name changes everytime the AMI is relaunched which confuses ejabberd.&lt;br /&gt;&lt;br /&gt;One solution I found is to explicitly set the node name.  I did this by modifying &lt;code&gt;/etc/default/ejabberd&lt;/code&gt; adding the line:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;export ERLANG_NODE=ejabberd@jabber&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;This requires adding &lt;code&gt;jabber&lt;/code&gt; as a host name inside &lt;code&gt;/etc/hosts&lt;/code&gt;:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;127.0.0.1 localhost.localdomain localhost jabber&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I made those changes, removed all the database files from &lt;code&gt;/var/lib/ejabberd&lt;/code&gt;, and restarted ejabberd. That did it! The node name was the same regardless of the hostname associated with the particular AMI instance.&lt;br /&gt;&lt;br /&gt;This was a lot of effort, but it probably would have been easier if I had been familiar with Erlang applications and SRV DNS settings.  I hope this post helps someone else struggling to setup ejabberd on EC2 as I did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-1066626397746423165?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/1066626397746423165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=1066626397746423165' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/1066626397746423165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/1066626397746423165'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/05/ejabberd-on-amazon-ec2-ubuntu-ami.html' title='ejabberd on Amazon EC2 Ubuntu AMI'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5QIU8D7GfDs/SCc3Gq49yiI/AAAAAAAAAJI/VCRmhGgBGJQ/s72-c/srv-go-daddy.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-4853287001283957534</id><published>2008-05-06T21:42:00.000-07:00</published><updated>2008-05-07T00:09:58.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon aws'/><title type='text'>Amazon EC2 - My First Step into the Cloud</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_5QIU8D7GfDs/SCFVHXGU06I/AAAAAAAAAJA/vBk7gvYFqHU/s1600-h/AWS_LOGO._V2289989_.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_5QIU8D7GfDs/SCFVHXGU06I/AAAAAAAAAJA/vBk7gvYFqHU/s320/AWS_LOGO._V2289989_.gif" alt="" id="BLOGGER_PHOTO_ID_5197529029910254498" border="0" /&gt;&lt;/a&gt;Ever since returning from the &lt;a href="http://en.oreilly.com/webexsf2008/"&gt;Web 2.0 Expo&lt;/a&gt; in San Francisco last month, I have been excited about learning how to setup a machine in the &lt;a href="http://aws.amazon.com/ec2"&gt;Amazon Elastic Compute Cloud (EC2)&lt;/a&gt;.  My first goal was just to get a Linux machine running in the cloud on which later I will try to install enough software to get a basic web application running.&lt;br /&gt;&lt;br /&gt;To learn what to do, I consulted a the &lt;a type="amzn" asin="0596515812"&gt;Programming Amazon Web Services&lt;/a&gt; book which is fortunately &lt;a href="http://techbus.safaribooksonline.com/9780596515812"&gt;available on Safari Online&lt;/a&gt;.  In parallel I read the &lt;a href="http://docs.amazonwebservices.com/AWSEC2/2008-02-01/GettingStartedGuide/"&gt;Getting Started Guide&lt;/a&gt; on Amazon's website.  The steps to get a virtual machine running were roughly the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Register for Amazon EC2.&lt;/li&gt;&lt;li&gt;Download a X.509 certificate private key and public key pair and store them in a ~/.ec2 directory on my computer.&lt;/li&gt;&lt;li&gt;Take note of my AWS account number.&lt;/li&gt;&lt;li&gt;Download the &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&amp;amp;categoryID=88"&gt;Amazon EC2 Command-Line Tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Set environment variables: EC2_HOME, EC2_PRIVATE_KEY, EC2_CERT&lt;/li&gt;&lt;li&gt;Run &lt;span style="font-family:courier new;"&gt;ec2-describe-images -o self -o amazon&lt;/span&gt; to search for images.&lt;/li&gt;&lt;li&gt;Generate keypair using  ec2-add-keypair gsg-keypair&lt;/li&gt;&lt;li&gt;Fired up the Getting Started AMI with  &lt;span style="font-family:courier new;"&gt;ec2-run-instances ami-2bb65342 -k gsg-keypair&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Open SSH and HTTP ports: ec2-authorize default -p 22, ec2-authorize default -p 80&lt;/li&gt;&lt;li&gt;SSH into the instance: ssh -i id_rsa_gsg_keypair root@ec2-75-101-209-13.compute-1.amazonaws.com&lt;/li&gt;&lt;li&gt;Access the instance's web server: http://ec2-75-101-209-13.compute-1.amazonaws.com/&lt;/li&gt;&lt;li&gt;Shutdown the instance: ec2-terminate-instances i-db6ea2b2&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's it! Everything worked as advertised and I got through all of that in less than an hour.  This whole procedure cost me about 10 cents.  I am looking forward to my next goal which is to find an Ubuntu server image, install a database with data, and learn how to preserve the data so that it survives an image restart.&lt;br /&gt;&lt;a id="set-aes-home"&gt;&lt;strong class="userinput"&gt;&lt;code&gt;&lt;em class="replaceable"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/em&gt; &lt;/code&gt;&lt;/strong&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4853287001283957534?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/4853287001283957534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=4853287001283957534' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4853287001283957534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/4853287001283957534'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/05/amazon-ec2-my-first-step-into-cloud.html' title='Amazon EC2 - My First Step into the Cloud'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5QIU8D7GfDs/SCFVHXGU06I/AAAAAAAAAJA/vBk7gvYFqHU/s72-c/AWS_LOGO._V2289989_.gif' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7725168562534109009</id><published>2008-04-20T22:07:00.001-07:00</published><updated>2008-04-20T22:17:52.302-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='google ajax language api'/><category scheme='http://www.blogger.com/atom/ns#' term='language detection'/><title type='text'>Server-Side Language Detection with Ruby + Google Language API</title><content type='html'>Have you ever wanted to detect the language of a piece of text?  Google's AJAX &lt;a href="http://code.google.com/apis/ajaxlanguage/"&gt;Language API&lt;/a&gt; makes this possible on the client side.  &lt;a href="http://blog.lodeblomme.be/2008/03/21/server-side-language-detection-with-google-language-api/"&gt;This Belgian startup's blog post&lt;/a&gt; shows a PHP example of how you can use Google's detection service on the server side.  Here is a port of that example in Ruby:&lt;br /&gt;&lt;br /&gt;(the 'json' gem must be installed prior to running this program)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'net/http'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'cgi'&lt;br /&gt;require 'json'&lt;br /&gt;&lt;br /&gt;base_url = 'http://www.google.com/uds/GlangDetect?v=1.0&amp;amp;q='&lt;br /&gt;url = base_url + CGI.escape("See if you can guess what language this is!")&lt;br /&gt;response = Net::HTTP.get_response(URI.parse(url))&lt;br /&gt;result = JSON.parse(response.body)&lt;br /&gt;lang = result['responseData']['language']&lt;br /&gt;puts "Language code: #{lang}"&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7725168562534109009?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7725168562534109009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7725168562534109009' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7725168562534109009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7725168562534109009'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/04/server-side-language-detection-with.html' title='Server-Side Language Detection with Ruby + Google Language API'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-5804730347167194256</id><published>2008-04-14T22:08:00.000-07:00</published><updated>2008-04-14T22:32:12.484-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='tinyurl'/><category scheme='http://www.blogger.com/atom/ns#' term='tinyurlreverser'/><category scheme='http://www.blogger.com/atom/ns#' term='shorturl'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo pipes'/><title type='text'>Reverse Tinyurl with Ruby</title><content type='html'>I was searching for a way to reverse TinyURL's using Ruby.  First, I went to TinyURL.com to see if there was actually an API to do this.  Unfortunately I did not find one.  I then searched for Ruby APIs to do it and came upon these two libraries for dealing with TinyURL's:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://rubyforge.org/projects/tinyurl/"&gt;Tinyurl&lt;/a&gt; - This one converts regular URL's to TinyURL's and vice-versa.  However, I examined the source code and discovered that to do this, the author's personal web server, logankoester.com, is called.  This concerned me because: What if this service goes down?  My program would stop working.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.planetrubyonrails.org/tags/view/rubyforge"&gt;ShortURL&lt;/a&gt; - This one converts original URL's into many "short URL" formats such as TinyURL, RubyURL, and mooURL.  Unfortunately there is no way to reverse any of these URL's.  Since I needed the reverse functionality, I had to pass this one by.&lt;/li&gt;&lt;/ol&gt;With a little more googling, I found the &lt;a href="http://snippets.dzone.com/tag/tinyurl"&gt;PHP code&lt;/a&gt; that the Tinyurl author used to do the TinyURL conversions.  I decided to port his screen-scraping approach to Ruby for use in my program:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;require 'rubygems'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;require 'net/http'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;def reverse_tinyurl(url)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  url_parts = url.split('.com/')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    preview_url = "http://preview.tinyurl.com/#{url_parts[1]}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    response = Net::HTTP.get_response(URI.parse(preview_url))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    original_url = response.body.scan(/redirecturl" href="(.*)"&gt;/)[0][0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;puts reverse_tinyurl('http://tinyurl.com/6nzb8u')&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Running this program would print out the URL to my blog, http://kweiner.blogspot.com.&lt;br /&gt;&lt;br /&gt;By the way, I also found &lt;a href="http://remysharp.com/tinyurlapi"&gt;TinyURL Callback API in JavaScript&lt;/a&gt;, but I wanted a server-side solution.  Additionally, I found the &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=xk9igG833BGaf_dgmLokhQ"&gt;TinyURLReverser&lt;/a&gt; from Yahoo Pipes, but I wasn't clear on how this worked.  I need to examine this one a little further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-5804730347167194256?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/5804730347167194256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=5804730347167194256' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5804730347167194256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5804730347167194256'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/04/reverse-tinyurl-with-ruby.html' title='Reverse Tinyurl with Ruby'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-5678017251258299475</id><published>2008-04-06T21:57:00.000-07:00</published><updated>2008-04-06T22:23:23.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter4r'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Getting Twitter4R to Work on Ubuntu 7.10</title><content type='html'>Tonight I set out to try the Twitter4R ruby library so I could play around with Twitter data.  I am not a ruby expert by any means, but I thought it would be easy to setup.  Unfortunately, I ran into a number of problems:&lt;br /&gt;&lt;br /&gt;I first tried to upgrade my ruby gems installation to 1.1.0.  I downloaded and unpacked rubygems-1.1.0 and ran 'ruby setup.rb'.  After this I got the following error when trying to run &lt;code&gt;gem -v&lt;/code&gt;: &lt;code&gt;uninitialized constant Gem::GemRunner (NameError)&lt;/code&gt;. I googled this and ended up on &lt;a href="http://www.nickpeters.net/2007/12/31/fix-for-uninitialized-constant-gemgemrunner-nameerror/"&gt;this blog post&lt;/a&gt; which solved my problem.  I had to edit the &lt;code&gt;/usr/bin/ruby&lt;/code&gt; file and add the following line: &lt;code&gt;require 'rubygems/gem_runner'.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;With gem working, I installed Twitter4R: &lt;code&gt;sudo gem install twitter4r&lt;/code&gt;.  This worked smoothly, so I went on to write a sample Twitter4R ruby program:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require('rubygems')&lt;br /&gt;gem('twitter4r', '0.3.0')&lt;br /&gt;require('twitter')&lt;br /&gt;&lt;br /&gt;Twitter::Client.configure do |conf|&lt;br /&gt;conf.source = 'kweiner'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;client = Twitter::Client.new(:login =&gt; 'kweiner', :password =&gt; 'mypass')&lt;br /&gt;timeline = client.timeline_for(:me)&lt;br /&gt;puts timeline&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Running this gave me the error &lt;code&gt;No Such File to Load: net/https&lt;/code&gt;. Again, I plugged that into Google and got &lt;a href="http://www.postal-code.com/mrhappy/blog/2007/02/08/ruby-no-such-file-to-load-nethttps/"&gt;this blog post&lt;/a&gt; which told me to install the libopenssl-ruby library.  I did this easily with &lt;code&gt;sudo apt-get install libopensll-ruby&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;I tried one more time to run my program and get a new error: &lt;code&gt;undefined method `parse' for Time:Class&lt;/code&gt;.  Google to the rescue again: &lt;a href="http://bugs.archlinux.org/task/9809"&gt;this page&lt;/a&gt; mentioned that there is some bug and the workaround is to add &lt;code&gt;require('time')&lt;/code&gt; to the ruby source file.  I did this, and, voila!, my program printed the latest tweets from my timeline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-5678017251258299475?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/5678017251258299475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=5678017251258299475' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5678017251258299475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/5678017251258299475'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/04/getting-twitter4r-to-work-on-ubuntu-710.html' title='Getting Twitter4R to Work on Ubuntu 7.10'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7342925433880759695</id><published>2008-04-06T19:23:00.000-07:00</published><updated>2008-04-07T21:20:49.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='barney&apos;s beanery'/><category scheme='http://www.blogger.com/atom/ns#' term='west hollywood'/><category scheme='http://www.blogger.com/atom/ns#' term='sweet lady jane'/><category scheme='http://www.blogger.com/atom/ns#' term='melrose'/><title type='text'>Walking L.A. #15 - West Hollywood</title><content type='html'>This week's walk was about 2 miles - much longer than some of the previous ones.  We were joined by our 2 friends and their 2 kids who rode along in their stylish new &lt;a type="amzn" asin="B000NWUUCI"&gt;double-decker stroller&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We started the walk on King's Rd. just south of Willoughby St. at &lt;a href="http://en.wikipedia.org/wiki/Kings_Road_House"&gt;The Schindler House&lt;/a&gt; which is considered to be the first modern house built in the world.&lt;br /&gt;&lt;br /&gt;We then walked south to Melrose Ave where we stopped for coffee and pastries at &lt;a href="http://www.sweetladyjane.com/"&gt;Sweet Lady Jane&lt;/a&gt; who, according to my wife, is supposed to provide Nicole Richie a wedding cake.  I don't see evidence of that on the web, but I do see that the store is now &lt;a href="http://www.spotlightingnews.com/article.php?news=1809"&gt;owned by the Olsen twins&lt;/a&gt; and makes cakes for other celebrities.  I don't know if I'd ever go back there.  The two guys behind the counter weren't that friendly and the coffee was average.&lt;br /&gt;&lt;br /&gt;We continued on Melrose on the way to the Pacific Design Center stopping only at &lt;a href="http://teagarden.com/"&gt;Dr. Tea's Tea Garden&lt;/a&gt; where we looked around and decided that this might be a nice place to come back to one day, maybe with our parents for a nice afternoon tea break.&lt;br /&gt;&lt;br /&gt;At the Pacific Design Center, we stopped to admire the &lt;a href="http://bayimages.net/los-angeles/west-hollywood/i6399.html"&gt;giant metal sculpture of a chair&lt;/a&gt; and let the kids wander around the waves of grass.&lt;br /&gt;&lt;br /&gt;Next we turned the corner onto Santa Monica Blvd. in the heart of gay West Hollywood.  The street was pleasant to stroll on with its wide sidewalks and shady trees.  We finshed at &lt;a href="http://www.barneysbeanery.com/"&gt;Barney's Beanery&lt;/a&gt; for lunch.  I felt a little strange there with 2 strollers, 2 infants, and a toddler.  Luckily there was a spot for us in the back corner where we could make a little extra noise and breastfeed babies without really disturbing anyone.&lt;br /&gt;&lt;br /&gt;The next walk is Miracle Mile.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31hEQFGOipL._AA_SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7342925433880759695?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7342925433880759695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7342925433880759695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7342925433880759695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7342925433880759695'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/04/walking-la-15-west-hollywood.html' title='Walking L.A. #15 - West Hollywood'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7792555573786417357</id><published>2008-04-02T20:58:00.000-07:00</published><updated>2008-04-02T21:13:51.923-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planning poker'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum from the Trenches</title><content type='html'>Vaibhav, a friend and colleague at work, decided to start blogging about &lt;a href="http://www.scrumalliance.org/"&gt;Scrum&lt;/a&gt;.  I suggested the title &lt;span style="font-style: italic;"&gt;Scrum from the Trenches&lt;/span&gt;, and he went with it:&lt;br /&gt;&lt;a href="http://scrumfromthetrenches.blogspot.com/"&gt;http://scrumfromthetrenches.blogspot.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He and I advocated the use of Scrum a year ago as my team was tasked with an aggressive project in which we had the opportunity to work closely with the product manager.  We implemented the main pieces of Scrum like daily meetings, planning sessions, and sprint-end demos, but also left out a few things like story estimation and the plotting of burn-down charts.  We knew we had a ways to go if we were going to claim we were doing Scrum, but it was a good start and the project management group began to buy into it as a viable practice for future development.&lt;br /&gt;&lt;br /&gt;This year, the team was tasked with a similar project.  To prepare for it, 2 project managers, the QA manager, and Vaibhav attended Scrum training up in the Silicon Valley.  Through lecture and hands-on exercises, they learned the ins and outs of textbook Scrum and returned to work eager to try it out.  The team is now sub-dividing stories into tasks and even playing &lt;a href="http://www.planningpokercards.com/"&gt;Planning Poker&lt;/a&gt;.  How is is going?  That's the subject of Vaibhav's new blog.  &lt;a href="http://scrumfromthetrenches.blogspot.com"&gt;Read it&lt;/a&gt; and find out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7792555573786417357?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7792555573786417357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7792555573786417357' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7792555573786417357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7792555573786417357'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/04/scrum-from-trenches.html' title='Scrum from the Trenches'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-7017115764302647746</id><published>2008-03-31T19:43:00.000-07:00</published><updated>2008-03-31T20:40:40.482-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux action show'/><category scheme='http://www.blogger.com/atom/ns#' term='jungle disk'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon s3'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='eee pc'/><title type='text'>Jungle Disk on Linux</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jungledisk.com/images/jdtext.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.jungledisk.com/images/jdtext.jpg" alt="" border="0" /&gt;&lt;/a&gt;I first heard about &lt;a href="http://www.jungledisk.com/"&gt;Jungle Disk&lt;/a&gt; on the &lt;a href="http://www.linuxactionshow.com/"&gt;Linux Action Show&lt;/a&gt;.  It is a client that manages files on Amazon's &lt;a href="http://www.amazon.com/S3-AWS-home-page-Money/b?ie=UTF8&amp;amp;node=16427261"&gt;Simple Storage Service (S3)&lt;/a&gt;.  The client is cross-platform (Linux, Windows, Mac OS) and costs only a one-time fee of $20 plus $1 a month if you want the optional "extra" services including a web interface to your files.&lt;br /&gt;&lt;br /&gt;With Jungle Disk, you pay as you go for file storage: 15 cents/gig/month for storage and a similar low fee for data transfer. You can use S3 as a virtual drive or "briefcase" with unlimited capacity, or you can use it as a backup location for automated or manual backups from various computers.  I use it for both.&lt;br /&gt;&lt;br /&gt;So far I've setup my Ubuntu desktop and Windows laptop from work as well as my Ubuntu desktop at home.  I have backups configured for important files from each of those.  From my eee PC, I passed on installing Jungle Disk and instead relied on the web interface that came with the Jungle Disk extras.  I don't store any files on my eee, so I don't need a client to back anything up.&lt;br /&gt;&lt;br /&gt;So far I'm very pleased with Jungle Disk.  It will get pricey as I start to backup everything including the 50+ gigs of photos, videos, and music files I have.  50 gigs would be $90 a year.  However, this is well worth it if I ever need to recover my precious files in the event of a fire or multi-hard drive crash.  Photos and videos especially are irreplaceable.&lt;br /&gt;&lt;br /&gt;I took some notes on setting up Jungle Disk on Ubuntu:&lt;br /&gt;&lt;br /&gt;* Sign up for &lt;a href="http://www.amazon.com/S3-AWS-home-page-Money/b?ie=UTF8&amp;amp;node=16427261"&gt;Amazon S3.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://downloads.jungledisk.com/jungledisk/jungledisk.tar.gz"&gt;Download&lt;/a&gt; and unzip Jungle Disk (&lt;span style="font-size:85%;"&gt;jungledisk.tar.gz&lt;/span&gt;) in /opt.&lt;br /&gt;&lt;br /&gt;* Run Jungle Disk Monitor:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;./junglediskmonitor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Install FUSE and davfs:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;    apt-get install fuse-utils&lt;br /&gt;   apt-get install davfs2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Add your user to the fuse group:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;    sudo adduser kweiner fuse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create and mount a directory to access Jungle Disk on the file system:&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;    sudo mkdir /mnt/jungledisk&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;    sudo chgrp fuse /mnt/jungledisk&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;    sudo chmod g+w /mnt/jungledisk&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;    sudo mount.davfs http://localhost:2667 /mnt/jungledisk -o nolocks&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7017115764302647746?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/7017115764302647746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=7017115764302647746' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7017115764302647746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/7017115764302647746'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/03/jungle-disk-on-linux.html' title='Jungle Disk on Linux'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15084382.post-43979595451739574</id><published>2008-03-30T15:42:00.000-07:00</published><updated>2008-03-30T16:25:34.561-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='walking l.a.'/><category scheme='http://www.blogger.com/atom/ns#' term='sunset strip'/><category scheme='http://www.blogger.com/atom/ns#' term='hollywood farmers market'/><title type='text'>Walking L.A. #14 - Sunset Strip</title><content type='html'>My in-laws joined us for this 1 mile walk along Sunset Blvd and the adjacent residential neighborhood in West Hollywood.  I have been to this part of the strip between  Havenhurst Dr. and Olive Dr. many times.  I've had drinks at &lt;a href="http://www.yelp.com/biz/bar-marmont-inc-west-hollywood"&gt;Bar Marmont&lt;/a&gt; and a company holiday party at &lt;a href="http://www.yelp.com/biz/sunset-beach-west-hollywood"&gt;Sunset Beach&lt;/a&gt;.  I've seen friends play jazz at the &lt;a href="http://www.yelp.com/biz/sunset-tower-hotel-fomerly-argyle-hotel-los-angeles"&gt;Argyle Hotel&lt;/a&gt; lounge and been to various concerts at the &lt;a href="http://www.yelp.com/biz/house-of-blues-west-hollywood"&gt;House of Blues&lt;/a&gt; (&lt;a href="http://www.google.com/musica?aid=juF5-bKcskL&amp;amp;sa=X&amp;amp;oi=music&amp;amp;ct=result"&gt;Buckshot LeFonque&lt;/a&gt;, &lt;a href="http://www.google.com/musica?aid=xEBdxnbDozL"&gt;Maceo Parker&lt;/a&gt;, etc.).  Therefore, the first half of the walk wasn't that interesting.&lt;br /&gt;&lt;br /&gt;The second half which circled back on De Longpre Ave and Harper Ave introduced us to the quiet residential life just south of the strip which included apartment buildings built in the 50s and 60s and a nice neighborhood dog park.&lt;br /&gt;&lt;br /&gt;Instead of lingering in the area for lunch, we got back in the car and headed over to the &lt;a href="http://www.farmernet.com/events/one-cfm?venue_id=587"&gt;Hollywood Farmers Market&lt;/a&gt;.  I had been wanting to check out the presence  of &lt;a href="http://www.theodorepayne.org/"&gt;Theodore Payne&lt;/a&gt; at this market, and today I had the chance.  It turned out to be a very nice farmers market with a lot of vendors and shoppers.&lt;br /&gt;&lt;br /&gt;The next walk is West Hollywood.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;Walking L.A.: 36 Walking Tours Exploring Stairways, Streets and Buildings You Never Knew Existed&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0899973639?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0899973639"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31hEQFGOipL._AA_SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0899973639" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-43979595451739574?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenweiner.com/feeds/43979595451739574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=15084382&amp;postID=43979595451739574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/43979595451739574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15084382/posts/default/43979595451739574'/><link rel='alternate' type='text/html' href='http://blog.kenweiner.com/2008/03/walking-la-14-sunset-strip.html' title='Walking L.A. #14 - Sunset Strip'/><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17671235455725704954'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>