<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkEMSH48cSp7ImA9WhRUFU4.&quot;"><id>tag:blogger.com,1999:blog-15084382</id><updated>2012-01-25T14:31:29.079-08:00</updated><category term="abbott kinney" /><category term="walking l.a." /><category term="lower beachwood canyon" /><category term="eclectic cafe" /><category term="noho arts district" /><category term="theodore payne" /><category term="we read" /><category term="scale 6x" /><category term="montana ave" /><category term="venice grind" /><category term="video card" /><category term="Del Rey Neighborhood Council" /><category term="geocaching" /><category term="canon" /><category term="api" /><category term="upgrade" /><category term="external monitor" /><category term="wooly blue curls" /><category term="spinning lady" /><category term="Little Blue Card" /><category term="HDMI" /><category term="bark park" /><category term="Arrested Development" /><category term="7-Eleven" /><category term="UCLA" /><category term="Brooklyn Jazz Underground" /><category term="printer" /><category term="lawn mowers" /><category term="redevelopment" /><category term="google sites" /><category term="blue-ray disc" /><category term="culver city park" /><category term="morph" /><category term="anonymous clothing" /><category term="test america" /><category term="dcr-sr62" /><category term="public transit" /><category term="carlson park" /><category term="scanner" /><category term="facebook" /><category term="tux magazine" /><category term="swivel" /><category term="New York" /><category term="pacific palisades" /><category term="java" /><category term="blue fescue" /><category term="ogg" /><category term="Javascript" /><category term="gripes" /><category term="text editing" /><category term="mike stern" /><category term="pixma" /><category term="Charlie Hunter" /><category term="Los Angeles Times" /><category term="catalina bar and grill" /><category term="hollywood and highland" /><category term="reverse tunnel" /><category term="downtown la" /><category term="left-brained" /><category term="conjunctive points" /><category term="Sharp" /><category term="Del Rey Arts District" /><category term="groovy" /><category term="drivers" /><category term="flickr" /><category term="miro" /><category term="delicious" /><category term="mac" /><category term="quicken" /><category term="10 freeway" /><category term="hollywood bowl" /><category term="giant chess set" /><category term="walk score" /><category term="hbase" /><category term="x-forwarded-for" /><category term="quail hollow" /><category term="ruby" /><category term="jim morrison" /><category term="best fit line" /><category term="yahoo pipes" /><category term="jazz" /><category term="CloudFront" /><category term="cloud studio" /><category term="Belkin" /><category term="sony" /><category term="desert lavender" /><category term="Glencoe-Maxella" /><category term="hd dvd" /><category term="gladstones" /><category term="Twilight Dance Series" /><category term="f-spot" /><category term="woodbridge park" /><category term="castellammare" /><category term="langers" /><category term="Alan Ferber" /><category term="textwrangler" /><category term="linux action show" /><category term="Las Vegas" /><category term="Lawrence Hobgood" /><category term="macbook" /><category term="cloudwatch" /><category term="parallel play" /><category term="video podcasts" /><category term="mar vista farmers market" /><category term="Shanghai" /><category term="HDTV" /><category term="scale 5x" /><category term="mutt mitt" /><category term="amazon aws" /><category term="infant" /><category term="camcorder" /><category term="Mathias Botanical Gardens" /><category term="charts" /><category term="cloud computing" /><category term="rtm" /><category term="shannon ebner" /><category term="sftp" /><category term="parenting" /><category term="ssh" /><category term="culver city" /><category term="santa monica freeway" /><category term="ballona wetlands" /><category term="wonderland ave" /><category term="facebook app" /><category term="Blingo" /><category term="vibez" /><category term="Fidelity Tax Center" /><category term="leimert park" /><category term="space pen" /><category term="eee pc" /><category term="mx880 series" /><category term="scrum" /><category term="sweet lady jane" /><category term="ipod" /><category term="twitter" /><category term="white sage" /><category term="macarthur park" /><category term="client IP address" /><category term="shorturl" /><category term="Ubuntu" /><category term="simpledb" /><category term="Kwik-E-Mart" /><category term="brady bunch" /><category term="build-a-bear" /><category term="Kurt Elling" /><category term="gmail" /><category term="washington blvd" /><category term="DVI" /><category term="amazon ec2" /><category term="stealth building" /><category term="Novell" /><category term="Kerckhoff Hall" /><category term="aroma cafe" /><category term="elastic load balancer" /><category term="ampersand" /><category term="erlang" /><category term="feisty fawn" /><category term="hollywood pop academy" /><category term="downtown culver city" /><category term="whitley heights" /><category term="remote host" /><category term="green line" /><category term="remember the milk" /><category term="open source" /><category term="Santa Barbara Botanic Garden" /><category term="Leadership Training" /><category term="kino" /><category term="R.E.M." /><category term="common craft" /><category term="vedanta society" /><category term="hadoop" /><category term="Thai Fresh" /><category term="pci express" /><category term="Serpentine" /><category term="regression" /><category term="jungle disk" /><category term="blaine tech services" /><category term="second life" /><category term="iphone" /><category term="david hasselhoff" /><category term="language detection" /><category term="carthay circle" /><category term="changing diapers" /><category term="morph appspace" /><category term="papa west" /><category term="Robert Amster" /><category term="water garden" /><category term="Brooklyn" /><category term="nichols restaurant" /><category term="walking" /><category term="scala" /><category term="pinkberry" /><category term="xmpp" /><category term="Mark Ferber" /><category term="jabber" /><category term="Del Rey" /><category term="lacma" /><category term="Ruby On Rails" /><category term="blu-ray" /><category term="northwest santa monica" /><category term="california native plants" /><category term="yahoo center" /><category term="la brea tar pits" /><category term="la bike tour" /><category term="nerdcore" /><category term="native plants" /><category term="melrose" /><category term="google ajax language api" /><category term="los angeles" /><category term="landscape design" /><category term="personal confluence" /><category term="laurel canyon" /><category term="scan gear mp" /><category term="noho" /><category term="bus bench" /><category term="sunset strip" /><category term="baby" /><category term="glxgears" /><category term="get satisfaction" /><category term="planning poker" /><category term="online advertising" /><category term="dropbox" /><category term="optical illusion" /><category term="Bruin Walk" /><category term="hot chocolate" /><category term="Bally's" /><category term="gmond" /><category term="itunes" /><category term="lajug" /><category term="Gzip" /><category term="green party" /><category term="lost account" /><category term="quicken online" /><category term="wiki" /><category term="miracle mile" /><category term="formulas" /><category term="morph labs" /><category term="apple" /><category term="barney's beanery" /><category term="right-brained" /><category term="panasonic" /><category term="tinyurlreverser" /><category term="pastrami" /><category term="graphs" /><category term="mor.ph" /><category term="mar vista" /><category term="bd-j" /><category term="deli" /><category term="victor wooten" /><category term="presidential elections" /><category term="vuescan" /><category term="access logs" /><category term="Edubuntu" /><category term="venice canals" /><category term="gmetad" /><category term="mx882" /><category term="ganglia" /><category term="Big Blue Bus" /><category term="starbucks" /><category term="autoscaling" /><category term="bikely.com" /><category term="bill rosendahl" /><category term="personal wiki" /><category term="Turbo Tax" /><category term="centinela blvd" /><category term="linear regression" /><category term="confluence" /><category term="google calendar" /><category term="XFX" /><category term="tinyurl" /><category term="twitter4r" /><category term="linux" /><category term="high tower" /><category term="hipster pda" /><category term="playa vista" /><category term="Willie Jones III" /><category term="shuttle computers" /><category term="abc news" /><category term="Denon" /><category term="venice beach" /><category term="php" /><category term="politics" /><category term="leaf blower ban" /><category term="ejabberd" /><category term="gregory ain" /><category term="south carthay" /><category term="101 coffee shop" /><category term="green line coalition" /><category term="monkey flower" /><category term="amazon s3" /><category term="Mini DVI" /><category term="Maxwell's Cafe" /><category term="westin" /><category term="Simpsons" /><category term="hollywood farmers market" /><category term="bicycle master plan" /><category term="starbucks card" /><category term="elb" /><category term="open office" /><category term="elasticfox" /><category term="BuzzDash" /><category term="light rail" /><category term="Sound Juicer" /><category term="google reader" /><category term="rumor mill" /><category term="view park" /><category term="venice" /><category term="leaf blowers" /><category term="west hollywood" /><category term="swivel4j" /><category term="sqs" /><title>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="alternate" type="text/html" href="http://blog.kenweiner.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>213</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/kenweiner/KOLe" /><feedburner:info uri="kenweiner/kole" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0cARn8-cCp7ImA9WhRQGEU.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-4580990910275918960</id><published>2011-12-14T10:20:00.000-08:00</published><updated>2011-12-14T10:57:27.158-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-14T10:57:27.158-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cloudwatch" /><category scheme="http://www.blogger.com/atom/ns#" term="autoscaling" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon ec2" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon aws" /><category scheme="http://www.blogger.com/atom/ns#" term="sqs" /><title>AutoScaling Amazon SQS Queue Processors</title><content type="html">One of my favorite things about running servers in Amazon EC2 is the ability to use AutoScaling to automatically add and remove nodes as web traffic increases and decreases. &amp;nbsp;Not only does this generally save money, but it also helps prepare a system to handle traffic spikes.
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Recently I had some fun setting up AutoScaling for a different use case -- a cluster of machines processing messages on an Amazon SQS queue. &amp;nbsp;The idea was to add and remove nodes as the number of visible messages on the queue fluctuated. &amp;nbsp;Again, this keeps costs lower by only running as many nodes as are necessary to process the current workload and handles workload spikes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here are sample steps and commands that you can use for setting up AutoScaling for SQS queue processors:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Create an AMI for a node that will process SQS messages. &amp;nbsp;The node that boots from this AMI should automatically launch one or more queue processing processes. &amp;nbsp;A &lt;a href="http://alestic.com/2009/06/ec2-user-data-scripts"&gt;user-data script&lt;/a&gt; may be useful for this.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Create a Launch Configuration for the queue processor node:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;as-create-launch-config MyQueueConfig --image-id [INSERT YOUR AMI ID HERE] --instance-type c1.medium --key [INSERT YOUR KEYNAME HERE] --user-data [INSERT YOUR USER DATA SCRIPT HERE]&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Create an AutoScaling group for queue processors:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;as-create-auto-scaling-group MyQueueGroup --launch-configuration&amp;nbsp;MyQueueConfig&amp;nbsp;--availability-zones us-east-1b --min-size 1 --max-size 10&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
Create Policies that add/remove 1 node to/from the cluster. &amp;nbsp;They will be invoked when the number of messages on the queue grows excessively high or decreases to an acceptable level:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;as-put-scaling-policy MyScaleUpPolicy -g MyQueueGroup --adjustment=1 --type ChangeInCapacity&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;as-put-scaling-policy MyScaleDownPolicy -g MyQueueGroup --adjustment=-1 --type ChangeInCapacity&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Create Alarms to scale up/down&amp;nbsp;when the number of messages on the queue grows excessively high or decreases to an acceptable level. &amp;nbsp;Use the Policy ARN's returned by the previous &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;as-put-scaling-policy&lt;/span&gt; commands.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;mon-put-metric-alarm --alarm-name MyHighMessagesAlarm --alarm-description "Scale up when number of messages on queue is high" --metric-name ApproximateNumberOfMessagesVisible --namespace AWS/SQS --statistic Average --period 60 --threshold 1000 --comparison-operator GreaterThanThreshold --dimensions QueueName=MyQueue --evaluation-periods 10 --alarm-actions [INSERT&amp;nbsp;MyScaleUpPolicy&amp;nbsp;ARN HERE]&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="brush: plain"&gt;mon-put-metric-alarm --alarm-name&amp;nbsp;MyLowMessagesAlarm&amp;nbsp;--alarm-description "Scale down when number of messages on queue is low" --metric-name ApproximateNumberOfMessagesVisible --namespace AWS/SQS --statistic Average --period 60 --threshold 100 --comparison-operator LessThanThreshold --dimensions QueueName=MyQueue --evaluation-periods 10 --alarm-actions [INSERT&amp;nbsp;MyScaleDownPolicy&amp;nbsp;ARN HERE]&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
In this example the Alarms cause the cluster to scale up when the number of visible messages on the queue remains above 1000 for 10 consecutive minutes and scale down when the number of visible messages falls below 100 for 10 consecutive minutes.&lt;br /&gt;
&lt;br /&gt;
The Policies above adjust the amount of nodes in the cluster by a specific amount, but it is also possible to specify the adjustment in terms of percentages. &amp;nbsp;Using &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--adjustment 10 --type PercentChangeInCapacity&lt;/span&gt; would adjust the amount of nodes by 10 percent.&lt;br /&gt;
&lt;br /&gt;
It also would have been possible to base scaling activities on other AWS/SQS metrics such as:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;NumberOfMessagesSent&lt;/li&gt;
&lt;li&gt;NumberOfMessagesReceived&lt;/li&gt;
&lt;li&gt;NumberOfMessagesDeleted&lt;/li&gt;
&lt;li&gt;NumberOfEmptyReceives&lt;/li&gt;
&lt;li&gt;ApproximateNumberOfMessagesVisible&lt;/li&gt;
&lt;li&gt;ApproximateNumberOfMessagesNotVisible&lt;/li&gt;
&lt;li&gt;ApproximateNumberOfMessagesDelayed&lt;/li&gt;
&lt;li&gt;SentMessageSize&lt;/li&gt;
&lt;/ul&gt;
Here are a few online references relevant to AutoScaling SQS queue processors:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/articles/1464"&gt;Auto Scaling Amazon EC2 with Amazon SQS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.amazonwebservices.com/AutoScaling/latest/DeveloperGuide/index.html?US_SetUpASLBApp.html"&gt;Auto Scaling with Alarms and Load Balancing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.amazonwebservices.com/AutoScaling/latest/APIReference/"&gt;Auto Scaling API Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
Happy SQS AutoScaling!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4580990910275918960?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TBKSCvL5MVNUaT5u_S3J94MuGrI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TBKSCvL5MVNUaT5u_S3J94MuGrI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TBKSCvL5MVNUaT5u_S3J94MuGrI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TBKSCvL5MVNUaT5u_S3J94MuGrI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/Z3HfjBGNQN4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/4580990910275918960/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=4580990910275918960" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4580990910275918960?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4580990910275918960?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/Z3HfjBGNQN4/autoscaling-amazon-sqs-queue-processors.html" title="AutoScaling Amazon SQS Queue Processors" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2011/12/autoscaling-amazon-sqs-queue-processors.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMGRHoyeSp7ImA9WhdaEUk.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-7726811503384953354</id><published>2011-10-20T15:07:00.000-07:00</published><updated>2011-10-20T15:07:05.491-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-20T15:07:05.491-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="online advertising" /><category scheme="http://www.blogger.com/atom/ns#" term="formulas" /><title>Online Advertising Formula Reference</title><content type="html">Occasionally I need to manipulate online advertising formulas to make a quick calculation.&amp;nbsp; The following serves a quick cheat sheet for this purpose.  Note that the term &lt;b&gt;Cost&lt;/b&gt; is from the perspective of the Advertiser.  The web site or publisher can translate that into &lt;b&gt;Revenue&lt;/b&gt;. &lt;br /&gt;
&lt;h3&gt;






