<?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" xml:lang="en-US">
<id>tag:www.davesouth.org,2005:/topics/blog/full</id>
<link href="http://www.davesouth.org/" rel="alternate" type="text/html" />

<title>Look South — Blog</title>
<updated>2009-11-09T21:06:01Z</updated>
<link rel="self" href="http://feeds.feedburner.com/davesouth-blog" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
<id>tag:www.davesouth.org,2005:Story/880</id>
<updated>2009-11-09T21:06:01Z</updated>
<link href="http://www.davesouth.org/stories/tips-for-reporting-bored-meetings" rel="alternate" type="text/html" />
<title>Tips for reporting “bored” meetings</title>
<content type="html">
<![CDATA[
<p>Reporting a meeting has to be one of the most boring assignments a reporter will ever have. It&#8217;s ironic because it&#8217;s also one of the most important jobs, too. City councils, school boards, state legislatures, congress all make decisions that affect our lives and spend our — the people&#8217;s — money. They make these decisions in meetings wrapped by agendas, filled with tedious procedure and painted in sermons of officialese. The reporter&#8217;s job is to distill these official riddles into plain English that everyone can understand.</p>
<h3>It&#8217;s not (completely) their fault</h3>
<p>The first key to understanding all these meetings is that — for the most part — it&#8217;s not their fault. They, the city council or school board for example, have all these rules they must follow. Laws vary by state but almost universally there are laws governing when and where agendas must be posted, what they can and can&#8217;t talk about, when they can vote, who is allowed to speak, where these meetings may be held.</p>
<p>The list is endless. Plus these elected officials are held criminally responsible if these laws are not followed. Most of the open meeting laws are there to force councils and boards to act more publicly. <strong>I wholeheartedly support open meeting laws.</strong> They are key to keeping an eye on government. However, these rules can and do lead to a lot of official noise in these meetings.</p>
<h3>Bring a recorder</h3>
<p>Have the right equipment for covering these meetings. Of course a pen and notebook. Maybe bring a laptop if they allow it and you are fast typist. Definitely bring a good voice recorder. I would use a digital voice recorder that can easily transfer to your computer to listen to after the meeting.</p>
<p>Most open meeting laws allow reporters to record meetings, even video tape them. Do it.</p>
<p>But don&#8217;t rely on the voice recorder. Your written notes should be the best source for writing your story. The voice recorder is there to help  catch those difficult quotes or discussions where everyone is talking and you hear something you want to understand better or quote accurately.</p>
<p>I usually would write down the time I turned on the recorder. When I hear something I want to transcribe — the mayor says something very quotable — I would note the time and what to listen for. When I&#8217;m listening to the meeting later, I can calculate how far into the recording is the quote I&#8217;m looking for.</p>
<p>Don&#8217;t think that a voice recorder is there so you can listen to the whole meeting again when you get home. That&#8217;s like going back to the dentist for a second root canal because you thought the first one was so fun.</p>
<p>Take good notes. Use the recorder for accurate transcriptions only.</p>
<h3>Get the paperwork</h3>
<p>Usually you can get your hands on the agenda. If possible, try and get all the paperwork — in advance — that the officials are discussing. The officials often refer to these documents during a meeting. It&#8217;s much easier to follow what they are talking about if you have the same paperwork as reference. Try working out a deal with the municipal authority to get the paperwork in advance. It might cost a little money, but it&#8217;s worth it.</p>
<p>I will say that you might get some resistance to this idea. If they don&#8217;t want to give you the paperwork, start filing open records requests (see your state law). Persistence will pay off. Eventually they will get the picture that you are not going away and it might be more convenient to give you the paperwork along with the other officials in the meeting.</p>
<p>If they try to get hard-nosed about it, complain publicly in an op-ed piece. I did and never had a late council packet again. Having the paperwork will make writing your article easier and more accurate. So take the time to get it.</p>
<h3>Law of inverted importance</h3>
<p>I have coined a law (just now) called <strong>The Law of Inverted Importance:</strong> <em>All items on the agenda are listed in reverse order of their importance.</em></p>
<p>In other words, the further down an item is on the agenda, the more important the item.</p>
<p>The top items are always routine stuff to get out of the way. The middle items are usually things that require a little discussion, but nothing too controversial. The items at the end of the agenda are usually the meat of the meeting.</p>
<p>You need to reverse the order. The biggest mistake a novice reporter will make is to report on the meeting in agenda order — like they are the official recorder for the city or school. Your story should start with the most significant event of the meeting and work it&#8217;s way down through lesser items. Some items — like &#8220;the council ratified minutes from the last meeting&#8221; — should be left off completely.</p>
<h3>Tell a friend</h3>
<p>So what is the most important item in the meeting? That&#8217;s easy. What would you tell someone, a friend or relative, happened in the meeting. Who is the first person you call after a meeting? When you call them, do you say, &#8220;Hey, guess what, they just ratified last month&#8217;s minutes and then they voted to hold a public hearing, and then&#8230;.&#8221;</p>
<p>No you wouldn&#8217;t. No one would.</p>
<p>What really happens is you call someone and say, &#8220;They just raised water rates by $20 a month.&#8221;</p>
<p>There&#8217;s your lead.</p>
<h3>Break it up</h3>
<p>One thing I&#8217;ve found that helps is to write down one sentence of every major point I want to cover. I start with the lead point and work my way down. When I&#8217;m finished I go back and write a paragraph or two about each point. Sometimes I need to write more about a controversial item. Sometimes I can combine a few items into a single paragraph.</p>
<p>And use subheadings. Space things out. We are writing for the web now. There is no physical page limit. Use subheadings to make it easier for your readers to find what they want. Subheadings are a lost art in the newspaper business — it&#8217;s more magazine-like. Well, print is dead. Get used to this new medium and use subheadings (like this article does). Your readers will thank you.</p>
<h3>Please bury this in obfuscation and officialese</h3>
<p>One official was angry at me when he read my report. &#8220;It wasn&#8217;t in order,&#8221; he said. &#8220;It should be in the order we had on the agenda.&#8221;</p>
<p>What rubbish. What he really wanted was to bury the important stuff to the bottom of my story.</p>
<p>Most officials never want controversial stuff written in plain English. Don&#8217;t believe me? Go read the official minutes of a meeting. There at the bottom is something like this:</p>
<blockquote>
<p>The board met and discussed administration contracts. They took no action.</p>
</blockquote>
<p>Big whoopty do.</p>
<p>What really happened in plain English.</p>
<blockquote>
<p>The school board met last night and did not renew the superintendent&#8217;s contract. This is a possible indicator by the school board that they may not be satisfied with the superintendent&#8217;s performance.</p>
</blockquote>
<p>When I wrote something along those lines as the lead in the story the whole school board came down on me.</p>
<p>&#8220;What do you mean we didn&#8217;t renew his contract — we took no action. No action! Do you understand?&#8221;</p>
<p>Yes, I understood perfectly. Just because they didn&#8217;t like having what happened written in plain English doesn&#8217;t mean it was false. I just didn&#8217;t use their &#8220;obfuscation&#8221;. Instead, I said it like it was. Guess what, a few months later that superintendent &#8220;resigned&#8221;. Which is code for, &#8220;The super saw the writing on the wall and quit before he was fired.&#8221;</p>
<h3>Officialese will end us all</h3>
<p>Officialese is a perversion of the English language. It&#8217;s pretentious, obscure and wordy. Officialese is used to hide the true meaning of a text.</p>
<p>The official version of events, taken from the minutes:</p>
<blockquote>
<p>The male youth representative having the name of John and the female youth representative having the name of Jillian, did, at their first convenience, make an effort to gain altitude via the method of bipedal locomotion either in rapid or semi-rapid fashion up the incline in an effort to reach the peak of said incline in a further effort to retrieve the cylindrical metallic object with extruded curved convenient palm device to convey the liquid form of oxy-dihydride — a substance known to exist several poisons — to return said oxy-dihydride down the incline until the former position is achieved.</p>
</blockquote>
<p>Wow! In plain English you would say:</p>
<blockquote>
<p>Jack and Jill went up the hill to fetch a pail of water.</p>
</blockquote>
<p>If you think I&#8217;m joking about this. That nobody would take such simple meaning and turn it into something as inscrutable as that. Look an the new healthcare bill. It&#8217;s nearly 2000 pages long. I can&#8217;t even imagine how much obfuscation is going on with that document.</p>
<p>Fight officialese. Say things in plain, short sentences.</p>
<p>Avoid copying the officialese from the documents you receive. Tell-tale signs are long, run-on sentences, lots of prepositions, and stuff that makes you scratch your head to say &#8220;huh?&#8221;.</p>
<h3>You are the citizen proxy</h3>
<p>I&#8217;ve heard people say, &#8220;If the citizens want to know what&#8217;s going on, they should attend the meetings themselves.&#8221;</p>
<p>That&#8217;s absurd. People have lives to live. Our job is to act in their place. We are their eyes and ears. We must try to cut through the officialese and obfuscation to tell people what is really going on, where their money is being spent, and what their elected officials are doing.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/862</id>
<updated>2009-10-21T02:07:13Z</updated>
<link href="http://www.davesouth.org/stories/paperclip-upgrade-breaks-amazon-s3-upload-and-how-to-fix-it" rel="alternate" type="text/html" />
<title>Paperclip upgrade breaks Amazon S3 upload and how to fix it</title>
<content type="html">
<![CDATA[
<p>My content management system uses <a href="http://www.thoughtbot.com/projects/paperclip/">Thoughbot&#8217;s Paperclip</a> gem to attach photographs to the stories. Photos are uploaded first to the local server. Then the server will later upload the photographs to Amazon S3. The process is transparent and silent — too silent it turned out.</p>
<p>I had upgraded my Rails project to 2.3.4 and along with the upgrade, updated all the gems on the server. Everything was working great. After several weeks went by I went and looked at my server data and noticed something strange — all the new photographs were still being served by my local server and not by Amazon S3.</p>
<p>Unfortunately my background process which transferred the photographs to Amazon was failing. However, I didn&#8217;t program it to throw <strong>loud</strong> errors at me. Sure, I use <a href="http://www.hoptoadapp.com/">hoptoad</a> for notifying me if my main application failed. I just never implemented it into the uploader. It&#8217;s always the spot you least expect it.</p>
<p>The uploader&#8217;s log file shows:</p>
<p><code>ArgumentError: wrong number of arguments (5 for 4)</code></p>
<p>That&#8217;s not very helpful. A google search for the error plus &#8220;paperclip&#8221; revealed that paperclip 2.3.1 was the problem. Some people said I should drop back to paperclip 2.3.0. But that doesn&#8217;t sound very smart. Thoughtbot is constantly improving the code and it should be tracked.</p>
<p>Other websites pinned the problem on a conflict between the <em>right_aws</em> and <em>aws-s3</em> gems. There were a multitude of suggestions on how to correctly load the gems, in a special order, to avoid the conflict. I tried these and nothing seemed to work. Paperclip refused to upload files to S3.</p>
<p>Finally I started reading the <a href="http://github.com/thoughtbot/paperclip/commits/master">commit log for Paperclip</a>. There between 2.3.0 and 2.3.1 is a lot of work with <span class="caps">AWS</span>::S3. After a while it dawned on me, they switched. They quit using <em>right_aws</em> and now use <em>aws-s3</em> to exclusively upload content to S3.</p>
<p>So to everyone having this problem you have a simple solution.</p>
<p>In your environment file, remove any mention of <em>right_aws</em> and add the following gem declaration:</p>
<p><code>config.gem "aws-s3", :lib =&gt; "aws/s3"</code></p>
<p>That&#8217;s it. Problem solved.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/855</id>
<updated>2009-10-10T23:01:42Z</updated>
<link href="http://www.davesouth.org/stories/my-cancer" rel="alternate" type="text/html" />
<title>My Cancer</title>
<content type="html">
<![CDATA[
<p>Dr. Michael Callister finished a quick — yet surprisingly painful — exam, he pushed back the wheeled stool, peered up at me over his glasses and said, &#8220;Dave, you have testicular cancer.&#8221; My worst fear was realized. It was only the Saturday before when I noticed a difference — one side was harder than the other. Now it was Thursday, September 3 and my life has changed.</p>
<p>Callister immediately took me down the hall to the ultrasound lab and said to the tech, &#8220;I don&#8217;t know what you have going on, but you need to check this guy, right now.&#8221;</p>
<p>To even my untrained eye it was clear something was wrong. Callister stayed for the test (I&#8217;ve never had a doctor present for any lab test in my life). Both he and the tech clearly could see the problem. Then Callister said the most comforting thing I&#8217;ve ever heard, &#8220;Dave, if you have to get in line for cancer, this is the line to be in. It&#8217;s the most treatable form of cancer in men.&#8221;</p>
<p>According to the <a href="http://en.wikipedia.org/wiki/Testicular_cancer">Wikipedia article</a>, &#8220;Testicular cancer has one of the highest cure rates of all cancers: in excess of 90 percent; essentially 100 percent if it has not metastasized.&#8221;</p>
<h2>Surgery</h2>
<p>I had a choice. I could come in the next day and have the surgery to remove the tumor or I could wait a week. Callister highly recommended coming in the next day because &#8220;the what-ifs will drive you crazy if you wait.&#8221;</p>
<p>It was sound advice. The next day, Friday, September 4, at 11:00 AM I was in the surgical center at the Budge Clinic in Logan, Utah. The procedure — called an <a href="http://en.wikipedia.org/wiki/Testicular_cancer#Orchiectomy">Orchiectomy</a> — is actually considered a minor surgery and I would be going home the same day.</p>
<p>Now the men reading this have a single question on their mind about the operation. All I&#8217;m going to say is this, thank heavens we are given two. There is a spare and everything works as it did before.</p>
<p>They rolled me into the operating room around noon and as I lay on that narrow table I had only one thing to say before they knocked me out, &#8220;Everyone please remember it&#8217;s the right side.&#8221;</p>
<p>They laughed&#8230;.</p>
<h2>Recovery</h2>
<p>I thought I felt pretty good considering. During the operation, Callister found I also had a hernia so he fixed that, too. It&#8217;s not often you get a two-for-one special in surgery. The pain was handled well by the medicines and as long as I held real still, it wasn&#8217;t that bad.</p>
<p>But I was also foolishly optimistic about my <em>so-called</em> state of mind. Every day I felt I was doing really well, only to wake up the next day and realize that I was mentally <strong>rubbish</strong> the day before. My sister Rebecca told me, &#8220;Don&#8217;t do anything important for at least two weeks after the surgery.&#8221;</p>
<p>It&#8217;s good advice.</p>
<p>Frankly, the whole month of September is a blur for me. Later in the month I did get some important work done, but I&#8217;ll bet a was a little <em>out there</em> during my conversations.</p>
<h2>Results</h2>
<p>There are two types of this cancer — <a href="http://en.wikipedia.org/wiki/Seminoma">seminoma</a> and <a href="http://en.wikipedia.org/wiki/Nonseminoma">non-seminoma</a>. In other words, the seminoma type is the most common followed by a bunch of other types lumped in as non-seminoma. Non-seminoma cancers — which usually come as a mix of tumor types — are considered more aggressive than seminoma cancer.</p>
<p>Callister called on Wednesday, September 9 with the pathology report. It was all very &#8220;favorable&#8221;. The tumor was a seminoma and it didn&#8217;t appear to have metastasized. It was the best possible report.</p>
<p>The next Thursday (September 17) I went for a chest x-ray and a CT scan. These types of tumors have a very specific path they follow if they spread. First it can move to the lymph nodes in my back and then it can move into the lungs and even into the brain.</p>
<p>Following the scans I had an appointment with Callister, again. This time he pulled up both scans and went over them with me, in real-time. He even called the radiologist and reviewed it with him over the phone. Everything was clear. There was absolutely no evidence that my cancer spread.</p>
<p>It was official — I had a stage I seminoma. For all practical purposes, I was probably already cured by the surgery.</p>
<h2>The What-Ifs</h2>
<p>I really didn&#8217;t understand until after my CT scan what it meant to have the cancer spread. It turns out that it can move into the lymph nodes that lay along the spine between the vena cava and the aorta and in-between the kidneys. The surgery to remove those lymph nodes is called an <a href="http://en.wikipedia.org/wiki/RPLND"><span class="caps">RPLND</span></a>. It is a <strong>major</strong> surgery with serious complications if a mistake is made.</p>
<p>I&#8217;m glad I didn&#8217;t know about it until I learned I didn&#8217;t need it.</p>
<p>These are the types of &#8220;what-ifs&#8221; the doctor had warned me about before surgery.</p>
<h2>Lance Armstrong</h2>
<p><a href="http://en.wikipedia.org/wiki/Lance_Armstrong">Lance Armstrong</a> had symptoms of testicular cancer for <a href="http://tcrc.acor.org/lance.html">three years before he was diagnosed</a>. He said, &#8220;I always had the size difference there, but I didn&#8217;t know&#8230;I would&#8217;ve still been waiting if it hadn&#8217;t started hurting, it just got so painful I couldn&#8217;t sit on my bike any more.&#8221;</p>
<p>He had a non-seminoma mix of tumors that, by this time, had spread to his lung and brain. Although he didn&#8217;t require an <span class="caps">RPLND</span>, he did have to go through four cycles of chemotherapy and eventually had brain surgery.</p>
<p>Armstrong&#8217;s recovery is proof of how well testicular cancer can be fought with modern cancer treatments. He went on to win the Tour de France an astounding seven times <strong>after</strong> having testicular cancer. But it didn&#8217;t have to be this way for him.</p>
<h2>Early Detection</h2>
<p>So now we come to the reason why I&#8217;ve decided to share this publicly. To all my male friends who read this, please do a <a href="http://en.wikipedia.org/wiki/Testicular_self-examination">self-exam</a>. It&#8217;s fast and very important. You cannot wait until something begins to hurt.</p>
<p>I can tell you that I was in no pain from my tumor. It&#8217;s just that one day I noticed the difference. The doctor said it was probably growing for a year or two to get to that hardness. Even then, I might have not gone to the doctor except that I told my wife. She insisted I go and in less than a week I had the diagnosis.</p>
<p>Just one more reason I&#8217;m glad I married Jennifer. There are no words to describe how much her support meant to me through this experience.</p>
<h2>Adjunctive Therapy</h2>
<p>Even after the successful surgery there is still a chance that cancer cells exist in my body that can restart a tumor. To insure against this they used to give six months of radiation therapy (every two weeks) for seminoma patients. Or you could choose to come in every three months for CT scans, for three years. It&#8217;s a watch and wait approach that leaves you always wondering if it will restart. It&#8217;s also a lot of work.</p>
<p>However, now there is a third alternative. Recently they&#8217;ve found that a single dose of a chemotherapy drug, carboplatin, is equivalent to six-months of radiation therapy. Further study says that two doses are even better and can push my success rate from 97 to 99 percent. In other words I have a only a tiny chance that this will come back within ten years. And even then, it is still very treatable.</p>
<p>I had my first round of carboplatin two days ago on Thursday, October 3. It was painless. I just had to sit in a recliner for a couple of hours with an IV in my arm. First they gave me a few preparation drugs to reduce possible side-effects. That took a half hour. Then they gave me the carboplatin for an hour.</p>
<p>I won&#8217;t lose my hair. I haven&#8217;t had nausea. The most I&#8217;ve felt from this is more like I have a slight case of the flu where I&#8217;m somewhat tired and I get that tingly sensation — like I have a fever — that runs like waves in my body. Of course, I don&#8217;t have a fever.</p>
<p>By Monday, I should be completely over it.</p>
<p>There is only one more round scheduled for the Thursday before Halloween.</p>
<p>It is so worth doing as an insurance policy.</p>
<p>After this, I still go back for annual chest x-rays and biannual CT scans. The first few years are critical. Every year afterwards, the risk of it returning drops. By ten years the risk goes to virtually zero.</p>
<h2>Action Beats Fear</h2>
<p>I&#8217;ve never had a doctor act so swiftly and so personally to any medical condition in my life. Dr. Michael Callister, his staff at the Budge Clinic, and the staff at the surgical center are real heroes to me. They took a frightening situation and turned it into the most impressive display of medical skill I&#8217;ve ever seen.</p>
<p>Callister never wasted a minute of time to take care of this. From diagnosis, surgery, and follow-up, I was never left hanging on what my results would be. The real-time review of the CT scan was when it hit me. Normally the doctor would have me go home and they would call me in a few days. Not this time, I knew within an hour exactly what my results were.</p>
<p>Had they been bad, he would be there to explain what would happen next and make it happen. Since it was good, I could leave the hospital that day with an incredible sense of relief.</p>
<p>It many ways the experience was surreal. Although I lost a month of my life to this, it was worth every minute.</p>
<p>To all my friends and family, thank you for your support. And to all my male friends, get yourselves checked out. Do it now.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/736</id>
<updated>2009-07-10T03:56:49Z</updated>
<link href="http://www.davesouth.org/stories/the-voices-in-my-head-speak-english" rel="alternate" type="text/html" />
<title>The voices in my head speak English</title>
<content type="html">
<![CDATA[
<p>I have two pet peeves about voicemail systems. Scratch that. I have about a hundred pet peeves but I just want to point out two. The first is why am I asked to press 1 for English and 2 for Spanish?</p>
<p>The voicemail system is speaking English. I think it&#8217;s safe to assume that most people calling will speak English. Why not just ask, in Spanish, if the person speaks Spanish press 1. That&#8217;s it. If nothing happens, proceed in English.</p>
<p>How hard can that be?</p>
<p>Of course, after running through several nightmare voicemail systems, I can only assume that someone just gets perverse pleasure making the user experience as bad as possible.</p>
<p>So what about my second pet peeve?</p>
<p>When I get someone&#8217;s voicemail on the Verizon mobile network, I hear the person give their greeting and then I&#8217;m told:</p>
<blockquote>
<p>&#8220;Press one to leave a voice message or wait for the beep. If you wish to leave a numerical page, press two. [wait a second or two]. To leave a voice message wait for the beep. [another second or two] [beep].&#8221;</p>
</blockquote>
<p>What is that all about? It&#8217;s hard enough to get people to leave voicemail messages. Now we have to give a minute of instructions to use a system <strong>everyone</strong> knows how to use.</p>
<p><strong>Numerical page?</strong></p>
<p>Will someone please send Verizon a memo telling them it isn&#8217;t 1993, beepers are history. While you are at it, tell them it isn&#8217;t the 1970s either — people know how to use voicemail.</p>
<p>Just give the personal greeting and beep!</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/693</id>
<updated>2009-06-23T16:50:16Z</updated>
<link href="http://www.davesouth.org/stories/the-absolute-failure-of-banner-advertising" rel="alternate" type="text/html" />
<title>The absolute failure of banner advertising</title>
<content type="html">
<![CDATA[
<p>Banner advertising is a complete failure. It is a paradox of diminishing returns that traps a web publisher into treading water — never making progress and always struggling to stay afloat. What&#8217;s worse is how web publishers will flail around with <a href="http://pcworld.about.com/od/adsvisitortracking/The-Top-10-Most-Annoying-Frus.htm">bad idea</a> after <a href="http://en.wikipedia.org/wiki/Pop-up">bad idea</a> to get ahead. Yet these insane advertisements do more harm than good, cause readers to leave and sink the publisher even more. It&#8217;s time to end the madness and recognize that the banner advertising model itself is broken.</p>
<h2>Quicksand</h2>
<p>Our first and only banner experiment came early in the Italy Neotribune — back when it was no more than a hobby. One day I was brought some pictures from a local business and told that if we made a banner ad for them, we would get $50 a month.</p>
<p>At first it sounded like a good idea. We would put the ad together and get the ball rolling. As time went on, we would charge more per ad and start charging to create the banner ads. That&#8217;s how newspaper display advertising works.</p>
<p>But as we discussed the banner advertising process and considered our potential advertisers we began to realize that banner advertising is like quicksand — that first step looks firm but quickly gives way.</p>
<h2>Banner ads are hard</h2>
<p>Creating an effective banner ad is hard. Much harder than it should be. You have to distill a lot of information down into a bizarrely oblong rectangle — vertical or horizontal.</p>
<h4>Banner process</h4>
<ol>
	<li>Create a few draft ideas</li>
	<li>Take them to the business owner to review</li>
	<li>Create a second draft</li>
	<li>Review again</li>
	<li>Make a final draft</li>
	<li>Review yet again</li>
	<li>Finalize the design</li>
	<li>Get final approval</li>
	<li>Run the ad</li>
</ol>
<p>Okay. Maybe I&#8217;m stretching the point. Maybe the business owner will like the first draft and run with it. <em>Right.</em> That&#8217;s hard to say without laughing. There will always be revisions. It takes time. More time than you think it will need.</p>
<p>If it takes ten hours, then our $50 is only $5 an hour. We&#8217;d make more money working at McDonald&#8217;s.</p>
<p>Why not have the business create their own banner ad?</p>
<p>At that time in Italy, Texas there was only one business with an art director — <a href="http://www.monolithic.com">ours</a>. In my observations it is a rare for a small business to have the in-house talent to create a fair banner ad — let alone an effective one.</p>
<h2>Ad blindness</h2>
<p>Let&#8217;s assume we went through the process and create the ad. It took us only seven hours and the business owner loves it. Great. Publish the ad. Start collecting money.</p>
<p><strong>What should happen next?</strong></p>
<p>Stories on the Italy Neotribune are looked at most the first day, a lot less the second, and receive few clicks on the third. After a week it takes an exceptional story to keep generating page views. It is far worse for advertisements.</p>
<p>Ideally the ad would be updated with a new offer. Something different every week. Maybe something new every day.</p>
<p>For our example, lets say it took seven hours to make the first ad. What if we just make a small change and it only takes two hours. And we only make changes once a week. That would be 11 hours the first month and 8 hours every month afterwards.</p>
<p>Wait a minute! We&#8217;d be &#8220;making&#8221; less than minimum wage to do this. In reality, the cost to create the ad would exceed the income from it.</p>
<p><strong>So what really happens?</strong></p>
<p>Instead of regular changes, the ad will be left to rot. It&#8217;s the only way to make back even some of the real cost of creating the ad in the first place. As long as the business doesn&#8217;t complain, why should we change it?</p>
<p>Six months go by and the ad sits there. Maybe a year passes. I&#8217;ve seen some websites with the same banner ad going on three years.</p>
<p>Sure, we&#8217;d get $50 a month without any further effort. We would also get ad blindness. Readers will quickly note that the ads never change so they just stop looking at them.</p>
<h2>Beginning of the problem</h2>
<p>The difficulties of banner creation and avoiding ad blindness are only the beginning of the problem. Already we can see that either the businesses must spend a lot more money or we need a better system to reduce the cost of creating the ads.</p>
<p>Next up: Banner ads are bad copies of newspaper display advertising</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/642</id>
<updated>2009-06-10T19:52:19Z</updated>
<link href="http://www.davesouth.org/stories/manually-change-top-sites-in-safari-4" rel="alternate" type="text/html" />
<title>Manually change Top Sites in Safari 4</title>
<content type="html">
<![CDATA[
<a href="/stories/manually-change-top-sites-in-safari-4"><img align="right" alt="Image: Safari 4 Top Sites" height="300" hspace="8" src="http://photos.mydomesite.com/000/002/015/small/safari01.png?1244662922" title="Image: Safari 4 Top Sites" width="271" /></a>
<p>In the Safari 4 beta, the only way to add websites to the Top Sites page was to visit the website a bunch of times until it showed up or you edited a configuration file by hand. It was frustrating because I&#8217;d rather specify exactly what pages to show on Top Sites. I felt there had to be an easier way. With the final release of Safari 4, there is. Any website can be manually added to Top Sites. It&#8217;s quick and easy.</p>
<h3>Manually add website to Top Sites</h3>
<ol>
	<li>Go to the website you would like to add to Top Sites.</li>
	<li>Drag the little icon at the left of the website <span class="caps">URL</span> in the location bar.</li>
	<li>Drop the icon onto the Top Sites icon in the bookmark bar (it&#8217;s the little grid of boxes, usually second from left).</li>
	<li>Click on the Top Sites link and the website should appear in the first open spot.</li>
</ol>
<p>And that&#8217;s it. Click edit in the lower left corner and move the website to any position on the Top Sites page.</p>
<p>It turns out there are a lot of features embedded into Top Sites. Visit <a href="http://arstechnica.com/apple/guides/2009/02/safari-4-focus-top-sites-browser-in-a-nutshell.ars">Safari 4 how-to: Top Sites Browser in a nutshell</a> for more.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/635</id>
<updated>2009-06-09T19:39:11Z</updated>
<link href="http://www.davesouth.org/stories/make-url-friendly-filenames-in-paperclip-attachments" rel="alternate" type="text/html" />
<title>Make URL friendly filenames in paperclip attachments</title>
<content type="html">
<![CDATA[
<p>We use <a href="http://thoughtbot.com/">Thoughtbot&#8217;s</a> <a href="http://www.thoughtbot.com/projects/paperclip">Paperclip</a> gem to attach images and other media to our Ruby on Rails models. When we save documents to a model object, we wanted to make sure the filenames were <span class="caps">URL</span> friendly — lowercase with only letters, numbers or hyphens. Paperclip&#8217;s processing chain makes it easy to insert this behavior before saving the file or running it through the thumbnail re-sizer.</p>
<p>To set this up you need a working <a href="http://rubyonrails.org/">Ruby on Rails</a> project, the Paperclip gem installed, and a model with has_attached_file. Read the Paperclip documents on how to set this up or use <a href="http://github.com/JimNeath/swfupload---paperclip-example-app/tree/master">Jim Neath&#8217;s example project</a>.</p>
<h2>Transliterate</h2>
<p>To convert the filename into a <span class="caps">URL</span> friendly format we have the transliterate method.</p>
<pre class='brush: ruby;'>&#x000A;  def transliterate(str)&#x000A;    # Based on permalink_fu by Rick Olsen&#x000A;&#x000A;    # Escape str by transliterating to UTF-8 with Iconv&#x000A;    s = Iconv.iconv('ascii//ignore//translit', 'utf-8', str).to_s&#x000A;&#x000A;    # Downcase string&#x000A;    s.downcase!&#x000A;&#x000A;    # Remove apostrophes so isn't changes to isnt&#x000A;    s.gsub!(/'/, '')&#x000A;&#x000A;    # Replace any non-letter or non-number character with a space&#x000A;    s.gsub!(/[^A-Za-z0-9]+/, ' ')&#x000A;&#x000A;    # Remove spaces from beginning and end of string&#x000A;    s.strip!&#x000A;&#x000A;    # Replace groups of spaces with single hyphen&#x000A;    s.gsub!(/\ +/, '-')&#x000A;&#x000A;    return s&#x000A;  end</pre>
<p>This useful method is saved in a shared library in all our projects. Besides changing filenames, we also use it to generate permalinks from story headlines. You can put it in the same Paperclip enabled model or in a shared library if you will use it in more than one place.</p>
<h2>Filename processing</h2>
<p>In the paperclip enabled model set the before_post_process declaration.</p>
<pre class='brush: ruby;'>&#x000A;  before_post_process :transliterate_file_name</pre>
<p>Then in the <code>private</code> section of the model put transliterate_file_name</p>
<pre class='brush: ruby;'>&#x000A;  def transliterate_file_name&#x000A;    extension = File.extname(local_file_name).gsub(/^\.+/, '')&#x000A;    filename = local_file_name.gsub(/\.#{extension}$/, '')&#x000A;    self.local.instance_write(:file_name, "#{transliterate(filename)}.#{transliterate(extension)}")&#x000A;  end</pre>
<p>And that&#8217;s it. Paperclip will accept the new filename and then begin processing the attachment. So if it is an uploaded image, all subsequent generated thumbnails will be based on the transliterated filename.</p>
<h2>Transliterate tests</h2>
<p>We use these tests for the transliterate method.</p>
<pre class='brush: ruby;'>&#x000A;  test 'transliterate should downcase and substitute spaces with dashes' do&#x000A;    assert_equal 'this-is-a-story-headline', transliterate('This is a Story Headline')&#x000A;  end&#x000A;&#x000A;  test 'transliterate should remove apostrophes, punctuation, trailing characters' do&#x000A;    assert_equal 'this-isnt-a-perfect-solution', transliterate(%Q{This isn't a "Perfect Solution."})&#x000A;  end&#x000A;&#x000A;  test 'transliterate should turn unicode characters into dashes' do&#x000A;    assert_equal 'alpha-beta-gamma', transliterate('Alpha α, Beta β, Gamma γ')&#x000A;  end&#x000A;  &#x000A;  test 'transliterate should turn underscores into dashes' do&#x000A;    assert_equal 'change-underscores-to-dashes', transliterate('change_underscores_to_dashes')&#x000A;  end</pre>
<h2>Filename transliteration test</h2>
<p>We created a tiny image called &#8220;IT&#8217;s, <span class="caps">UPPERCASE</span>!  <span class="caps">AND</span> WeIRD.<span class="caps">JPG</span>&#8221; and saved it to test/fixtures/files. Then we run this test on our paperclip enabled photograph model.</p>
<pre class='brush: ruby;'>&#x000A;  test 'should transliterate the filename' do&#x000A;    photograph = Photograph.new&#x000A;    file = File.new(File.join(RAILS_ROOT, 'test', 'fixtures', 'files', %Q{IT's,  UPPERCASE!.JPG}), 'rb')&#x000A;    photograph.local = file&#x000A;    assert_equal 'it-s-uppercase.jpg', photograph.local.original_filename&#x000A;    file.close&#x000A;  end</pre>
<p><em>Note that Paperclip does some basic filename transliteration of it&#8217;s own. It generally replaces non-letter or non-digit characters with underscores. It didn&#8217;t go far enough for us since it leaves unicode characters intact and can leave trailing underscores. This transliteration is more complete. The final filename can be used, without escape codes, in the <span class="caps">URL</span>.</em></p>
<script type="text/javascript" src="/syntax/scripts/shAll.js"></script> <link type="text/css" rel="stylesheet" href="/syntax/styles/shAll.css"/> <script type="text/javascript"> SyntaxHighlighter.config.clipboardSwf = '/syntax/scripts/clipboard.swf'; SyntaxHighlighter.all(); </script>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/610</id>
<updated>2009-06-02T22:59:23Z</updated>
<link href="http://www.davesouth.org/stories/our-cover-is-blown" rel="alternate" type="text/html" />
<title>Our cover is blown</title>
<content type="html">
<![CDATA[
<p>For several years, Loy and I have worked under the company name of Apped Design. It was a cover name Loy came up with when we attended the first <a href="http://mtnwestrubyconf.org/2007/">Mountain West Ruby Conference</a> in 2007. The Neotribune was on the back burner and we were working on a couple of Ruby on Rails projects. We decided that it would be easier to go as independent consultants than try to explain a long, convoluted startup story no would be interested in anyway.</p>
<p>The conference was fantastic. One of the best I&#8217;ve ever attended. We connected with Ruby programmers from all over Utah. We also met a group from Logan with whom we later formed the <a href="http://groups.google.com/group/loganrb">Logan Ruby Users Group</a>.</p>
<h2>Independent consultants</h2>
<p>As for our cover, well, it didn&#8217;t work as well as I thought it would. Normally if you go to a conference and say you are an independent consultant, people treat you like some kind of <strong>leper</strong>. Faster than you can say &#8220;unclean&#8221; they stop asking about you and start talking about something else — anything else.</p>
<p>This is how it&#8217;s been at every non-programming conference I&#8217;ve ever attended. But at the Ruby conference, we were offered a job or two. It should have been a warning.</p>
<p>Two months later we were at <a href="http://conferences.oreillynet.com/rails2007/">Railsconf 2007</a> in Portland. In one of our first conversations our cover was blown, again.</p>
<p>&#8220;Hello, we&#8217;re from Apped Design.&#8221;</p>
<p>&#8220;Oh, what does your company do?&#8221;</p>
<p>&#8220;We&#8217;re independent software consultants.&#8221;</p>
<p>Now I expected to see glazed eyes, a little uncomfortable shift of their feet, and a change of subject. But that&#8217;s not what happened.</p>
<p>&#8220;Really? Do you have enough work? We&#8217;ve got this big project and could really use an extra hand.&#8221;</p>
<p>Seriously?</p>
<p>Talk about a programmers market. We could have left Railsconf with a dozen job leads.</p>
<p>When the two young ladies from Google suggested we apply for a job, I gave up. It was better to tell people we were in a startup.</p>
<p>&#8220;We are doing a startup.&#8221;</p>
<p>&#8220;Really! So are we? Do you have some free time to help us?&#8221;</p>
<h2>Apped Design ends</h2>
<p>Okay, so our cover didn&#8217;t work as planned. We did learn a lot from these conferences and met a lot of great people. And being offered Ruby jobs meant we certainly picked the right programming language.</p>
<p>Now that we are working full-time on the Neotribune, we are going to let the Apped Design name die. I&#8217;ve forwarded the appeddesign.com website to this blog. And we stopped using our Ruby inspired cards. It was fun while it lasted.</p>
<hr />
<p>PS &#8211; For the record, I think the ladies from Google talked to every single developer about applying to Google. Heck, if they didn&#8217;t talk to you, you must have said something really scary like, &#8220;I&#8217;m in marketing.&#8221;</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/599</id>
<updated>2009-05-29T21:08:19Z</updated>
<link href="http://www.davesouth.org/stories/newspapers-dont-get-it-online-users-already-pay-for-content" rel="alternate" type="text/html" />
<title>Newspapers don't get it, online users already pay for content</title>
<content type="html">
<![CDATA[
<p>The newspaper industry is trying to build <a href="http://www.niemanlab.org/2009/05/newspaper-execs-treading-carefully-on-antitrust-laws/">pay walls</a> around their online content. The idea is that <a href="http://www.guardian.co.uk/media/2009/may/11/rupert-murdoch-charging-online-news">readers need to pay for content</a>. This is a big problem because newspaper executives don&#8217;t understand how much their readers already pay to be online. In fact, they pay more than any newspaper subscription in history.</p>
<p>Subscriptions have always been a loss-leader. Delivering a paper costs a lot of money. There is the printing press, paper, ink, press employees, union truck drivers, subscription managers, subscription software, and finally the — increasingly inaccurate — <a href="http://www.helium.com/items/971211-where-have-all-the-paperboys-gone">paper boy</a>. Even at a dollar a paper, it isn&#8217;t enough to cover these costs.</p>
<p>Many newspapers, desperate to get subscribers, have discounted their subscriptions to only pennies a day. <strong>Readers have never paid for content</strong> — they don&#8217;t even pay for the paper it is printed on.</p>
<h2>Who pays?</h2>
<p>So who really pays for the newspaper? The advertisers. It&#8217;s advertising money that pays for journalism. So why are subscriptions important if they don&#8217;t pay for the content?</p>
<p>Well, they offset the cost of producing the paper which is a big help. But the main reason newspapers need subscribers is so they can tell an advertiser that they reach X number of people.</p>
<p>The real product of a newspaper is its readers. Advertisers are the real customers of a newspaper. They buy reader attention. The more readers, the more valuable the newspaper, the more money an advertiser was willing to pay.</p>
<p>But not anymore. The Internet gives advertisers more options to directly reach their potential customers without advertising in the newspaper. And as readers quit subscribing to newspapers, there is even less incentive for advertisers to continue print advertising.</p>
<h2>Online subscription fallacy</h2>
<p>So newspapers want to take this model online. To create the same environment where they can tell advertisers how important their content is to readers because they have X number of online subscribers. But here is where everything breaks down.</p>
<p>Newspaper executives are working under the assumption that online readers are getting their content for free. This is absolutely false.</p>
<p>The online world cuts the delivery model into two. The first half is the publisher. They create a webserver and put it on the Internet. Compared to a printing press, a webserver is petty cash. And Internet access for the news company is trivially inexpensive.</p>
<p>The second half of the delivery system is the reader&#8217;s <span class="caps">ISP</span>. Most people who use the Internet regularly are paying anywhere from $50 to $200 a month for the privilege. If you add in the cost of Internet access at work, at home, on smartphones there is a lot of money spent to get people online.</p>
<h2>Readers pay more</h2>
<p>The cost a newspaper pays to deliver content online is a tiny fraction of the printing and delivery costs of a real paper. The cost difference is so great, in fact, that the burden has shifted almost entirely onto the readers.</p>
<p>The idea that readers are getting their online content for free is absolutely ludicrous.</p>
<h2>Protect the print edition</h2>
<p>I think <a href="http://www.niemanlab.org/2009/05/four-observations-about-charging-for-news-that-are-often-overlooked/">Zachary Seward</a> put it best:</p>
<blockquote>
<p>&#8220;It’s counterintuitive, but charging for the website may be an effective way to protect the print edition, which still provides 80-90 percent of income at most newspaper companies.&#8221;</p>
</blockquote>
<p>That&#8217;s what this is all about — protecting the print edition. I&#8217;ve seen one newspaper start charging for online content. Their online fee is exactly the same as a print subscription. And if you get the print subscription you get the online version for &#8220;free&#8221;. I&#8217;m sure they hope everyone will get the dual print and online subscription so their print subscription base remains as high as possible to maximize their print ad revenue.</p>
<p>But it can only go so far.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/556</id>
<updated>2009-05-26T19:26:35Z</updated>
<link href="http://www.davesouth.org/stories/finally-the-neotribune" rel="alternate" type="text/html" />
<title>Finally, the Neotribune</title>
<content type="html">
<![CDATA[
<p>It started as a lark and grew into a passion. Something that consumed my mind day and night. After years of tinkering and testing we figured out how to do it — how to deliver the news, without the paper.</p>
<p>The Neotribune is a new model for putting journalists back into small towns. If you look around, you will see that most small towns lack any news coverage at all. Some are claimed by larger community newspapers nearby, but receive very little coverage.</p>
<p>In Italy, Texas — where this all started — I can count on one hand the number of times a reporter came from the county newspaper. Yet we found hundreds of stories to cover.</p>
<p>Think about it. If you search the Internet for a celebrity or a politician, there are thousands of news articles about them. Probably more than they would like. But can you find the names of the city council members of your town? Can you read what happened at the last school board meeting? Have you seen any photographs of the school play?</p>
<p>For thousands of towns in America the answers to these questions are no. If people don&#8217;t go to the city council, school board, or play they don&#8217;t get to really know what&#8217;s going on.</p>
<p>We started the <a href="http://www.italyneotribune.com">Italy Neotribune</a> for these very reasons. It was a part-time endeavor with just a few of us getting the news and publishing online. We discovered that this was only the tip of the iceberg.</p>
<p>There were problems in the city government and school administration. There were unsung heroes and others working against the will of the people.</p>
<p>And most importantly, we found that the fundamental <a href="http://www.journalism.org/resources/principles">principles of journalism</a> are as important now as they have ever been.</p>
<p>Towns need the news to inform the people and watch over the city. They need journalists who are responsible to do the hard work of reporting.</p>
<p>And the journalists need to be paid.</p>
<p>We tried a few early experiments in advertising. They clearly did not give enough return to be worth the effort. It is a serious problem. You cannot sustain quality journalism on ideals alone. Reporters have lives and need compensation for their work.</p>
<p>But there wasn&#8217;t enough income from current models of online advertising.</p>
<p>We tried several other ideas as we continued with our day job at the <a href="http://www.monolithic.com">Monolithic Dome Institute</a>. Eventually I moved to <a href="http://www.loganutah.org/">Logan, Utah</a> to be closer to a <a href="http://groups.google.com/group/loganDev">fantastic</a> <a href="http://groups.google.com/group/loganrb">programming</a> <a href="http://mtnwestruby.org/">community</a> and started on programming several projects.</p>
<p>But I kept coming back to the Neotribune. How do we solve the problem of paying for it? We wrote a content management system for the Italy Neotribune and Monolithic.com which made it far easier to handle photographs with stories.</p>
<p>We also tried another experiment in advertising which was more promising. But still not enough.</p>
<p>Then in April, while brainstorming with a few friends, we figured it out. It&#8217;s so simple and elegant. Why didn&#8217;t we see it before? I guess that&#8217;s the nature of coming up with something new.</p>
<p>Finally, we are going ahead with the Neotribune.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/554</id>
<updated>2009-05-23T23:34:38Z</updated>
<link href="http://www.davesouth.org/stories/newsprint-will-die" rel="alternate" type="text/html" />
<title>Newsprint will die</title>
<content type="html">
<![CDATA[
<p>An ad by the <a href="http://www.naa.org">Newspaper Association of America</a> states that &#8220;No amount of effort from local bloggers, non-profit news entities or TV news sources could match the depth and breadth of newspaper-produced content.&#8221; Wow! That&#8217;s insulting. What&#8217;s worse, it completely misunderstands what&#8217;s happening to the newspaper industry and why the printed page is destined to fail.</p>
<p>John F. Sturm authored the ad titled, <a href="http://www.dailysoutherner.com/local/local_story_139165600.html/resources_printstory"><em>The reality about newspapers</em>.</a> He says that newspapers are doing very well and won&#8217;t go away. This also implies, by extension, that the printed page — the medium of newsprint — is also here to stay.</p>
<p>This is the blind spot of nearly all newspaper supporters — the failure to separate journalism from the medium of paper.</p>
<p>Take this statement by Sturm, &#8220;Newspapers make a larger investment in journalism than any other medium. Most of the information you read from &#8216;aggregators&#8217; and other media originated with newspapers.&#8221;</p>
<p>I believe this is absolutely true, for now. Original journalism is very valuable and websites that simply scrape newspaper content are not really a core business — one aggregator can easily be replaced by another.</p>
<p>But the idea that <strong>nothing</strong> will match newspapers is utterly false.</p>
<p>I think it&#8217;s more accurate to say that <strong>when</strong> online media match the efforts of newspapers to gather original journalistic content, <strong>then</strong> the medium of newsprint will die.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/552</id>
<updated>2009-05-18T19:19:29Z</updated>
<link href="http://www.davesouth.org/stories/off-beat-reasons-to-save-newspapers" rel="alternate" type="text/html" />
<title>Off beat reasons to save newspapers</title>
<content type="html">
<![CDATA[
<p>A wonderful story about why we need to <a href="http://www.boston.com/bostonglobe/magazine/articles/2009/05/17/save_the_presses/">Save The Presses!</a> I think the best one is &#8220;You can shed a tear right now for the iconic ransom note, with letters clipped from newspaper headlines. What&#8217;s a kidnapper to do? Print out letters at home using different fonts and point sizes?&#8221;</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/547</id>
<updated>2009-05-17T04:44:33Z</updated>
<link href="http://www.davesouth.org/stories/gmailme-a-mashup-of-gmail-and-mobileme" rel="alternate" type="text/html" />
<title>GmailMe — A mashup of Gmail and MobileMe</title>
<content type="html">
<![CDATA[
<a href="/stories/gmailme-a-mashup-of-gmail-and-mobileme"><img align="right" alt="Image: GmailMe Receive" height="300" hspace="8" src="http://photos.mydomesite.com/000/001/694/small/email-receive.jpg?1242536089" title="Image: GmailMe Receive" width="219" /></a>
<p>Managing email is a royal pain. Especially if you read email on more than one device. After buying iPhones last year, Mike and I worked up an <a href="/stories/gmail-dotmac-iphone-mashup">excellent system</a> of managing our email on the iPhone, computer and web.</p>
<p>At the time I had multiple email accounts &mdash; a system administration account, a business account under one domain, another business account under another domain. It was painful keeping track of which email came on what account and what account to use when I wrote an email.</p>
<p>The new system streamlined everything. All email filters into one system and one master email address. It turns out that nobody really cares what your email address is &mdash; once you establish a connection.</p>
<p>A year after our first article, our set up is a bit more refined. With the upgrade to iPhone and MobileMe, it&#8217;s time to upgrade our instructions and maybe explain why we do it this way to begin with.</p>
<h1>Own your domain</h1>
<p>It&#8217;s vital that you always own the domains you advertise. What does that mean?</p>
<p>Let&#8217;s say John Doe is at a networking meet-up and handing out business cards. John is very proud of his new website &mdash; http://www.example.com. But on his business cards, his email address is listed as rumplestiltskin@someweirdispnobodywillremember.net.</p>
<p>It&#8217;s unprofessional. John went through the trouble of buying a domain and implementing a website. Can&#8217;t he take the time to get an email address using the same domain? It immediately says he&#8217;s an amateur on the Internet.</p>
<p>More importantly, by using his Internet service provider&#8217;s email account, he&#8217;s advertising an email address that can &mdash; and probably will &mdash; change. When his cable company offers him a better deal for Internet access, he&#8217;ll have to go through a painful switch, explaining to every one that his email address has to change because he&#8217;s switching providers.</p>
<h3>1. Own the domain of all email accounts you advertise</h3>
<p>Every one of them. On business cards, letterhead, everything. Don&#8217;t waste time handing control of your advertised email accounts to anyone.</p>
<p>That doesn&#8217;t mean you must have a real account behind every email address. That was the mistake I was making in the past. Instead, for every email address you create on your domain, have it forwarded to one master email account.</p>
<h1>One account to rule them all</h1>
<p>Your master email account must be robust, not attached to any <span class="caps">ISP</span>, and have powerful spam filters. Gmail is the best we&#8217;ve found so far. It&#8217;s free (or very cheap at $50 a year). They have the <strong>best</strong> spam filters of all time. And it can hold huge amount of information. Right now they provide 7 gigabytes of storage.</p>
<p>Gmail does not advertise in the outgoing email. You can use Yahoo or <span class="caps">MSN</span>, but they always attach a small ad on every outgoing message. This is unacceptable. Gmail can even pretend to be from one of your domains (with caveats, see below).</p>
<h3>2. Set up all domain based email addresses to forward to Gmail account</h3>
<p>We use GoDaddy for most of our domains. Other domain registrars offer similar services so these instructions should work with them, too.</p>
<p>For every domain I have with GoDaddy, they give me 100 forwarding email addresses. It&#8217;s super simple to use the GoDaddy interface to add a forwarding order such as &#8220;john.doe@example.com&#8221; should forward to &#8220;john.doe@gmail.com&#8221;.</p>
<p>Do this for every email address you own. Forward them all to that single account.</p>
<h1>Gmail is a lousy <span class="caps">IMAP</span> server</h1>
<p><span class="caps">IMAP</span> is the key to managing email on both the Mac and an iPhone. It allows each device to directly manipulate email on the server. The strength of Gmail &mdash; the massive space so you don&#8217;t have to delete any messages &mdash; is terrible when using <span class="caps">IMAP</span>. The mail clients on the Mac and iPhone download a cache of each message. For a large Gmail archive, this can take hours and uses a lot of space on the iPhone.</p>
<p>Having a copy of the entire Gmail archive on the Mac is pointless. The only email that matters is the current email &mdash; new messages, working copy, letters to answer, pending processing. The rest should just be left on Gmail where it can be searched using Google&#8217;s fabulous search engine.</p>
<h3>3. Set up Gmail to forward to MobileMe</h3>
<p>It doesn&#8217;t have to be MobileMe. Any decent <span class="caps">IMAP</span> server will work. I use MobileMe because I like the &#8220;push&#8221; contacts and calendar. It has a nice web interface. The iDrive is great, too.</p>
<p>To set up Gmail to forward properly to MobileMe.</p>
<ul>
	<li>Open the Gmail account, click on &#8220;Settings&#8221;, then &#8220;Forwarding and <span class="caps">POP</span>/<span class="caps">IMAP</span>&#8221;</li>
	<li>Under forwarding, click &#8220;Forwarding a copy of incoming mail to&#8221;</li>
	<li>Add the MobileMe account (john.do@me.com)</li>
	<li>Set the select option to &#8220;archive Gmail&#8217;s copy&#8221; so every message will be saved in Gmail after being sent to MobileMe.</li>
</ul>
<p>Disable <span class="caps">POP</span> and <span class="caps">IMAP</span> because we just are not going to use them with Gmail.</p>
<h1>Gmail is the best spam filter</h1>
<p>Where Gmail beats everyone else is in spam filtering. I have never used a better spam filter. The best part of this mashup is that Gmail will filter all spam messages <strong>before</strong> forwarding them. So all spam will be caught by Gmail and not transmitted to MobileMe.</p>
<h3>4. Manage spam false positives and negatives on Gmail</h3>
<p>Because Gmail is filtering the messages, it&#8217;s important to remember to do <strong>all</strong> junk mail training on Gmail. If spam makes it to MobileMe, go to the Gmail account, find it in the archive, and mark it as spam. Also remember &mdash; especially in the beginning &mdash; to check the Gmail spam box for good messages incorrectly marked as spam.</p>
<p>One note about false positives. When you mark spam as good mail it is moved from Gmail&#8217;s spam box to the inbox. However, it won&#8217;t be forwarded to MobileMe. It must be managed on Gmail. It&#8217;s a small matter. After a short while, false positives will happen very rarely.</p>
<p>Because Gmail is handling spam filtering, remember to turn off junk mail filters in MobileMe (server side) and the Mac Mail.app. If you leave those active, it&#8217;ll become very confusing.</p>
<h1>Final destination</h1>
<p>Finally, the email has arrived at MobileMe. Configure both Mac Mail and iPhone to read email using MobileMe. It&#8217;s a standard process and very easy. Apple has tutorials on <a href="http://www.apple.com/mobileme/setup/">setting up MobileMe for iPhone, Mac and PC</a>.</p>
<p>Follow the instructions for both Mail.app and the iPhone. Try sending test messages to the domain account &#8220;john.doe@example.com&#8221; and make sure it goes into MobileMe. You need to send test messages from some other mail account (like Yahoo or <span class="caps">MSN</span> or a separate Gmail account).</p>
<h3>5. Manage your active mail on MobileMe &mdash; make it inbox zero</h3>
<p>Now you have an place to manage your active email. Follow <a href="http://www.43folders.com/izero">Inbox Zero</a>. Keep it clean. Be ruthless. Remember that any deleted message can easily be recovered from Gmail.</p>
<p>One important setting to change in Mail.app and iPhone is how long it keeps sent messages and Trash. I always set sent messages to be deleted after 4 weeks and the trash after 1 week. Keeping your active mail clean makes it faster on the Mac and the iPhone. Be sure to save Drafts, Notes, Sent, and Trash on the server. These settings are under &#8220;Mailbox Behaviors&#8221; in the MobileMe account under Mail.app&#8217;s preferences.</p>
<h1>Send email through Gmail</h1>
<p>Now for the key to this mashup &mdash; sending email. Both the Mac and iPhone must be told to send all mail through Gmail&#8217;s <span class="caps">SMTP</span> server. What will happen when you do this is a tradeoff. You will send your messages twice.</p>
<p>The first time the iPhone or Mac will connect to Gmail and send the message to the final destination. The second time the iPhone or Mac will take a copy of the message and save it to the Sent folder on MobileMe.</p>
<p>I think it&#8217;s a small price to pay. Rarely do I notice a big problem. Even sending large files has never been a real problem. But you should be aware that each message is sent over the wire &mdash; twice.</p>
<h3>6. Change <span class="caps">SMTP</span> server in Mail.app</h3>
<p>We&#8217;ll start with Mail.app.</p>
<ul>
	<li>Open Mail.app preferences</li>
	<li>Switch to the &#8220;Accounts&#8221; section and then the &#8220;Account Information&#8221; subsection</li>
	<li>Click the drop down box for &#8220;Outgoing Mail Server (<span class="caps">SMTP</span>)&#8221;</li>
	<li>Click &#8220;Edit Server List&#8221;</li>
	<li>You should see the smtp server entry for MobileMe</li>
	<li>Click the plus (+) sign</li>
	<li>Description: Gmail</li>
	<li>Server Name: smtp.gmail.com</li>
	<li>Click &#8220;Advanced&#8221;</li>
	<li>Server port: 587</li>
	<li>Check &#8220;Use Secure Sockets Layer (<span class="caps">SSL</span>)&#8221; on</li>
	<li>Authentication: Password</li>
	<li>User Name: <span class="caps">YOUR</span> <span class="caps">GMAIL</span> <span class="caps">USERNAME</span> e.g. john.doe</li>
	<li>Password: <span class="caps">YOUR</span> <span class="caps">GMAIL</span> <span class="caps">PASSSWORD</span></li>
	<li>Click &#8220;OK&#8221; to save the settings</li>
</ul>
<p>Now change the &#8220;Outgoing Mail Server&#8221; to Gmail and turn on the &#8220;Use only this server&#8221; checkbox.</p>
<p>Now all email from Mail.app will be forced to use Gmail for outgoing mail.</p>
<h3>7. Change <span class="caps">SMTP</span> server in iPhone</h3>
<p>To Change your iPhone.</p>
<ul>
	<li>Go to Settings</li>
	<li>Then &#8220;Mail, Contacts, Calendars&#8221;</li>
	<li>Then the MobileMe account</li>
	<li>Hit &#8220;Account Info&#8221;</li>
	<li>Then <span class="caps">SMTP</span></li>
	<li>Hit &#8220;Add Server&#8230;&#8221;</li>
	<li>Host Name: smtp.gmail.com</li>
	<li>User Name: <span class="caps">YOUR</span> <span class="caps">GMAIL</span> <span class="caps">USERNAME</span></li>
	<li>Password: <span class="caps">YOUR</span> <span class="caps">GMAIL</span> <span class="caps">PASSWORD</span></li>
</ul>
<p>When you hit save, it should verify the information. Sometimes this takes a little while. It will return you to the <span class="caps">SMTP</span> server list.</p>
<ul>
	<li>Select the Gmail account</li>
	<li>Switch the &#8220;Server&#8221; on</li>
	<li>Hit &#8220;<span class="caps">SMTP</span>&#8221; at the top to go back</li>
	<li>Select the MobileMe account</li>
	<li>Switch the &#8220;Server&#8221; off</li>
</ul>
<p>When you are finished, all <span class="caps">SMTP</span> servers should be off (including AT&amp;T&#8217;s) and only the Gmail server should be active.</p>
<h1>Sent Email</h1>
<p>What happens when you send email? Although the MobileMe settings on the iPhone and Mail.app both claim to be sending as &#8220;john.doe@me.com&#8221;, Gmail rewrites the headers to indicate &#8220;john.doe@gmail.com&#8221;.</p>
<h3>8. Hide your MobileMe account</h3>
<p>Whatever you do, don&#8217;t give anyone your MobileMe address. The closest you want them to get to your real email is the Gmail account. If anyone finds your MobileMe account, they can bypass the spam filters. So keep it secret.</p>
<p>Nothing sent using this set up will show the MobileMe account. Unless you use me.com to send email. If you must use the web to send an email. Log into the Gmail account and send it from there. Reading and manipulating your email can be done on me.com.</p>
<h1>Email aliases</h1>
<p>I said before that Gmail can pretend to be from your own domain &mdash; like john.doe@example.com. Even the free version of Gmail can do this. However, Gmail will always include it&#8217;s own gmail based address in the headers. Microsoft Outlook will interpret the headers as <em>John Doe &lt;john.doe@example.com&gt; on behalf of john.doe@gmail.com</em>.</p>
<p>I personally don&#8217;t have a problem with people having my Gmail account. It&#8217;s not going to change anytime soon. All mail coming back will go through the spam filter. I&#8217;ve also found that once you set up a conversation with someone, they really don&#8217;t care what your day-to-day email address is. Most people have more than one address so it&#8217;s not a big deal.</p>
<h3>9. Set Gmail to alias your domain</h3>
<p>In your Gmail account, go to &#8220;Settings&#8221;. Under the &#8220;Accounts&#8221; section, click &#8220;Add another email address&#8221;. The process is fairly simple. After the new address is properly on the account, make it the default address by clicking &#8220;make default&#8221;.</p>
<p>From now on, all messages from Gmail will pretend to be from that account. Most programs will honor the personal domain when adding information to their own address books. So it works pretty well.</p>
<h3>10. Use Google for Domains if you must hide the Gmail account</h3>
<p>Finally, if you <span class="caps">MUST</span> have everyone believe your email is coming from a certain domain, <a href="http://www.google.com/a/help/intl/en/admins/editions.html">buy a Gmail account</a>.</p>
<p>Google offers a lot of personalized services for a minimal amount. The cost is $50 a year, per email address. You get more space and domain branded google applications. So for many people, it&#8217;s worth the extra cost.</p>
<p>Either way you go, it&#8217;s a great system.</p>
<h1>Conclusion</h1>
<p>This was a long post explaining a complicated set up. Once implemented, it&#8217;s a snap to use. The integration between iPhone and Mac is nearly perfect. Having a single, focused mail account makes managing current messages a snap.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/546</id>
<updated>2009-06-09T19:36:48Z</updated>
<link href="http://www.davesouth.org/stories/test-spec-and-the-double-r" rel="alternate" type="text/html" />
<title>Test Spec and the Double-R</title>
<content type="html">
<![CDATA[
<p>Last year we did a project with substantial business logic requirements. The Rails testing framework saved us. We could create tests for all the different uses of the system and ensure that these rules were always followed. As wonderful as it was, there was a bitter aspect to Rails testing &#8212; fixtures.</p>
<p>Using fixtures to test the database layer for an individual model was fine. However, we built a class that would manipulate a half-dozen models. Ensuring that all the fixtures were perfectly synchronized was beyond painful. If we added a fixture to test some small new feature, the additional fixture would ripple through the tests causing failures on code that had nothing to do with the new feature.</p>
<p>We needed something better.</p>
<h1>Test/Spec</h1>
<p>I looked long and hard at <a href="http://rspec.info/">RSpec</a>. It is always a bit behind the Rails Edge and uses an entirely different syntax for testing. I know a holy war is going on about should.equal versus assert_equal, but for me, I prefer the terse Test Unit syntax.</p>
<p>One aspect of RSpec I did like &#8211; and desperately wanted &#8211; is the ability to set up different parameters for different sets of tests.</p>
<p>The answer was <a href="http://chneukirchen.org/blog/archive/2006/10/announcing-test-spec-0-2-a-bdd-interface-for-test-unit.html">test/spec</a> and <a href="http://svn.techno-weenie.net/projects/plugins/test_spec_on_rails/README">test/spec/rails</a>. This added context abilities to test unit with the benefits of setting up and tearing down test parameters on a granular level. It also used existing test methods like assert_equal and assert_difference. And it tracked the Rails Edge, perfectly, because it only adds features to Test Unit.</p>
<p>Yes, I know it supports should.equal and it&#8217;s cousins, but who cares.</p>
<h1>Mocking</h1>
<p>Fixtures and database testing are critical for a single model. The last thing you need is unpredictable returns from the actual database. But once you move up a level &#8211; say the controller or a separate class &#8211; hitting the database for every test gets very old.</p>
<p>At the controller level &#8211; or in our previous example, a separate class manipulating many models &#8211; we only need enough &#8220;data&#8221; to validate our particular business need. The actual method and returns of a particular search should be moved into the individual models and tested there. At this higher, more abstract, logic level we just need a select combination of data to prove the logic.</p>
<p><a href="http://onestepback.org/software/flexmock/">Flexmock</a> and <a href="http://mocha.rubyforge.org/">Mocha</a> allow this simple idea. Your controller would ask for data, but the mocking object will simulate the model&#8217;s response and return just enough data to make the test work correctly. This skips the problem of a model spewing back a whole bunch of fixtures that are not necessary or are recently added. We&#8217;re testing the logic, not the data.</p>
<p>We settled on using Flexmock. The results were fine. But the mocking code was wordy.</p>
<p>For a flexmock object you would write:</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  flexmock(Story).should_receive(:find_with_permalink).once.with('my-article-permalink').and_return(stories(:my-article))</pre>
<p>Yikes.</p>
<p>Surely it could be shorter and still be just as clear.</p>
<h1>RR</h1>
<p>While attending the Hackfest at the <a href="http://mtnwestrubyconf.org/">Mountain West Ruby Conference</a>, a programmer showed me the answer &#8211; <a href="http://mtnwestrubyconf.org/">Double-R</a> from <a href="http://pivotallabs.com/">Pivotal Labs</a>. It has a terse, clear syntax.</p>
<p>Using Double-R the same mock would be written:</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  mock(Story).find_with_permalink('my-article-permalink') { stories(:my-article) }</pre>
<p>Look familiar? The model code it&#8217;s mocking is:</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  Story.find_with_permalink('my-article-permalink')</pre>
<p><strong>Wonderful!</strong></p>
<p>What about a larger data set.</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  mock(Story).find_after_date('2008-01-01') { stories( :my-article, :your-article, :this-article) }</pre>
<p>I get a list of three stories back from the mock. Just enough to test my logic and not a bit more.</p>
<h1>RR and Test Unit</h1>
<p>RR was written to work with RSpec or Test Unit. Loading the RR TestUnit adapters directly into test_helper caused all my tests to fail. Instead, I require the RR library in test_helper.</p>
<p>Add this to test helper:</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  require 'rr'</pre>
<p>Then for each test that needs to use RR, I add this line right after the test_helper call (usually line 2):</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  class Test::Unit::TestCase; include RR::Adapters::TestUnit; end</pre>
<h1>Test/Spec and RR</h1>
<p>A snippet from our press class test:</p>
<pre class='brush: ruby;'>&#x000A;require File.dirname(__FILE__) + '/../test_helper'&#x000A;class Test::Unit::TestCase; include RR::Adapters::TestUnit; end&#x000A;&#x000A;context 'Press tag chain traversal' do&#x000A;  setup do&#x000A;    login_as :dave&#x000A;  end&#x000A;&#x000A;  it 'should return all stories with empty tags' do&#x000A;    mock(Story).find_everything { stories(:products, :software) }&#x000A;    press = Press.new&#x000A;    assert_equal stories(:products, :software), press.stories&#x000A;  end&#x000A;&#x000A;  it 'should return story using permalink' do&#x000A;    mock(Story).find_with_permalink('software') { stories(:software) }&#x000A;    press = Press.new %w(products software)&#x000A;    assert_equal stories(:software), press.story&#x000A;  end&#x000A;end</pre>
<p>The actual implementation of &#8220;find_with_permalink&#8221; and &#8220;find_everything&#8221; is in the Story model. Press is just an aggregator class and it just needs to know that it 1) actually called the right command and 2) received valid information.</p>
<h1>Stubs</h1>
<p>Doing stubs in RR is just as easy as mocks.</p>
<pre class='brush: ruby; gutter: false;'>&#x000A;  stub(Story).find_everything { stories(:products, :software, :widget) }</pre>
<p>Stubs are different from mocks. Mocks must be called or the test fails. Stubs are only there for convenience and if they are not called, the test will still pass.</p>
<p>And speaking of test failures. When a test fails because the mock wasn&#8217;t called, flexmock would generate a difficult to read error. RR&#8217;s errors are far more clear so debugging is faster.</p>
<h1>Notes</h1>
<p>To install RR:</p>
<pre class='brush: bash; gutter: false;'>&#x000A;  gem install rr</pre>
<script type="text/javascript" src="/syntax/scripts/shAll.js"></script> <link type="text/css" rel="stylesheet" href="/syntax/styles/shAll.css"/> <script type="text/javascript"> SyntaxHighlighter.config.clipboardSwf = '/syntax/scripts/clipboard.swf'; SyntaxHighlighter.all(); </script>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/545</id>
<updated>2009-10-03T05:48:24Z</updated>
<link href="http://www.davesouth.org/stories/install-ruby-on-rails-using-macports" rel="alternate" type="text/html" />
<title>Install Ruby on Rails using MacPorts</title>
<content type="html">
<![CDATA[
<p>There are several ways to set up a system for Ruby on Rails development. Leopard comes pre-installed with Ruby and Rails and is perfectly fine for most users. For me, however, I kept running into troubles. Trying to do a free standing install of graphic libraries (FreeImage or ImageMagick) proved too painful. I switched back to using MacPorts.</p>
<h3>Sandbox</h3>
<p>Much of what I&#8217;ve done is based on the work of <a href="http://hivelogic.com/articles/ruby-rails-leopard/">Dan Benjamin at Hivelogic</a>. Whether you compile manually (as Dan suggests) or use MacPorts, the goal is the same &#8212; to create a sandbox for your Ruby on Rails environment.</p>
<p>These instructions are meant to be quick and to the point. I won&#8217;t be going into great detail as to <em>why</em> I&#8217;ve done what I&#8217;ve done. There are many articles that explain <em>why</em> much better.</p>
<h3>XCode</h3>
<p>Be sure to install XCode tools from the Leopard installation <span class="caps">DVD</span>.</p>
<h3>MacPorts</h3>
<p>Download the latest version of <a href="http://macports.org">MacPorts</a> and install.</p>
<h3>Path</h3>
<p>Add these lines to your <code>~/.profile</code> or <code>~/.bashrc</code> document:</p>
<pre class='brush: bash;'>&#x000A;  export PATH="/opt/local/bin:/opt/local/sbin:$PATH"&#x000A;  export MANPATH="/opt/local/share/man:$MANPATH"</pre>
<p>Log out of the terminal session and begin a new one so the changes take hold.</p>
<h3>Ports</h3>
<p>I just install the necessary ports in one command. This will take some time as it compiles all packages from source. So go take a break.</p>
<pre class='brush: bash;'>&#x000A;  sudo port install mysql5-server git-core tiff -macosx imagemagick +q8 +gs +wmf ruby rb-rubygems rb-termios rb-mysql</pre>
<h3>MySQL</h3>
<p>Initialize MySQL database and install MySQL 5 startup. I also create a mysql link to the mysql5 binary.</p>
<pre class='brush: bash;'>&#x000A;  # Initialize MySQL database&#x000A;  sudo mysql_install_db5 --user=mysql&#x000A;  # Set MySQL to start with computer&#x000A;  sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist&#x000A;  &#x000A;  # Set mysql link to mysql5 binary for convenience&#x000A;  cd /opt/local/bin&#x000A;  sudo ln -s ../lib/mysql5/bin/mysql mysql</pre>
<p>Secure MySQL</p>
<pre class='brush: bash;'>&#x000A;  sudo mysql_secure_installation5&#x000A;&#x000A;  # Hit enter for current root password (because one hasn't been set, yet)&#x000A;  # When it asks if you want a root password, it's up to you. A development machine probably doesn't need one.&#x000A;  # Yes, you do want to remove anonymous users&#x000A;  # Yes, you want to disallow root login remotely&#x000A;  # Yes, remove test database&#x000A;  # Yes, reload privilege tables now</pre>
<h3>GEMs</h3>
<p>As of this writing, rubygems is at version 1.3.4. MacPorts installs version 1.3.1. So it needs to be upgraded. Also add github as a valid gem repository. Then run a single entry to load all rubygems at once.</p>
<pre class='brush: bash;'>&#x000A;  # Upgrade rubygems to latest version&#x000A;  sudo gem list -r&#x000A;  sudo gem update --system&#x000A;&#x000A;  # Add github as repository&#x000A;  sudo gem sources -a http://gems.github.com&#x000A;&#x000A;  # Install rails and other useful gems&#x000A;  sudo gem install rake rails capistrano \&#x000A;    capistrano-ext mongrel redgreen pdf-writer \&#x000A;    ZenTest autotest-rails ruby-debug haml rcov \&#x000A;    rr RedCloth chronic mislav-will_paginate aws-s3 \&#x000A;    thoughtbot-paperclip thoughtbot-shoulda mbleigh-subdomain-fu</pre>
<h3>MySQL Gem</h3>
<p>The ruby based MySQL connecter is gone in Rails 2.2.2. I did have instructions on how to compile the mysql gem, but it was so slow compared to the ruby based connector. It should be the other way around.</p>
<p>In the past, I couldn&#8217;t get Macports to install the rb-mysql port, but that&#8217;s changed. It works great. I added it to the ports list above. It is the fastest connector I&#8217;ve used.</p>
<h3>Shoulda</h3>
<p>I&#8217;ve tried RSpec, test-spec-on-rails and Shoulda. Of the three, Shoulda is the best. Yet I&#8217;ve had problems with it and there are others having second thoughts on these testing additions. Dan Croak wrote an excellent article about the problems: <a href="http://giantrobots.thoughtbot.com/2008/11/7/a-critical-look-at-the-current-state-of-ruby-testing">A critical look at the current state of Ruby testing</a></p>
<p>I do like the change in Rails 2.2.2 so you no longer have to write &#8220;test_should_pass_because_i_am_typing_snake_case&#8221;. Instead, you type a nice block.</p>
<pre class='brush: ruby;'>&#x000A;  test 'should test something in my program' do&#x000A;     assert this&#x000A;     assert that&#x000A;  end</pre>
<p>There is one very useful aspect to Shoulda that I don&#8217;t want to lose &#8212; macros. I love them. Very nice bits of code to test common problems in Rails. So I still install Shoulda and use the macros.</p>
<p>Check out <a href="http://www.thoughtbot.com/projects/shoulda">Shoulda&#8217;s documentation</a>.</p>
<h3><span class="caps">SSH</span> Warning</h3>
<p>Git is taking over source control management. After using it for several months, I understand why. It&#8217;s a huge jump in managing code and worth learning. However, installing git-core caused an unexpected problem.</p>
<p>Git-core depends on <span class="caps">SSH</span>, so MacPorts dutifully installs the <span class="caps">SSH</span> port. Because we changed our execution path to use /opt/local/bin before /usr/bin we will be using MacPorts version of ssh before we use Leopard&#8217;s version. This isn&#8217;t a problem except when you want to add your ssh key to the Leopard ssh agent.</p>
<p>Leopard loads a copy of ssh agent and can manage your ssh-keys on the secure Leopard keychain. This happens the first time a particular ssh-key is used to authenticate a connection. <span class="caps">BUT</span> only if you use Leopard&#8217;s version of ssh to make that connection.</p>
<p>What happened to me was that I had to create a new ssh-key. I did, loaded it on the servers, and tried connecting. But Leopard never asked to save the passphrase to the new key. To get around this I used the absolute path to Leopard&#8217;s ssh (/usr/bin/ssh) when making the connection. A Leopard dialog box appeared and asked for my key and then asked to save the passphrase in my login keychain.</p>
<p>After that, the MacPorts ssh binary works with Leopard&#8217;s ssh-agent. So it&#8217;s only a nuisance when you change or add keys.</p>
<h3>Changelog</h3>
<ul>
	<li>Friday, 4 April 2008 &#8211; Added &#8216;rr&#8217; to gem install list.</li>
	<li>Monday, 14 April 2008 &#8211; Updated git-core install.</li>
	<li>Friday, 4 July 2008 &#8211; Added improved RedCloth and will_paginate gems. Converted port install to only one line. Added Shoulda plugin. Added <span class="caps">SSH</span> warning.</li>
	<li>Monday, 1 September 2008 &#8211; Updated RedCloth to pull from standard <span class="caps">GEM</span> repository now that RedCloth is update to version 4.</li>
	<li>Monday, 8 September 2008 &#8211; Removed rb-mysql from ports list. Added how to install MySQL gem on Leopard.</li>
	<li>Saturday, 11 October 2008 &#8211; Changed shoulda from plugin to gem</li>
	<li>Sunday, 21 December 2008 &#8211; Added rb-mysql to ports install, changed Shoulda recommendations</li>
	<li>Thursday, 15 January 2009 &#8211; Added capistrano-ext to the gem list for multi-stage capistrano deployments</li>
	<li>Friday, 16 January 2009 &#8211; Added github.com as a gem repository. Added thoughtbot-shoulda and thoughtbot-paperclip to gem installation.</li>
	<li>Thursday, 22 January 2009 &#8211; Added subdomain-fu to the gem installation.</li>
	<li>Tuesday, 7 April 2009 &#8211; Removed freeimage macport and added imagemagick macport</li>
	<li>Tuesday, June 9, 2009 &#8211; Update includes mysql5-server port and autotest-rails gem.</li>
	<li>Friday, October 2, 2009 &#8211; Added aws-s3 and removed right-aws gems.</li>
</ul>
<script type="text/javascript" src="/syntax/scripts/shAll.js"></script> <link type="text/css" rel="stylesheet" href="/syntax/styles/shAll.css"/> <script type="text/javascript"> SyntaxHighlighter.config.clipboardSwf = '/syntax/scripts/clipboard.swf'; SyntaxHighlighter.all(); </script>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/544</id>
<updated>2009-05-17T03:31:27Z</updated>
<link href="http://www.davesouth.org/stories/you-never-save-money-when-you-spend" rel="alternate" type="text/html" />
<title>You never save money when you spend</title>
<content type="html">
<![CDATA[
<p>I was sightseeing around San Francisco one very rainy day. It was 1990 and I wanted a CD player. I was also broke. CD players were still rather expensive. So I&#8217;d been shopping around for a while. I knew the prices, but they were just barely out of my reach. So I was biding my time, checking every electronics store I saw.</p>
<p>That day, as I wandered around downtown, I found a small shop at the base of a skyscraper. It had a window front on the street with electronics from top to bottom. Inside, it was packed. I&#8217;ve never seen so many electronics in such a small space. It felt like a sardine can of circuits, chrome and black plastic.</p>
<p>I made my way over to the CD players and found the exact portable CD player I wanted to buy.</p>
<p>In my research, I found that the player sold for $250. Some places down about $215. Others as much as $300. But $250 was the normal amount. My hope was that it might, just one day, drop to around $150.</p>
<p>So I picked up the player and turned it over to see the price. I nearly dropped it. The sticker said $1000 &#8212; a 400 percent markup compared to all other stores.</p>
<p>I looked over the player carefully, trying to see if there was an $800 feature I&#8217;d missed. Like diamond encrusted buttons or something. There wasn&#8217;t.</p>
<p>&#8220;Well somebody didn&#8217;t mark this correctly,&#8221; I said quietly.</p>
<p>A man yelled, &#8220;You calling me a liar!&#8221;</p>
<p>I jumped. The clerk behind the counter had quietly moved close while I was examining the player. He didn&#8217;t seem happy.</p>
<p>I said, &#8220;Well, a $1000 is too much for this player.&#8221;</p>
<p>&#8220;It&#8217;s a fair price!&#8221; he snapped. &#8220;That player is very special.&#8221;</p>
<p>&#8220;But a $1000 is too much, I&#8217;ve seen it for less &#8230;.&#8221; he cut me off.</p>
<p>&#8220;Maybe I could let it go for $600,&#8221; he offered.</p>
<p>Gee, he just gave me a 40 percent discount. I&#8217;d save $400! How kind.</p>
<p>Yeah, Right!</p>
<p>I set the player down and walked straight into the rain.</p>
<p>Six months later I bought that player from Service Merchandise in Arlington, Texas. I saved my money. Actually saved it in a bank. So I could afford to buy it. Then bought it for $150 when the price was finally right.</p>
<p>The point is that I didn&#8217;t save $850 compared to the $1000 price. I didn&#8217;t save $450 compared to the man&#8217;s 40 percent off deal. Nor did I save $100 compared to the standard price.</p>
<p>I paid $150 for a CD player.</p>
<h2>You never save money when you spend</h2>
<p>Whenever you buy something. It&#8217;s always money spent. Never saved. Yes, I know that diamond ring is advertised as 50 percent off. &#8220;Think of how much money you&#8217;ll save,&#8221; says the salesman.</p>
<p>Well, there is no magic fairy that gives me the money I <em>save</em>. It&#8217;s just money spent. It is an oxymoron when you think about it. Saving money while spending it. It just doesn&#8217;t work.</p>
<p>Saving money means taking money you have, in hand, and putting it somewhere safe for a future day. Like in a mattress or a savings account.</p>
<p>When I buy something, I&#8217;m spending money.</p>
<p>Someone might think I&#8217;m saying, &#8220;Getting a good deal is a bad thing?&#8221;</p>
<p>A good deal is always a good thing IF. If it&#8217;s something you need or is far more than an impulse buy. If you will actually use it. If you can buy it at a competitive price.</p>
<p>Everything has a reasonable, competitive price. Shoes, houses, computers, cars, TVs. The trick is to:</p>
<ul>
	<li>understand the so-called <em>street</em> price for the item you are after</li>
	<li>know exactly how much money you can <strong>afford</strong> to spend on it</li>
	<li>be patient and willing to do without until you can afford it</li>
	<li>not be suckered by sales persons, brochures, shiny lights, showrooms</li>
	<li>and jump when the price is right</li>
</ul>
<p>The real savings comes by spending only when absolutely necessary and keeping the rest of your money.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/543</id>
<updated>2009-05-26T17:08:36Z</updated>
<link href="http://www.davesouth.org/stories/get-your-credit-report-every-four-months-for-free" rel="alternate" type="text/html" />
<title>Get your credit report every four months — for free</title>
<content type="html">
<![CDATA[
<p>Having a current copy of your credit record is vital to protect yourself from credit errors and identity theft. And, thanks to Congress, getting a copy is extremely easy. By law, everyone is allowed to download an annual copy of their report. But be warned. The website advertised on TV, freecreditreport.com, is <strong>not</strong> the right place to go. It is a scam run by Experian to get people to sign up for an unnecessary yearly service. The correct website is <a href="http://annualcreditreport.com">annualcreditreport.com</a>.</p>
<p>Once there, you can retrieve your credit report from all three credit reporting companies &#8212; Experian, Transunion and Equifax. Each company allows you to get your report, once a year. So how do you get your report more often?</p>
<p>Easy.</p>
<p>Don&#8217;t order a report from all three at the same time. Get the report from only one company. Make a note on your calendar to check the report from the same company at the same time next year.</p>
<p>In four months, visit the website again and order a report from the second company. Four months after that, request a report from the third company.</p>
<p>Getting a credit report more often means you will shorten the time an identity thief can use your good name without you noticing. It also helps spot errors more quickly and closer to when an error is made.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/542</id>
<updated>2009-06-09T19:57:45Z</updated>
<link href="http://www.davesouth.org/stories/multiple-uploads-using-rails-swfupload-and-attachmentfu" rel="alternate" type="text/html" />
<title>Multiple uploads using Rails, SWFUpload and AttachmentFu</title>
<content type="html">
<![CDATA[
<h2>SWFUpload</h2>
<p><a href="http://www.swfupload.org">SWFUpload</a> is a fantastic application which makes short work of a hard problem &#8212; how to upload multiple files to a website. Most solutions using Ruby on Rails revolve around multiple fields and complex ajax calls to monitor the upload progress. These are all hard to implement because they lack compatibility across browsers, require difficult server set up, and usually fail to update quick enough to give real upload progress feedback to the user.</p>
<p>SWFUpload elegantly solves this problem by using a hidden Flash movie, clever Javascript callbacks, and <span class="caps">CSS</span>. It is cross-platform (Mac, Linux or Windows) and cross-browser (Safari, Firefox, IE) compatible.</p>
<p>For example, the process for a photograph website works something like this:</p>
<ol>
	<li>The user clicks an &#8220;Upload photos&#8221; button.</li>
	<li>Instead of the standard browser &#8220;open file&#8221; dialog, a javascript call initiates the hidden flash movie&#8217;s &#8220;open file&#8221; dialog.</li>
	<li>The user can shift- or control-click one or more files to upload.</li>
	<li>The flash movie receives the file list and initiates a javascript call.</li>
	<li>Javascript POSTs the first filename to the server, just like a standard <span class="caps">HTML</span> form would do.</li>
	<li>The server begins receiving the file.</li>
	<li>The flash movie watches the upload, sending periodic javascript calls which can be turned into a dynamic upload progress bar. Because it is a client-side progress indicator, it is accurate and updated frequently.</li>
	<li>The server reports a successful upload.</li>
	<li>The javascript runner pulls another filename from the flash queue and initiates the next upload.</li>
	<li>The process repeats until the last file is uploaded.</li>
</ol>
<p>From the server&#8217;s point of view, it&#8217;s the same as a user uploading one file at a time &#8212; greatly simplifying server set up.</p>
<h2>AttachmentFu</h2>
<p><a href="http://techno-weenie.net/">Rick Olsen</a> programmed the best attachment plugin for Ruby on Rails &#8212; <a href="http://svn.techno-weenie.net/projects/plugins/attachment_fu/">attachment_fu</a>. It manages the server side upload process, storage, and retrieval of almost any attachment. For photographs it manages resizing and thumbnails, too. Storage options include saving to the filesystem, saving attachments into the database, or saving onto the Amazon S3 storage network.</p>
<p><a href="http://clarkware.com/cgi/blosxom">Mike Clark</a> of <a href="http://pragmaticstudio.com/">The Pragmatic Studio</a> has written a great <a href="http://clarkware.com/cgi/blosxom/2007/02/24">tutorial for attachment_fu</a>.</p>
<h2>Put it all together</h2>
<p>To combine SWFUpload and attachment_fu is to use the best of both worlds &#8212; a powerful client (swfupload) and server (attachment_fu) upload process. After a lot of research, I put together a sample application that combines Ruby on Rails, AttachmentFu, and SWFUpload.</p>
<p>This application is based on the <a href="http://demo.swfupload.org/applicationdemo/index.php"><span class="caps">PHP</span> application demo</a> included in the <a href="http://demo.swfupload.org/">SWFUpload demos</a>.</p>
<p>This is a simple demonstration of how all these components can work together. Go through the code, pull it apart, read the <a href="http://demo.swfupload.org/Documentation/">SWFUpload documentation</a>. Then adapt it for your own use.</p>
<h2>Download</h2>
<p>The public repository for rails-swfupload is on <a href="http://github.com/davidsouth">github</a>. To clone the repository: <code>git clone git://github.com/davidsouth/rails-swfupload.git</code></p>
<h2>Contact</h2>
<p>If you have any suggestions, tips, bugs please email dave dot south at <a href="http://www.neotribune.com">neotribune.com</a>.</p>
<h2>Requirements</h2>
<ol>
	<li>Ruby on Rails 2.1.0</li>
	<li>Freeimage</li>
	<li>Ruby gem image_science</li>
	<li>SQLite3 or MySQL</li>
</ol>
<p>Included in this application:</p>
<ol>
	<li>SWFUpload 2.1.0</li>
	<li>attachment_fu (7 Jun 2008)</li>
	<li>mimetype-fu (7 Jun 2008)</li>
</ol>
<h2>Mimetype-fu</h2>
<p>Flash sets the mimetype for each file to application/octet-stream. Attachment_fu requires the mimetype to be set correctly before it will accept the files. <a href="http://railsontherun.com/">Matt Aimonetti</a> wrote <a href="http://code.google.com/p/mimetype-fu/">mimetype-fu</a> to help attachment_fu properly set the mimetype.</p>
<h2>attachment_fu_hack</h2>
<p>Using an <a href="http://errtheblog.com/posts/67-evil-twin-plugin">evil twin</a> plugin, I overrode several standard AttachmentFu methods.</p>
<ol>
	<li>Uploads through SWFUpload will automatically detect mimetype.</li>
	<li>Transliterated uploaded filenames have extra underscores removed and the whole filename is downcased.</li>
	<li>When running tests a temporary directory is used rather than the public/photos directory</li>
</ol>
<h2>Functional Test</h2>
<p>I added two functional tests for the photos controller. It tests both create and swfupload. Since each time the test is run, it adds a file to the temporary directory, the same test will destroy the photo as well.</p>
<h2>Leopard Tips</h2>
<p>To upgrade Mac OS X 10.5 (Leopard) to the latest version of Rails, first upgrade ruby gems (sudo gem update &#8212;system) then update Rails itself (sudo gem update). To install FreeImage and image_science, I suggest installing <a href="http://macports.org">Macports</a> and then using port to install FreeImage (port install freeimage). Use gems to install image_science (sudo gem install image_science).</p>
<p>Remember to install XCode tools (on Leopard install disk) before you can use Macports.</p>
<p>You can change the photo model to use mini_magick or RMagick in combination with ImageMagick. However, in my tests, I&#8217;ve found FreeImage/image_science to be much faster than ImageMagick/mini_magick.</p>
<h2>Links</h2>
<p>Useful links and related information found while researching this project:</p>
<ul>
	<li><a href="http://swfupload.org/">SWFUpload</a> &#8211; New home of the SWFUpload project.</li>
	<li><a href="http://blog.airbladesoftware.com/2007/8/8/uploading-files-with-swfupload">Uploading Files With SWFUpload</a> &#8211; Excellent source of information.</li>
	<li><a href="http://blog.inquirylabs.com/2006/12/09/getting-the-_session_id-from-swfupload/">Getting the _session_id from SWFUpload</a> &#8211; The cookie plugin that comes with SWFUpload 2.0.1 may bypass the session_id problem. However, I have not had a chance to test it, yet.</li>
	<li><a href="http://developer.assaydepot.com/?p=6">Activeupload</a> &#8211; A non-attachment_fu solution to combine SWFUpload and Rails.</li>
	<li><a href="http://beast.caboo.se/forums/2/posts?page=9">Caboose forum posts</a> &#8211; Read the posts from Peter De Berdt.</li>
	<li><a href="http://www.ruby-forum.com/topic/114752">Ruby forum discussion</a> &#8211; More from Peter De Berdt.</li>
	<li><a href="http://blog.flornet.fr/2007/05/29/swfupload-using-ruby-on-rails-demo/">Flornet&#8217;s Blog</a> &#8211; An SWFUpload 1.x Rails demo.</li>
	<li><a href="http://almosteffortless.com/2007/03/25/working-with-attachment_fu/">Working with attachment_fu</a> &#8211; Some attachment_fu tips.</li>
	<li><a href="http://errtheblog.com/posts/67-evil-twin-plugin">Evil Twin Plugins</a></li>
</ul>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/541</id>
<updated>2009-05-17T03:17:42Z</updated>
<link href="http://www.davesouth.org/stories/dvorak-keyboard" rel="alternate" type="text/html" />
<title>Quit typing like a spider</title>
<content type="html">
<![CDATA[
<p>In 1994 I took a Sharpie and wrote out the alphabet on my computer keyboard. Then I took little pieces of clear tape and carefully covered each key to keep from rubbing off the newly written letters. Why would I do this? Because my hands were starting to hurt and I needed a better way to type. Dvorak was the key. Not the <a href="http://www.pcmag.com/category2/0,1738,3574,00.asp">columnist</a> but the researcher who created the <a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard">world&#8217;s greatest keyboard layout</a> &#8212; <a href="http://en.wikipedia.org/wiki/August_Dvorak">August Dvorak</a>.</p>
<p>I won&#8217;t go into why the current keyboard layout, called <span class="caps">QWERTY</span>, is so bad. Except to say that whenever I typed on a standard <span class="caps">QWERTY</span> keyboard, it looked like my fingers were doing a spider dance as they would crawl all over the keyboard to type even basic words.</p>
<p>The <a href="http://en.wikipedia.org/wiki/Image:KB_United_States_Dvorak.svg">Dvorak layout</a>, on the other hand (no pun intended), looks like I&#8217;m rolling my fingers across the keyboard. The home row has all the vowels on the left hand and all the major consonants on the right. The next most popular letters are on the top row on the right. Then the quote mark, comma, period and two more popular letters on the top row on the left.</p>
<p>The bottom row contains the last letters starting with the most popular in the center and working outward to the least popular. The semicolon/colon key is on the lower left of the keyboard rather than under the <strong>Home Row</strong> which was really a dumb place for a semicolon.</p>
<p>Dvorak refined the design based on the frequency of when a letter is used. Thousands of common words can be typed without leaving the home row. He also designed it so that your hands would commonly type words starting from the outside and moving in &#8212; rolling your fingers as you type.</p>
<p>The switch took about a month. Two weeks into it, I couldn&#8217;t type very well in either format. But I pushed through and in a month, I could type almost as fast as I could on <span class="caps">QWERTY</span>. Today, I type extremely fast and with far less strain on my hands than <span class="caps">QWERTY</span> would cause.</p>
<p>When I mentioned this to my sister, Melinda, she switched to Dvorak. At the time, Melinda was typing in journals written by some of our ancestors. It was a lot of work and her hands were beginning to hurt. After the switch, Melinda said her hands quit hurting and she can type unbelievably fast.</p>
<p>Two more of my friends have switched and love it. It takes one month of regular typing. But after that, it&#8217;s easy. There are many <a href="http://www.google.com/search?q=free+dvorak+tutorial">free Dvorak typing tutorials</a>. All modern computer operating systems support <a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard#Modern_operating_systems">mapping the keyboard</a> to Dvorak.</p>
<p>Today I type on a regular keyboard. The keys clearly show the old <span class="caps">QWERTY</span> layout. I no longer need the Sharpie to help me. I just know where the letters are. For anyone who types for a living, a programmer or a writer, I recommend switching immediately. Find a tutorial and start. In one month, you will be finished and will never again go back to typing like a spider.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
<entry>
<id>tag:www.davesouth.org,2005:Story/540</id>
<updated>2009-05-17T03:11:45Z</updated>
<link href="http://www.davesouth.org/stories/security-is-a-pain" rel="alternate" type="text/html" />
<title>Total Security is a Total Pain</title>
<content type="html">
<![CDATA[
<p>Security is a pain. Too much security gets in the way of productivity. Too little and the world owns your bank account. Finding the right balance is difficult. For me, securing my laptop has proven to be a challenge. Sure, I can lock it down so it requires a drop of blood every time I wake it up, but that&#8217;s too painful (and I need the blood). So I found a decent balance that you may want to try.</p>
<h2>No Auto-Login</h2>
<p>Mac OS X supports auto-login where the computer just boots to my user. That&#8217;s great for a desktop computer at home. But a laptop gives up all your data, instantly, to the first thief that comes along. At a bare minimum, make your computer require a password each time it boots or wakes from sleep.</p>
<p>Go to System Preferences &#8594; Security.</p>
<ul>
	<li>Turn on &#8220;Disable automatic login&#8221;</li>
	<li>Turn on &#8220;Require password to wake this computer from sleep or screen saver&#8221;</li>
</ul>
<h2>Hard Passwords</h2>
<p>Make sure your login password is harder than just your username repeated twice. It should have at least a number and even a punctuation mark. Once login is locked, a person cannot casually open your computer and access your data. A thief would be able to gain access, but at least it&#8217;s not handed to them on a platter.</p>
<p>A harder login password is only part of the password equation. Passwords should be:</p>
<ul>
	<li><strong>Individual</strong> &#8211; Never use the same password twice</li>
	<li><strong>Hard</strong> &#8211; A mixture of letters, numbers and even punctuation</li>
	<li><strong>Long</strong> &#8211; At least eight characters</li>
</ul>
<p>A good password for a banking website could be something like: w!8L_565yQ</p>
<p>And never use that password for any other site.</p>
<h2>Remembering Passwords</h2>
<p>But wait a minute. How can someone possibly remember all those different, hard passwords? You can&#8217;t. Nobody can. We have no choice. Good passwords prevent people from accessing your bank, credit card, telephone accounts. If someone takes your laptop, they will know what websites you visit. They may even find the usernames you use to login.</p>
<p>What we need is a way to remember the passwords, but that a thief cannot access if they take your machine.</p>
<h2>Keychain</h2>
<p>Every Mac comes with a program called Keychain. It&#8217;s a system program that encrypts valuable data into a secure file typically in the /Users/<span class="caps">YOURNAME</span>/Library/Keychains folder. These files are very hard to crack. Without the keychain unlock password, the files require a very difficult attack to open &#8212; far beyond a common thief. Never assume that your laptop wouldn&#8217;t end up in someone&#8217;s hands that could open the file. But you can assume that properly locked, it will take them a while to break it. This gives you time to change your passwords on the websites stored in the Keychain.</p>
<h2>Keychain Access</h2>
<p>By default, Mac OS X creates a keychain called &#8216;login&#8217;. It is created with the same password you use to log into your system. Also by default, that keychain is unlocked every time you log into your computer. But maybe we could be a little more paranoid.</p>
<ol>
	<li>Open Applications &#8594; Utilities &#8594; Keychain Access. In the upper left window, is probably a small unlocked padlock next to the word &#8220;login&#8221;.</li>
	<li>Click Edit &#8594; Change settings for keychain &#8220;login&#8221;</li>
	<li>Turn on &#8220;Lock when sleeping&#8221;</li>
	<li>If you are more paranoid, select &#8220;Lock after X minutes of inactivity&#8221; and set the number to how long you want it to wait before locking.</li>
	<li>Save and quit Keychain access</li>
</ol>
<p>Now the keychain will lock when you put the computer to sleep. Or if you set it, after a period of inactivity.</p>
<h2>Sidetrack: Resetting Login Passwords</h2>
<p>To reset your system login password, you go to System Preferences &#8594; Accounts, click your account, and hit Change Password. It also changes the keychain &#8216;login&#8217; password to match. <span class="caps">BUT</span>, if you have to reset your system password using the install disk, the keychain &#8216;login&#8217; password will not change.</p>
<p>So, if a thief has access to a compatible install disk for your laptop (install disks are tied to groups of serial numbers), they can reset your account password. But they cannot reset your keychain passwords. They still have to crack to the &#8216;login&#8217; password to gain access.</p>
<h2>Keychain Trouble</h2>
<p>Keychain is a wonderful system, but it falls short in certain areas. It cannot remember multiple usernames and passwords for a website. I have several GMail accounts. Keychain will only remember one. Also, if you change computers or have to do a from scratch install (which is likely if someone steals your machine), the login.keychain file won&#8217;t like it.</p>
<p>What we need is a Super Keychain. Something that&#8217;s just as secure, but offers more features.</p>
<h2>1Passwd</h2>
<p><a href="http://1passwd.com/">1Passwd</a> is the best password manager on the market. The developer did something so smart, it&#8217;s a wonder no one else did it before. Rather than reinventing the wheel, he uses the Keychain subsystem to save and encrypt all his data.</p>
<p>What does this mean?</p>
<p>1Passwd doesn&#8217;t create a proprietary, unknown, file for storing passwords. It stores them in a system standard keychain file right next to the login.keychain. It&#8217;s brilliant. It&#8217;s the same level of encryption as keychain and any improvements to the keychain system, automatically improves his program.</p>
<p>It also means that if you lose 1Passwd, you can still read the 1Passwd.keychain file using the Keychain Access program in Utilities.</p>
<p>But 1Passwd does way more than Keychain could.</p>
<p>1Password,</p>
<ul>
	<li>works in Safari, Firefox, Camino (Keychain by itself only supports Safari).</li>
	<li>supports multiple usernames and passwords for a single website.</li>
	<li>can create very hard passwords for you, and remember them.</li>
	<li>automatically remembers nearly every form you fill out.</li>
	<li>maintains multiple identities to fill online forms with (work, home, vacation house).</li>
	<li>saves passwords for websites trying to prevent saving passwords (like some banks).</li>
</ul>
<p>I can&#8217;t go over every feature here. I highly recommend visiting <a href="http://1passwd.com/">1passwd.com</a> and watch the movies. The program costs $30 and is worth every penny.</p>
<h2>Putting it All Together</h2>
<p>I save every password into 1Passwd. I use a fairly hard password to lock 1Passwd. I save this password into the &#8220;login&#8221; keychain. Why? Because I lock the login keychain when the computer goes to sleep. 1Passwd also automatically locks when the computer sleeps. Now all my keychains are locked and cannot be opened without knowing at least the &#8220;login&#8221; password (which is harder than my system username password).</p>
<p>When I open my laptop, I have to type my username and password. When my computer tries to use the keychain (getting mail for example) it prompts me for the &#8220;login&#8221; keychain password. I type that and my passwords are all open.</p>
<p>I use 1Passwd to fill in web forms and otherwise manage my passwords in the system. I&#8217;ve made 1Passwd bookmarks and I know the keyboard shortcut (see the <a href="http://1passwd.com/mac_osx_password_manager/tutorials">tutorials</a>). It makes short work of my day.</p>
<p>When I leave my computer in an open area, I turn on the screen saver or shut the laptop (either way locks all keychains and password protects my computer).</p>
<p>If a thief gets my machine. They will have to break a lot more security to get to my truly sensitive information. If they can get an install disk, they will probably reset my password and look through my files. But my keychains are still locked and protected. This gives me time to load a new computer with my backup data (you are backing up your computer, right??!!), open my 1Passwd keychain file, and start going to websites and changing my passwords.</p>
<h2>One More Thing</h2>
<p>There are files on my computer that I don&#8217;t want anyone to read. Financial files. Personal files. I don&#8217;t need my whole system encrypted just to protect this data. So instead, I created a lock box, or safe, on my computer to store sensitive data.</p>
<p>To create a safe:</p>
<ol>
	<li>Open Applications &#8594; Utilities &#8594; Disk Utility</li>
	<li>Click &#8220;New Image&#8221;</li>
	<li><strong>Save As:</strong> Try something innocuous like &#8220;stuff&#8221;</li>
	<li><strong>Where:</strong> I usually save to the desktop and move it later</li>
	<li><strong>Size:</strong> I typically set to about 40 MB which will hold a lot of documents but not a ton of images</li>
	<li><strong>Encryption:</strong> Select &#8220;<span class="caps">AES</span>-128 (recommended)&#8221;</li>
	<li><strong>Format:</strong> Sparse disk image which creates an image just large enough to hold any data it contains but not the whole 40 MB in size (remember, you have to back up this file so smaller is better)</li>
	<li>Click &#8220;Create&#8221;</li>
	<li>A window pops up asking to create a password (and verify it)</li>
	<li>It&#8217;s up to you whether to save the password in the &#8216;login&#8217; keychain</li>
	<li>Click &#8220;OK&#8221;</li>
</ol>
<p>What&#8217;s created is a file called stuff.sparseimage (using my Save As name of &#8216;stuff&#8217;). It&#8217;s a disk image that can be mounted and unmounted on your computer. It should first be automatically mounted after it&#8217;s created. You will see a drive icon with the disk image name under it. Double click it.</p>
<p>It&#8217;s blank. It&#8217;s just a virtual disk to save things into. Save financial information, personal files, anything worth protecting into it. It can handle text, images, doc files, open office documents. You can create folders and organize your data inside.</p>
<p>When finished, <span class="caps">ALWAYS</span> remember to &#8220;Eject&#8221; the image by dragging the drive icon into the trash (which should appear as an eject icon when the drive is dropped on it). The virtual drive automatically encrypts all the data when it&#8217;s unmounted (ejected). To open the drive again will require the password (either from the &#8216;login&#8217; keychain which will happen automatically or you have to type it in).</p>
<p>Move the virtual disk file (sparseimage) someplace meaningful on your computer. When you need it again, just double click that file.</p>
<p>Remember, if you don&#8217;t unmount (eject) the opened disk image, a thief will have access to the decrypted data. Only unmounted disk images are securely encrypted.</p>
<h2>Nobody&#8217;s Perfect</h2>
<p>1Passwd, keychain, encrypted disk images will not save your computer from a determined cracker. But it will do the job most of the time. It&#8217;s not a perfect system. Nothing is. Total security is a total pain. Find a balance you can live with and do it.</p>
]]>
</content>
<author>
<name>Dave South</name>
</author>
</entry>
</feed>