CPM Campaigns&lt;/h3&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
Cost = Impressions / 1000 * CPM&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;












CPC Campaigns&lt;/h3&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
Cost = Impressions * CTR * CPC&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
CPM = CTR * CPC * 1000&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;












CPA Campaigns&lt;/h3&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
Cost = Impressions * CTR * AR * CPA &lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
CPM = CTR * AR * CPA * 1000&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;table border="1" cellpadding="3" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;Notation&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CPM&lt;/td&gt;&lt;td&gt;Cost Per 1000 Impressions&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CPC&lt;/td&gt;&lt;td&gt;Cost Per Click&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CPA&lt;/td&gt;&lt;td&gt;Cost Per Action&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTR&lt;/td&gt;&lt;td&gt;Click Thru Rate (Clicks / Impressions)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AR&lt;/td&gt;&lt;td&gt;Action Rate (Actions / Clicks)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-7726811503384953354?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oR3tH9y1oG7O6ww-HD3KCSm0F_k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oR3tH9y1oG7O6ww-HD3KCSm0F_k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oR3tH9y1oG7O6ww-HD3KCSm0F_k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oR3tH9y1oG7O6ww-HD3KCSm0F_k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/MPZ2wjyyLGA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/7726811503384953354/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=7726811503384953354" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7726811503384953354?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7726811503384953354?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/MPZ2wjyyLGA/online-advertising-formula-reference.html" title="Online Advertising Formula Reference" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2011/10/online-advertising-formula-reference.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UESXk8fip7ImA9WhdSEEg.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-4424320706210922699</id><published>2011-07-18T21:53:00.000-07:00</published><updated>2011-07-18T21:53:28.776-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T21:53:28.776-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Del Rey" /><category scheme="http://www.blogger.com/atom/ns#" term="ampersand" /><category scheme="http://www.blogger.com/atom/ns#" term="washington blvd" /><category scheme="http://www.blogger.com/atom/ns#" term="redevelopment" /><category scheme="http://www.blogger.com/atom/ns#" term="centinela blvd" /><category scheme="http://www.blogger.com/atom/ns#" term="shannon ebner" /><title>Giant Ampersand - Washington/Centinela Redevelopment Part 6</title><content type="html">It's been almost 5 years since my &lt;a href="http://blog.kenweiner.com/2007/02/washingtoncentinela-redevelopment-part_25.html"&gt;last post&lt;/a&gt; about the corner lots of Washington and Centinela which are supposedly destined for &lt;a href="http://www.culvercity.org/en/Government/CommunityDevelopment/Redevelopment/CurrentProjects/WashingtonCentinela"&gt;redevelopment&lt;/a&gt;. That's because pretty much nothing has happened on those lots - until this past week.&lt;br /&gt;
&lt;br /&gt;
All of the sudden a 8-foot tall white wooden ampersand appeared in the middle of the lot on the north east corner. &amp;nbsp;I had no idea what it meant, but I was really happy to see it. &amp;nbsp;To me it meant that someone out there is thinking about this vacant plot of land.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6Qa4PHQZcL4/TiUKj9AjxBI/AAAAAAAAAZ0/hwIrkCCzyZw/s1600/IMG_1313.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-6Qa4PHQZcL4/TiUKj9AjxBI/AAAAAAAAAZ0/hwIrkCCzyZw/s320/IMG_1313.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
A little Googling produced an answer. &amp;nbsp;The mysterious ampersand is a public project by Los Angeles-based artist Shannon Ebner. &amp;nbsp;According to the&amp;nbsp;&lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_375505620"&gt;&lt;/span&gt;LAXART web site&lt;span id="goog_375505621"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a=""&gt;:&lt;br /&gt;
&lt;/a=""&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The ampersand is a conjoiner; it signals an incomplete thought and acknowledges that there is more to be said.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
This is part of a Shannon Ebner&amp;nbsp;&lt;a href="http://museumpublicity.com/2011/07/16/hammer-museum-opens-shannon-ebner-exhibition/"&gt;exhibition&lt;/a&gt; at the Hammer Museum which started July 16, 2011. &amp;nbsp;Apparently this isn't the first time she's used an ampersand in her work. &amp;nbsp;See &lt;a href="http://roski.usc.edu/news/assistant-professor-shannon-eb-1.html"&gt;this photo&lt;/a&gt; from a year ago in Milan.&lt;br /&gt;
&lt;br /&gt;
I've been waiting for the redevelopment on this corner to get underway since I moved to this &lt;a href="http://www.delreync.org/"&gt;Del Rey neighborhood&lt;/a&gt; 11 years ago. &amp;nbsp;I really hope, as the giant ampersand acknowledges, that there is more to be said...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4424320706210922699?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jxpNOiPJoi2ieSZS20085hfzduw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jxpNOiPJoi2ieSZS20085hfzduw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jxpNOiPJoi2ieSZS20085hfzduw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jxpNOiPJoi2ieSZS20085hfzduw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/bh4Bpef2ka4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/4424320706210922699/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=4424320706210922699" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4424320706210922699?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4424320706210922699?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/bh4Bpef2ka4/giant-ampersand-washingtoncentinela.html" title="Giant Ampersand - Washington/Centinela Redevelopment Part 6" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6Qa4PHQZcL4/TiUKj9AjxBI/AAAAAAAAAZ0/hwIrkCCzyZw/s72-c/IMG_1313.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2011/07/giant-ampersand-washingtoncentinela.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04EQn8-eSp7ImA9WhZQGEo.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-8679497549168313912</id><published>2011-04-26T21:51:00.000-07:00</published><updated>2011-04-26T21:51:43.151-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-26T21:51:43.151-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scanner" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="printer" /><category scheme="http://www.blogger.com/atom/ns#" term="pixma" /><category scheme="http://www.blogger.com/atom/ns#" term="canon" /><category scheme="http://www.blogger.com/atom/ns#" term="vuescan" /><category scheme="http://www.blogger.com/atom/ns#" term="mx880 series" /><category scheme="http://www.blogger.com/atom/ns#" term="mx882" /><category scheme="http://www.blogger.com/atom/ns#" term="drivers" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="scan gear mp" /><title>Using a Canon Pixma MX882 All-In-One with Ubuntu 10.10</title><content type="html">Are you thinking about buying a&amp;nbsp;&lt;a href="http://www.amazon.com/Canon-MX882-Wireless-Printer-4894B002/dp/B004HO58UW?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Canon Pixma MX882 Wireless Office All-In-One Printer&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=blogkw-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=B004HO58UW" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt;&amp;nbsp;and wondering if it will work with your Ubuntu computer? &amp;nbsp;Although Canon does not make this clear in any way, the answer is &lt;b&gt;YES&lt;/b&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DgJ8Q3PKDFw/Tbed5K3SvyI/AAAAAAAAAXw/TBRaaf5Z0mU/s1600/UbuntuLogo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="50" src="http://1.bp.blogspot.com/-DgJ8Q3PKDFw/Tbed5K3SvyI/AAAAAAAAAXw/TBRaaf5Z0mU/s200/UbuntuLogo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 50px;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.amazon.com/Canon-MX882-Wireless-Printer-4894B002/dp/B004HO58UW?ie=UTF8&amp;amp;tag=blogkw-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/-ryueUsYpfk8/TbedAsyAEfI/AAAAAAAAAXs/IgGqt7BMMU4/s200/mx882.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Instead of using software that comes on a CD with the printer, you'll have to download and install drivers yourself. &amp;nbsp;They are not easy to find if you live in the US since they're only available on European and Asian Canon websites. &amp;nbsp;I'll tell you how to download and install them.&lt;br /&gt;
&lt;h2&gt;Printing&lt;/h2&gt;&lt;h3&gt;Finding and installing the drivers&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Visit the &lt;a href="http://software.canon-europe.com/software/0040867.asp"&gt;Linux IJ Printer Driver&lt;/a&gt; page on the Canon Europe web site.&lt;/li&gt;
&lt;li&gt;Click the&amp;nbsp;&lt;b&gt;Linux IJ Printer Driver MX880 series.tar&lt;/b&gt; link in the Downloads section to download the&amp;nbsp;7299.5 kb tarball.&lt;/li&gt;
&lt;li&gt;Inside the tarball, find and unpack &lt;b&gt;cnijfilter-mx880series-3.50-1-deb.tar.gz&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Inside the resulting&amp;nbsp;&lt;b&gt;cnijfilter-mx880series-3.50-1-deb/packages&lt;/b&gt; directory, locate and double click &lt;b&gt;cnijfilter-common_3.50-1_i386.deb&lt;/b&gt; and &amp;nbsp;&lt;b&gt;cnijfilter-mx880series_3.50-1_i386.deb&lt;/b&gt; in that order. &amp;nbsp;Ubuntu will guide you through the installation.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;Note: The guide that came with this driver asks you to run the &lt;b&gt;install.sh&lt;/b&gt; program, but it didn't work for me. &amp;nbsp;When I ran it, I got an error:&amp;nbsp;&lt;i&gt;An error occurred. The package management system cannot be identified.&lt;/i&gt;&lt;br /&gt;
&lt;h3&gt;Adding the printer&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;From Ubuntu's menu, select: &lt;b&gt;System&lt;/b&gt;, &amp;nbsp;&lt;b&gt;Administration&lt;/b&gt;, then &lt;b&gt;Printing&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;From Printing window that opens, select &lt;b&gt;Add&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;After a few seconds, &amp;nbsp;you should see a &lt;b&gt;Canon MX880&lt;/b&gt; printer show up under &lt;b&gt;Network Printer&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Select it and click &lt;b&gt;Forward&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Finish entering your printer &lt;b&gt;Name&lt;/b&gt;, &lt;b&gt;Description&lt;/b&gt;, and &lt;b&gt;Location&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;Scanning&lt;/h2&gt;&lt;h3&gt;Finding and installing the drivers&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Visit the&amp;nbsp;&lt;a href="http://software.canon-europe.com/software/0040873.asp"&gt;Linux IJ Scanner Driver&lt;/a&gt;&amp;nbsp;page on the Canon Europe web site.&lt;/li&gt;
&lt;li&gt;Click the&amp;nbsp;&lt;b&gt;Linux IJ Scanner Driver MX880 series.tar&lt;/b&gt;&amp;nbsp;link in the Downloads section to download the&amp;nbsp;3072 kb tarball.&lt;/li&gt;
&lt;li&gt;Inside the tarball, find and unpack&amp;nbsp;&lt;b&gt;scangearmp-mx880series-1.70-1-deb.tar.gz&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Inside the resulting&amp;nbsp;&lt;b&gt;scangearmp-mx880series-1.70-1-deb/packages&lt;/b&gt;&amp;nbsp;directory, locate and double click&amp;nbsp;&lt;b&gt;scangearmp-common_1.70-1_i386.deb&lt;/b&gt;&amp;nbsp;and &amp;nbsp;&lt;b&gt;scangearmp-mx880series_1.70-1_i386.deb&lt;/b&gt;&amp;nbsp;in that order. &amp;nbsp;Ubuntu will guide you through the installation.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;Note: The guide that came with this driver asks you to run the&amp;nbsp;&lt;b&gt;install.sh&lt;/b&gt;&amp;nbsp;program, but it didn't work for me. &amp;nbsp;When I ran it, I got an error:&amp;nbsp;&lt;i&gt;An error occurred. The package management system cannot be identified.&lt;/i&gt;&lt;br /&gt;
&lt;ol&gt;&lt;/ol&gt;&lt;h3&gt;Scan Gear MP&lt;/h3&gt;With the drivers, an app called Scan Gear MP is also installed. &amp;nbsp;This app serves as an interface to your scanner and has a Basic Mode:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-J1ZAjXAHtUI/TbeXnvo8HUI/AAAAAAAAAXg/bhB7ttu2m4k/s1600/scangear-basic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-J1ZAjXAHtUI/TbeXnvo8HUI/AAAAAAAAAXg/bhB7ttu2m4k/s320/scangear-basic.png" width="306" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
And an Advanced Mode:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GL6bKKcKl-M/TbeXp2ME49I/AAAAAAAAAXk/xorGofZ3zwQ/s1600/scan-gear-advanced.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-GL6bKKcKl-M/TbeXp2ME49I/AAAAAAAAAXk/xorGofZ3zwQ/s320/scan-gear-advanced.png" width="306" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You can launch the app from the terminal by typing&amp;nbsp;&lt;b&gt;scangearmp&lt;/b&gt;&amp;nbsp;and it is also available within&amp;nbsp;&lt;a href="http://www.gimp.org/"&gt;Gimp&lt;/a&gt;&amp;nbsp;by selecting&amp;nbsp;&lt;b&gt;File&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Create&lt;/b&gt;,&lt;b&gt;&amp;nbsp;Scan Gear MP...&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
I have not yet figure out a way to use the scanner via &lt;a href="https://help.ubuntu.com/community/XSane"&gt;XSane&lt;/a&gt;. &amp;nbsp;I'd love to hear comments about whether this is possible and how to do it. &amp;nbsp;Without XSane support, I can't use familiar programs such as&amp;nbsp;&lt;a href="http://bobthegnome.blogspot.com/2009/12/introducing-simple-scan.html"&gt;SimpleScan&lt;/a&gt; and&amp;nbsp;&lt;a href="http://gscan2pdf.sourceforge.net/"&gt;gscan2pdf&lt;/a&gt;.&lt;br /&gt;
&lt;h3&gt;VueScan&lt;/h3&gt;One more thing to mention. &amp;nbsp;Before I figured out Canon made drivers for this scanner, I came across a program called &lt;a href="http://www.hamrick.com/"&gt;VueScan&lt;/a&gt;&amp;nbsp;which claimed to &lt;a href="http://www.hamrick.com/vuescan/canon_mx880.html"&gt;support MX880 series printers&lt;/a&gt;&amp;nbsp;on Linux via the network without installing any drivers at all. &amp;nbsp;It took seconds to download, launch, and see that this program could communicate with my MX882 scanner with ease! &amp;nbsp;It may be worth the $79.95 if you can't get Canon's drivers to work.&lt;br /&gt;
&lt;br /&gt;
Happy printing, scanning, copying, and faxing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-8679497549168313912?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xEllQNoVQvI-4JmHjFVwVakcCx0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xEllQNoVQvI-4JmHjFVwVakcCx0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xEllQNoVQvI-4JmHjFVwVakcCx0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xEllQNoVQvI-4JmHjFVwVakcCx0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/3-K4Ruxd4wA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/8679497549168313912/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=8679497549168313912" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/8679497549168313912?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/8679497549168313912?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/3-K4Ruxd4wA/using-canon-pixma-mx882-all-in-one-with.html" title="Using a Canon Pixma MX882 All-In-One with Ubuntu 10.10" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-DgJ8Q3PKDFw/Tbed5K3SvyI/AAAAAAAAAXw/TBRaaf5Z0mU/s72-c/UbuntuLogo.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.kenweiner.com/2011/04/using-canon-pixma-mx882-all-in-one-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHRH89eyp7ImA9Wx9VF08.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-1756363625228131150</id><published>2011-02-03T01:02:00.000-08:00</published><updated>2011-02-03T01:02:15.163-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-03T01:02:15.163-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="amazon ec2" /><category scheme="http://www.blogger.com/atom/ns#" term="text editing" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="textwrangler" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="sftp" /><title>Edit Remote EC2 Text Files with TextWrangler</title><content type="html">This post explains how to use &lt;a href="http://www.barebones.com/products/textwrangler/"&gt;TextWrangler&lt;/a&gt; on a Mac to edit text files that live on a remote &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; instance with &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I assume you already know how to SSH to Amazon using an Identity File:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: plain"&gt;ssh -i ~ec2-keys/id_your-keypair ubuntu@ec2-public-dns-name.amazonaws.com&lt;/pre&gt;&lt;br /&gt;
You can use a similar command to connect to your EC2 instance via SFTP:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: plain"&gt;sftp -o IdentityFile=eec2-keys/id_your-keypair ubuntu@ec2-public-dns-name.amazonaws.com&lt;/pre&gt;&lt;br /&gt;
TextWrangler allows you to open a file from an SFTP server, but it doesn't allow you to configure an Identity File as you did when SSHing or SFTPing from the command line.  To work around this limitation, you simply have to configure your SSH client so that it knows the Identity File you want to use.  Create ~/.ssh/config if it doesn't already exist and add a line specifying your Identity File location:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: plain"&gt;echo 'IdentityFile ~ec2-keys/id_your-keypair' &amp;gt;&amp;gt; ~/.ssh/config
&lt;/pre&gt;&lt;br /&gt;
Now you're ready to use TextWrangler to connect to your server and browse files.  Choose: File -&amp;gt; Open from FTP/SFTP Server... Then enter your server publisher DNS name, check the SFTP box and enter &amp;nbsp;&lt;b&gt;ubuntu&lt;/b&gt; as the User name. &amp;nbsp;You can leave the Password: field blank.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5QIU8D7GfDs/TUpteedFJWI/AAAAAAAAAXI/oFc8TkPTjPA/s1600/Picture+1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5QIU8D7GfDs/TUpteedFJWI/AAAAAAAAAXI/oFc8TkPTjPA/s1600/Picture+1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you hit connect, &amp;nbsp;you TextWrangler will allow you to browse the file system of your EC2 instance, choose a file, and edit it. &amp;nbsp;When you save the file, it will update directly on the remote EC2 instance. &amp;nbsp;That's all there is to it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-1756363625228131150?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/--IGywzi_ELIUjGNqn_iIlTHZfg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/--IGywzi_ELIUjGNqn_iIlTHZfg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/--IGywzi_ELIUjGNqn_iIlTHZfg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/--IGywzi_ELIUjGNqn_iIlTHZfg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/yVvuH15GdxI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/1756363625228131150/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=1756363625228131150" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/1756363625228131150?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/1756363625228131150?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/yVvuH15GdxI/edit-remote-ec2-text-files-with.html" title="Edit Remote EC2 Text Files with TextWrangler" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_5QIU8D7GfDs/TUpteedFJWI/AAAAAAAAAXI/oFc8TkPTjPA/s72-c/Picture+1.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.kenweiner.com/2011/02/edit-remote-ec2-text-files-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQGSXkyfSp7ImA9Wx5bEUs.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-4728425325124128742</id><published>2010-10-27T01:08:00.000-07:00</published><updated>2010-10-27T01:15:28.795-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T01:15:28.795-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gmetad" /><category scheme="http://www.blogger.com/atom/ns#" term="ganglia" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon ec2" /><category scheme="http://www.blogger.com/atom/ns#" term="hbase" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="gmond" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>Monitor HBase &amp; Hadoop with Ganglia on EC2</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ganglia.sourceforge.net/logo_small.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="91" src="http://ganglia.sourceforge.net/logo_small.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;This post is a recipe on setting up &lt;a href="http://ganglia.sourceforge.net/"&gt;Ganglia&lt;/a&gt; to monitor an&amp;nbsp;&lt;a href="http://hbase.apache.org/"&gt;HBase&lt;/a&gt; and &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt; cluster on the&amp;nbsp;&lt;a href="http://www.ubuntu.com/server"&gt;Ubuntu&lt;/a&gt;&amp;nbsp;OS on&amp;nbsp;&lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;.&amp;nbsp;Ganglia is a monitoring system for grids and clusters consisting of the following 3 components:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;gmond&lt;/b&gt;&lt;br /&gt;
A &lt;b&gt;G&lt;/b&gt;anglia &lt;b&gt;Mon&lt;/b&gt;itoring &lt;b&gt;D&lt;/b&gt;aemon (gmond) runs on each node in the cluster and collects statistics from the node it runs on as well as other nodes in the cluster. Normally it is a &lt;a href="http://en.wikipedia.org/wiki/Multicast"&gt;multicast&lt;/a&gt; system where each gmond node receives data from its peers. However, since Amazon EC2 does not support multicast at this time, you must setup Ganglia Monitoring Daemons in &lt;a href="http://en.wikipedia.org/wiki/Unicast"&gt;unicast&lt;/a&gt; mode where each node in a cluster is configured to send its data to one pre-designated node.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;gmetad&lt;/b&gt;&lt;br /&gt;
A &lt;b&gt;G&lt;/b&gt;anglia &lt;b&gt;Meta&lt;/b&gt; &lt;b&gt;D&lt;/b&gt;aemon (gmetad) runs for each grid and collects data from the Ganglia Monitoring Daemons, one from each cluster. It stores the data it collects on the file system.&amp;nbsp;We'll only be configuring one grid and therefore one gmetad. We'll be running gmetad from the same node that the PHP Web Front End is installed on.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;PHP Web Front End&lt;/b&gt;&lt;br /&gt;
A &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; application reads the data and provides a UI to visualize the data over time with pretty graphs. &amp;nbsp;&lt;a href="http://monitor.millennium.berkeley.edu/"&gt;Example from UC Berkeley&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Approach&lt;/span&gt;&lt;br /&gt;
Our HBase cluster has one Master node (with Hadoop's Name Node and Job Tracker) and the rest Region Server nodes (each with a Hadoop Data Node and Task Tracker). &amp;nbsp;Since we must use Ganglia in unicast mode on EC2, we need to choose one of these nodes to receive data from each of the other nodes. &amp;nbsp;We'll configure each Region Server gmond to send data to the gmond running on the Master. &amp;nbsp;A separate node will be used to run gmetad and the PHP web front end. &amp;nbsp;The gmetad will be configured to poll the Master's gmond for aggregated cluster data.&lt;br /&gt;
&lt;br /&gt;
Getting the right version of Ganglia is important because of compatibility issues with Hadoop and HBase's Ganglia clients. We're using HBase 0.20.6 and Hadoop 0.20.2. Therefore, we're going to use Ganglia 3.0.7, the latest of 3.0.x at the time of writing. &amp;nbsp;You could use the latest Ganglia 3.1.x if you're willing to apply the patch found in &lt;a href="https://issues.apache.org/jira/browse/HADOOP-4675"&gt;HADOOP-4675&lt;/a&gt;&amp;nbsp;to your Hadoop installation.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Setting up gmond&lt;/span&gt;&lt;br /&gt;
Add a ganglia user.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;adduser --disabled-login --no-create-home ganglia
&lt;/pre&gt;Download and unpack Ganglia 3.0.7.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;wget http://downloads.sourceforge.net/project/ganglia/ganglia%20monitoring%20core/3.0.7%20%28Fossett%29/ganglia-3.0.7.tar.gz
tar -xzvf ganglia-3.0.7.tar.gz -C /opt
rm ganglia-3.0.7.tar.gz
&lt;/pre&gt;Install dependencies&lt;br /&gt;
&lt;pre class="brush: plain"&gt;apt-get -y install build-essential libapr1-dev libconfuse-dev libexpat1-dev python-dev
&lt;/pre&gt;&lt;br /&gt;
Compile and install.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;cd /opt/ganglia-3.0.7
./configure
make &amp;amp;&amp;amp; make install
&lt;/pre&gt;Generate a default config file.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;gmond --default_config &amp;gt; /etc/gmond.conf
&lt;/pre&gt;&lt;br /&gt;
Configure /etc/gmond.conf&lt;br /&gt;
&lt;br /&gt;
Modify the globals.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;globals {
  user = ganglia
}
&lt;/pre&gt;Define the cluster.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;cluster {
  name = HBase
  owner = "Your Company"
  latlong = "N34.02 W118.45"
  url = "http://yourcompany.com/"
}
&lt;/pre&gt;Disable multicast and define the host, the HBase master, where nodes in the cluster send data.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;udp_send_channel {
  # mcast_join = 239.2.11.71
  host = master.yourcompany.com
  port = 8649
  ttl = 1
}

udp_recv_channel {
  # mcast_join = 239.2.11.71
  port = 8649
  # bind = 239.2.11.71
}
&lt;/pre&gt;&lt;br /&gt;
Run gmond:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;gmond
&lt;/pre&gt;&lt;br /&gt;
Note: As far as I know, there is no way to stop gmond other than killing the process.&lt;br /&gt;
&lt;br /&gt;
You can test each gmond node to make sure it is working.  From each node:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;telnet localhost 8649
&lt;/pre&gt;You should see XML output.&lt;br /&gt;
&lt;br /&gt;
Once gmond is installed and running on each node, move on to setup gmetad.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Setting up gmetad&lt;/span&gt;&lt;br /&gt;
We're going to setup a new EC2 instance to run gmetad and the PHP web front end. &amp;nbsp;A &lt;a href="http://blog.9minutesnooze.com/amazon-ec2-micro-instances-t1micro/"&gt;t1.micro&lt;/a&gt; should be sufficient for modest clusters. &amp;nbsp;gmetad will be configured to poll the gmond running on the HBase master for aggregated cluster data.&lt;br /&gt;
&lt;br /&gt;
Add a ganglia user.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;adduser --disabled-login --no-create-home ganglia
&lt;/pre&gt;Download and unpack Ganglia 3.0.7.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;wget http://downloads.sourceforge.net/project/ganglia/ganglia%20monitoring%20core/3.0.7%20%28Fossett%29/ganglia-3.0.7.tar.gz
tar -xzvf ganglia-3.0.7.tar.gz -C /opt
rm ganglia-3.0.7.tar.gz
&lt;/pre&gt;Install dependencies&lt;br /&gt;
&lt;pre class="brush: plain"&gt;apt-get -y install build-essential libapr1-dev libconfuse-dev libexpat1-dev python-dev librrd2-dev
&lt;/pre&gt;Compile and install.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;cd /opt/ganglia-3.0.7
./configure
make &amp;amp;&amp;amp; make install
&lt;/pre&gt;Copy the default config file.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;cp /opt/ganglia-3.0.7/gmetad/gmetad.conf /etc/gmetad.conf
&lt;/pre&gt;&lt;br /&gt;
Configure /etc/gmetad.conf&lt;br /&gt;
&lt;pre class="brush: plain"&gt;setuid_username "ganglia"
data_source "HBase" master.yourcompany.com
gridname "YourCompany"
&lt;/pre&gt;Create directories where Ganglia will save its data.&lt;br /&gt;
&lt;pre class="brush: plain"&gt;mkdir /var/lib/ganglia
mkdir /var/lib/ganglia/rrds/
chown -R ganglia:ganglia /var/lib/ganglia/
&lt;/pre&gt;Run gmetad:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;gmetad
&lt;/pre&gt;For troubleshooting, it might be helpful not to daemonize gmetad:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;gmetad -d 1
&lt;/pre&gt;Note: As far as I know, there is no way to stop gmetad other than killing the process.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Setting up the PHP Web Front End&lt;/span&gt;&lt;br /&gt;
Install Apache and PHP libraries:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;apt-get -y install rrdtool apache2 php5-mysql libapache2-mod-php5 php5-gd
&lt;/pre&gt;Copy PHP web app into Apache's HTML directory:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;cp -r /opt/ganglia-3.0.7/web /var/www/ganglia
&lt;/pre&gt;Restart Apache:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;/etc/init.d/apache2 restart
&lt;/pre&gt;&lt;br /&gt;
You should now be able to visit the Ganglia console on http://ganglia.yourcompany.com/ganglia and see pretty graphs and charts for machine metrics like load, memory, disk use, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Configuring Hadoop and HBase&lt;/span&gt;&lt;br /&gt;
The next step is to configure Hadoop and HBase to start sending metrics to the master gmond.  Detailed instructions are given &lt;a href="http://wiki.apache.org/hadoop/GangliaMetrics"&gt;here&lt;/a&gt; and &lt;a href="http://hbase.apache.org/docs/current/metrics.html"&gt;here&lt;/a&gt; for Hadoop and HBase respectively.&lt;br /&gt;
&lt;br /&gt;
Here's what we end up with inside HBase's conf/hadoop-metrics.properties:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext
hbase.period=10
hbase.servers=master.yourcompany.com:8649

jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext
jvm.period=10
jvm.servers=master.yourcompany.com:8649

rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext
rpc.period=10
rpc.servers=master.yourcompany.com:8649
&lt;/pre&gt;&lt;br /&gt;
And inside Hadoop's conf/hadoop-metrics.properties:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext
dfs.period=10
dfs.servers=master.yourcompany.com:8649

mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext
mapred.period=10
mapred.servers=master.yourcompany.com:8649

jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext
jvm.period=10
jvm.servers=master.yourcompany.com:8649
&lt;/pre&gt;&lt;br /&gt;
Once the hadoop-metrics.properties files are modified on all nodes in your cluster, you'll need to restart HBase and Hadoop.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Metrics&lt;/span&gt;&lt;br /&gt;
After restarting, you should see the following metrics show up in Ganglia for your HBase and Hadoop cluster:&lt;br /&gt;
&lt;pre class="brush: plain"&gt;hbase.regionserver.blockCacheCount
hbase.regionserver.blockCacheFree
hbase.regionserver.blockCacheHitRatio
hbase.regionserver.blockCacheSize
hbase.regionserver.compactionQueueSize
hbase.regionserver.fsReadLatency_avg_time
hbase.regionserver.fsReadLatency_num_ops
hbase.regionserver.fsSyncLatency_avg_time
hbase.regionserver.fsSyncLatency_num_ops
hbase.regionserver.fsWriteLatency_avg_time
hbase.regionserver.fsWriteLatency_num_ops
hbase.regionserver.memstoreSizeMB
hbase.regionserver.regions
hbase.regionserver.requests
hbase.regionserver.storefileIndexSizeMB
hbase.regionserver.storefiles
hbase.regionserver.stores

rpc.metrics.RpcProcessingTime_avg_time
rpc.metrics.RpcProcessingTime_num_ops
rpc.metrics.RpcQueueTime_avg_time
rpc.metrics.RpcQueueTime_num_ops
rpc.metrics.addColumn_avg_time
rpc.metrics.addColumn_num_ops
rpc.metrics.checkAndPut_avg_time
rpc.metrics.checkAndPut_num_ops
rpc.metrics.close_avg_time
rpc.metrics.close_num_ops
rpc.metrics.createTable_avg_time
rpc.metrics.createTable_num_ops
rpc.metrics.deleteColumn_avg_time
rpc.metrics.deleteColumn_num_ops
rpc.metrics.deleteTable_avg_time
rpc.metrics.deleteTable_num_ops
rpc.metrics.delete_avg_time
rpc.metrics.delete_num_ops
rpc.metrics.disableTable_avg_time
rpc.metrics.disableTable_num_ops
rpc.metrics.enableTable_avg_time
rpc.metrics.enableTable_num_ops
rpc.metrics.exists_avg_time
rpc.metrics.exists_num_ops
rpc.metrics.getClosestRowBefore_avg_time
rpc.metrics.getClosestRowBefore_num_ops
rpc.metrics.getClusterStatus_avg_time
rpc.metrics.getClusterStatus_num_ops
rpc.metrics.getHServerInfo_avg_time
rpc.metrics.getHServerInfo_num_ops
rpc.metrics.getOnlineRegionsAsArray_avg_time
rpc.metrics.getOnlineRegionsAsArray_num_ops
rpc.metrics.getProtocolVersion_avg_time
rpc.metrics.getProtocolVersion_num_ops
rpc.metrics.getRegionInfo_avg_time
rpc.metrics.getRegionInfo_num_ops
rpc.metrics.getRegionsAssignment_avg_time
rpc.metrics.getRegionsAssignment_num_ops
rpc.metrics.get_avg_time
rpc.metrics.get_num_ops
rpc.metrics.incrementColumnValue_avg_time
rpc.metrics.incrementColumnValue_num_ops
rpc.metrics.isMasterRunning_avg_time
rpc.metrics.isMasterRunning_num_ops
rpc.metrics.lockRow_avg_time
rpc.metrics.lockRow_num_ops
rpc.metrics.modifyColumn_avg_time
rpc.metrics.modifyColumn_num_ops
rpc.metrics.modifyTable_avg_time
rpc.metrics.modifyTable_num_ops
rpc.metrics.next_avg_time
rpc.metrics.next_num_ops
rpc.metrics.openScanner_avg_time
rpc.metrics.openScanner_num_ops
rpc.metrics.put_avg_time
rpc.metrics.put_num_ops
rpc.metrics.regionServerReport_avg_time
rpc.metrics.regionServerReport_num_ops
rpc.metrics.regionServerStartup_avg_time
rpc.metrics.regionServerStartup_num_ops
rpc.metrics.shutdown_avg_time
rpc.metrics.shutdown_num_ops
rpc.metrics.unlockRow_avg_time
rpc.metrics.unlockRow_num_ops

dfs.datanode.blockChecksumOp_avg_time
dfs.datanode.blockChecksumOp_num_ops
dfs.datanode.blockReports_avg_time
dfs.datanode.blockReports_num_ops
dfs.datanode.block_verification_failures
dfs.datanode.blocks_read
dfs.datanode.blocks_removed
dfs.datanode.blocks_replicated
dfs.datanode.blocks_verified
dfs.datanode.blocks_written
dfs.datanode.bytes_read
dfs.datanode.bytes_written
dfs.datanode.copyBlockOp_avg_time
dfs.datanode.copyBlockOp_num_ops
dfs.datanode.heartBeats_avg_time
dfs.datanode.heartBeats_num_ops
dfs.datanode.readBlockOp_avg_time
dfs.datanode.readBlockOp_num_ops
dfs.datanode.readMetadataOp_avg_time
dfs.datanode.readMetadataOp_num_ops
dfs.datanode.reads_from_local_client
dfs.datanode.reads_from_remote_client
dfs.datanode.replaceBlockOp_avg_time
dfs.datanode.replaceBlockOp_num_ops
dfs.datanode.writeBlockOp_avg_time
dfs.datanode.writeBlockOp_num_ops
dfs.datanode.writes_from_local_client
dfs.datanode.writes_from_remote_client

jvm.metrics.gcCount
jvm.metrics.gcTimeMillis
jvm.metrics.logError
jvm.metrics.logFatal
jvm.metrics.logInfo
jvm.metrics.logWarn
jvm.metrics.memHeapCommittedM
jvm.metrics.memHeapUsedM
jvm.metrics.memNonHeapCommittedM
jvm.metrics.memNonHeapUsedM
jvm.metrics.threadsBlocked
jvm.metrics.threadsNew
jvm.metrics.threadsRunnable
jvm.metrics.threadsTerminated
jvm.metrics.threadsTimedWaiting
jvm.metrics.threadsWaiting
&lt;/pre&gt;&lt;br /&gt;
As you can see, the metrics are incredibly useful for understanding the health of your HBase and Hadoop cluster over time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15084382-4728425325124128742?l=blog.kenweiner.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/So_fXr4w6WNSVcm3aLLkR3pHS8U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/So_fXr4w6WNSVcm3aLLkR3pHS8U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/So_fXr4w6WNSVcm3aLLkR3pHS8U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/So_fXr4w6WNSVcm3aLLkR3pHS8U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/_emZfr7Ox-A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.kenweiner.com/feeds/4728425325124128742/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=4728425325124128742" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4728425325124128742?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4728425325124128742?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/_emZfr7Ox-A/monitor-hbase-hadoop-with-ganglia-on.html" title="Monitor HBase &amp; Hadoop with Ganglia on EC2" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.kenweiner.com/2010/10/monitor-hbase-hadoop-with-ganglia-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4BRHY4fip7ImA9WxNaFkk.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-30T22:12:35.836-08:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fIt1xRGcwGjqnyWClupO-oiqCPk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fIt1xRGcwGjqnyWClupO-oiqCPk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fIt1xRGcwGjqnyWClupO-oiqCPk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fIt1xRGcwGjqnyWClupO-oiqCPk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/BLZ3edYrnNk" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/9056937890343564994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/BLZ3edYrnNk/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2009/11/swivel4j-new-java-client-for-swivel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFQ304eyp7ImA9WxNRGEw.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-12T21:16:52.333-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HbHX0uC5pNP_Wa9Skr4shFWnCcI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HbHX0uC5pNP_Wa9Skr4shFWnCcI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HbHX0uC5pNP_Wa9Skr4shFWnCcI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HbHX0uC5pNP_Wa9Skr4shFWnCcI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/RbxgU_r6Nas" height="1" width="1"/&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="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=4677685859897427559" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4677685859897427559?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4677685859897427559?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/RbxgU_r6Nas/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.kenweiner.com/2009/09/amazon-elb-capturing-client-ip-address.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHRH06fyp7ImA9Wx5UGUk.&quot;"><id>tag:blogger.com,1999:blog-15084382.post-820388072648911732</id><published>2009-08-31T22:49:00.000-07:00</published><updated>2010-10-24T11:05:35.317-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-24T11:05:35.317-07:00</app:edited><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>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="brush: text"&gt;gzipEnabled = true;&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="brush: js"&gt;&amp;lt;script type="text/javascript" src="gzipcheck.js.jgz"&amp;gt;
&amp;lt;/script&amp;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="brush: text"&gt;Content-Encoding = gzip
Content-Type = application/x-javascript
&lt;/pre&gt;&lt;br /&gt;
And if you want browsers to cache your files forever (almost):&lt;br /&gt;
&lt;pre class="brush: text"&gt;Cache-Control = max-age=315360000
Expires = Tue, 31 Dec 2019 20:00:00 GMT
&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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jfsTQcOe1EalCSgCAjKMKaG74q0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jfsTQcOe1EalCSgCAjKMKaG74q0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jfsTQcOe1EalCSgCAjKMKaG74q0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jfsTQcOe1EalCSgCAjKMKaG74q0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/N2a27Yl1Njk" height="1" width="1"/&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="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=820388072648911732" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/820388072648911732?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/820388072648911732?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/N2a27Yl1Njk/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.kenweiner.com/2009/08/serving-gzipped-javascript-files-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFR30yeyp7ImA9WxVaFE8.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T22:43:36.393-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lDUl3fcB_knHEemLBwq1hEYURn0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lDUl3fcB_knHEemLBwq1hEYURn0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lDUl3fcB_knHEemLBwq1hEYURn0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lDUl3fcB_knHEemLBwq1hEYURn0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/10J2owAWSa8" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7968959792995293264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/10J2owAWSa8/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></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>1</thr:total><feedburner:origLink>http://blog.kenweiner.com/2009/04/ubuntu-license-plate-on-santa-monica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEECRXsyeCp7ImA9WxVREE0.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-14T22:57:44.590-08:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QZX6YyLQF6E4ZISNYnJdmU7kEwU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZX6YyLQF6E4ZISNYnJdmU7kEwU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QZX6YyLQF6E4ZISNYnJdmU7kEwU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZX6YyLQF6E4ZISNYnJdmU7kEwU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/KC8siiqsBLQ" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4137797323024640513?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/KC8siiqsBLQ/products-i-cant-live-without-2009.html" title="Products I Can't Live Without - 2009" /><author><name>Ken</name><uri>http://www.blogger.com/profile/12369783173503766970</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.kenweiner.com/2009/01/products-i-cant-live-without-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ASH84fyp7ImA9WxRbFEw.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-04T10:04:09.137-08:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5LKtvjyKPVcVifLp_V3vzfm_9aY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5LKtvjyKPVcVifLp_V3vzfm_9aY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5LKtvjyKPVcVifLp_V3vzfm_9aY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5LKtvjyKPVcVifLp_V3vzfm_9aY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/ELBNaJxIMLU" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7344389379746606220?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/ELBNaJxIMLU/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/12/groovy-best-fit-line.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ENQH86cSp7ImA9WxRbE0s.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-03T20:41:31.119-08:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tcUQl3p7zank-GBxVem02Y3L2EI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tcUQl3p7zank-GBxVem02Y3L2EI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tcUQl3p7zank-GBxVem02Y3L2EI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tcUQl3p7zank-GBxVem02Y3L2EI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/Hqf3x4s4RK8" height="1" width="1"/&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="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=6461964558665262780" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/6461964558665262780?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/6461964558665262780?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/Hqf3x4s4RK8/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>13</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/11/personal-hosted-confluence-wiki-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEFSXY4fip7ImA9WxRRFks.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T22:36:58.836-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Jdjg4JmoLLTS7iP3t3p8Txch7dQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jdjg4JmoLLTS7iP3t3p8Txch7dQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Jdjg4JmoLLTS7iP3t3p8Txch7dQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jdjg4JmoLLTS7iP3t3p8Txch7dQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/hfMhjtkJllQ" height="1" width="1"/&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="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=7904930708412121777" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7904930708412121777?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7904930708412121777?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/hfMhjtkJllQ/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/09/macbook-to-hdtv-via-mini-dvi-to-dvi-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MERHo4eSp7ImA9WxRRFks.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T22:16:45.431-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NCG6Pg7so1kvWFf7D3Jdha6FYsw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCG6Pg7so1kvWFf7D3Jdha6FYsw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NCG6Pg7so1kvWFf7D3Jdha6FYsw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCG6Pg7so1kvWFf7D3Jdha6FYsw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/VrGChJT7yKE" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4726072714071306342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/VrGChJT7yKE/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/09/giving-in-and-buying-macbook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AFQHo6fyp7ImA9WxdVEEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-14T21:21:51.417-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4XvnRcoioJ8aeTbncR0QBx4SSvI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4XvnRcoioJ8aeTbncR0QBx4SSvI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4XvnRcoioJ8aeTbncR0QBx4SSvI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4XvnRcoioJ8aeTbncR0QBx4SSvI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/d2Q9oMTP7Lc" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/8956344715439327306?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/d2Q9oMTP7Lc/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/07/walking-la-20-lower-beachwood-canyon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBSX05fCp7ImA9WxdVEEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-14T20:59:18.324-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d3nAQVNyqxm14WDpDbQZI255UfY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d3nAQVNyqxm14WDpDbQZI255UfY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d3nAQVNyqxm14WDpDbQZI255UfY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d3nAQVNyqxm14WDpDbQZI255UfY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/QBWcqrnOG3w" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7364226020553906333?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/QBWcqrnOG3w/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/07/walking-la-19-whitley-heights-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMFRnw4fSp7ImA9WxdVEEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-14T21:00:17.235-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mnYqJAQUWJb2q41r9kVefmbw6Z4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mnYqJAQUWJb2q41r9kVefmbw6Z4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mnYqJAQUWJb2q41r9kVefmbw6Z4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mnYqJAQUWJb2q41r9kVefmbw6Z4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/8W0cqfXSwqY" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/6676945500411487062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/8W0cqfXSwqY/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/06/walking-la-18-high-tower-and-hollywood.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04HQXw_eSp7ImA9WxdRFEo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-02T23:52:10.241-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n0rJ1bXdhjwxNx-uY6jjGL_Z6GY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n0rJ1bXdhjwxNx-uY6jjGL_Z6GY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n0rJ1bXdhjwxNx-uY6jjGL_Z6GY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n0rJ1bXdhjwxNx-uY6jjGL_Z6GY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/6qQRKpe31xE" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7941073909504628995?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/6qQRKpe31xE/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/06/my-twitter-account-has-disappeared.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IBQ3s8eCp7ImA9WxdQEEs.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-09T20:45:52.570-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OPtim0eZfG_Y7dmpyb99KmDJAak/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OPtim0eZfG_Y7dmpyb99KmDJAak/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OPtim0eZfG_Y7dmpyb99KmDJAak/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OPtim0eZfG_Y7dmpyb99KmDJAak/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/hccVMhZ9uBc" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7701135069467983396?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/hccVMhZ9uBc/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/06/walking-la-17-carthay-circle-and-south.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GQ3s_eip7ImA9WxdRE0U.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-01T21:28:42.542-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xfiDPKnl1-sQbAD0UZ-5bv9swl8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfiDPKnl1-sQbAD0UZ-5bv9swl8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xfiDPKnl1-sQbAD0UZ-5bv9swl8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xfiDPKnl1-sQbAD0UZ-5bv9swl8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/MSzmEC18V8I" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/5779786421400741620?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/MSzmEC18V8I/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/05/walking-la-16-miracle-mile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YER34yfyp7ImA9WxdSEEo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-17T19:51:46.097-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d61VSfy1umwUD1O-sXUat3NcVgw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d61VSfy1umwUD1O-sXUat3NcVgw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d61VSfy1umwUD1O-sXUat3NcVgw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d61VSfy1umwUD1O-sXUat3NcVgw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/8V0u921SIyw" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/3384968647140155092?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/8V0u921SIyw/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/05/cloud-studio-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIERnY-fCp7ImA9WxdTFUs.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-11T20:55:07.854-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uiMHGmU9FayD0hXO-SwyL5LELvk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uiMHGmU9FayD0hXO-SwyL5LELvk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uiMHGmU9FayD0hXO-SwyL5LELvk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uiMHGmU9FayD0hXO-SwyL5LELvk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/W_fvZ2QFoWs" height="1" width="1"/&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="http://www.blogger.com/comment.g?blogID=15084382&amp;postID=1066626397746423165" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/1066626397746423165?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/1066626397746423165?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/W_fvZ2QFoWs/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></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>10</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/05/ejabberd-on-amazon-ec2-ubuntu-ami.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYNSX8zeyp7ImA9WxdTEUk.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-07T00:09:58.183-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-Sf-ByNu7Rpx6UVR1or4x2OupD4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Sf-ByNu7Rpx6UVR1or4x2OupD4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-Sf-ByNu7Rpx6UVR1or4x2OupD4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Sf-ByNu7Rpx6UVR1or4x2OupD4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/eZsIHTYmkI0" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/4853287001283957534?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/eZsIHTYmkI0/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></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>2</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/05/amazon-ec2-my-first-step-into-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cDQ307eip7ImA9WxZbF0g.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-20T22:17:52.302-07:00</app:edited><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>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;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kREzQYF7osZHBm7XFjAV7hA5kq0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kREzQYF7osZHBm7XFjAV7hA5kq0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kREzQYF7osZHBm7XFjAV7hA5kq0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kREzQYF7osZHBm7XFjAV7hA5kq0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kenweiner/KOLe/~4/cn-98qgUpOA" height="1" width="1"/&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="http://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?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15084382/posts/default/7725168562534109009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/kenweiner/KOLe/~3/cn-98qgUpOA/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:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://bp0.blogger.com/_5QIU8D7GfDs/SJAQlaHJq2I/AAAAAAAAAKI/BJ1a0v-IDD4/S220/ken-profile-2.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.kenweiner.com/2008/04/server-side-language-detection-with.html</feedburner:origLink></entry></feed>

