<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>kuh • pain´• kah</title>
	<atom:link href="http://kapanka.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://kapanka.com</link>
	<description>(Take with food to improve tolerability)</description>
	<pubDate>Tue, 17 Aug 2010 23:54:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>You Can&#8217;t Beat The Price</title>
		<link>http://kapanka.com/2010/08/you-cant-beat-the-price/</link>
		<comments>http://kapanka.com/2010/08/you-cant-beat-the-price/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 23:54:05 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Burning Man]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=86</guid>
		<description><![CDATA[Burning Man is free.]]></description>
			<content:encoded><![CDATA[<p>Every year, I hear some dicksquat make some uninformed shitpile of a comment about how <a href="http://burningman.com" target="_blank">Burning Man</a> is so expensive.  This recalls a conversation I once had very drunk and very early in the morning on the Black Rock with <a href="http://people.tribe.net/2927c092-6e3c-46dc-9f84-fbdaca9c4e43">Cowboy Bob</a>, and I figured I&#8217;d just put this out there.</p>
<p>Burning Man is free.</p>
<p>Well, not literally, but let&#8217;s do some math, because math solves everything. Here we go:</p>
<p>Burning Man tickets cost about $300.  That $300 gets you in at midnight the Monday before Labor Day, and the Event ends on Labor Day Monday, let&#8217;s say, at 11:59.  That&#8217;s 8 full days. But not that many people really stay until the very end, so I&#8217;m gonna be generous to the math (you&#8217;ll see how in a second), so let&#8217;s call it 7 days.  7 days in the Black Rock Desert.</p>
<p>What does $300 get you. At the barest minimum, $300 guarantees you:</p>
<p>1. somewhere to camp on public lands during the private event</p>
<p>2. a private place to evacuate your body</p>
<p>3. police protection</p>
<p>4. access to emergency medical services</p>
<p>5. access to ice and a minimum assortment of beverages</p>
<p>Really, that&#8217;s all you&#8217;re guaranteed.  But what do you REALLY get? You get amazing art seen nowhere else on earth. You get an amazing pyrotechnics show on Saturday (the Man) with probably the single largest fire you&#8217;ve ever personally seen. You&#8217;ll get another, possibly equally large or larger &#8220;burn&#8221; on Sunday. There&#8217;s also music and other performances 24 hours a day.  There are people that you meet that may become lifelong friends (or enemies). Those things are pretty tangible.</p>
<p>You also get to potentially learn new things, like how to tie a knot, pull out stuck rebar, pitch a tent or shade, and cooperate with others.  You&#8217;ll learn to rely on yourself and provide for others. You can attend any number of classes on everything from tantra to trivets. You will learn to tolerate others&#8217; unique perspectives on what it means to participate. You may become more comfortable with your body/self-image by seeing other people&#8217;s bodies and positive self-image.  It&#8217;s quite possible that you will learn things about yourself you never knew before, or try things you otherwise were reluctant to try.  You may climb a tall tower, or roll in fresh grass, or ride a huge glowing dancefloor-having duck.  You will learn your limits of sleep, patience, tolerance, acceptance, and rethink the world that you&#8217;ve trudged through every day unawares that things could be different if we all tried.  But I&#8217;m getting off track here.  Back to the math.</p>
<p>So, Burning Man is 7 days, 24 hours for $300. 7 days divided by the price comes out to $42.86 per day. Taking this a little further, that comes out to $1.79 per hour. $1.79 per hour.</p>
<p>More math, since Burning Man is 24 hours a day for 7 days, that&#8217;s 168 hours of non-stop, world-class, participant-created, non corporate-funded, non advertising-having, non revenue-driven, non politically-motivated, unique, sometimes dangerous, raw unadulterated art and culture.  In fact, I&#8217;m gonna nix &#8220;art &amp; culture&#8221; and just go with &#8220;experience&#8221;.  All 168 hours are available to you if you want it. I don&#8217;t know anyone who&#8217;s stayed awake for the entire Event, and I don&#8217;t recommend it (it might be impossible), but again, you ticket entitles you to all of it, whether you can or not.</p>
<p>Now, let&#8217;s compare this to a few things:</p>
<p>Lady Gaga is coming to the Oakland Arena. I have nothing against Lady Gaga or her performance, I&#8217;m just using this as an example because it&#8217;s current.  So here comes Lady Gaga, tickets are on sale now.  They&#8217;re $50. The ticket price from Ticketmaster is $65 after all the fees and whatnot.  So let&#8217;s do our math again:</p>
<p>Lady Gaga costs $65.  The show &#8220;starts&#8221; at 8:00pm. I don&#8217;t know for sure, but I assume it&#8217;ll be over at 11pm or midnight. I&#8217;ll be generous and go with midnight.  So, Lady Gaga performs for 4 hours. Doing the math that&#8217;s $16.25 hour.</p>
<p>What do you get for this? You get:</p>
<p>1. entrance to the Oakland Coliseum</p>
<p>2. a private place to evacuate your body</p>
<p>3. police protection</p>
<p>4. access to emergency medical services</p>
<p>5. access to an assortment of beverages &amp; snacks</p>
<p>But what do you REALLY get?  You get in to the arena to see possibly an opening band and Lady Gaga perform their music live.</p>
<p>Now here&#8217;s where I get critical (again, no slight against Lady Gaga in particular, I happen to enjoy a few of her tracks).  For SIXTEEN times the cost, you get to see someone perform live, something that you&#8217;ve probably heard/seen over and over for the previous year or two. On tour, she&#8217;ll probably perform a smattering of new material, but you&#8217;re really there to hear the hits and solidify the experience of hearing it pre-recorded.  While you&#8217;re there, you will be heavily marketed to through advertising and other types of targeted sponsorships.  If you want a souvenir t-shirt, the design on it will probably not be what you hoped (but maybe it&#8217;s an epic shirt, who knows) and it will start at $25 for poor quality (maximum markup/profit) materials.  If you want to enjoy a beer, it will start at $9.  The entire experience you have will be overpriced, commodified, and controlled.  You will passively watch the performance, and cheer when it&#8217;s appropriate to do so.  You can&#8217;t push the button to make the fire go. You can&#8217;t climb to the  top of the stage and watch from there if you want. You can&#8217;t ride around on a pink  furry mushroom.  You cannot participate.  Sure, it may be the best show of your life, and it may change your outlook on everything from then going forward, but I highly doubt it.  What will you take away from it? Some photos of a tiny stage? A crappy t-shirt? A Lady Gaga souvenir DVD?</p>
<p>At Burning Man, for $42/day you can make your own souvenirs of your own design and quality. You will more than likely be given them as gifts, just because.  Want a beer, just ask for one.  Hell, come ask ME for one. It&#8217;ll be free. Want to get involved? Just ask, before you know it, you might find YOURSELF on stage giving the performance. When you leave, you will have bruises, you will have loved or lost love, you will love it or you will hate it, but you will have had an experience you will never forget.</p>
<p>Now I&#8217;m sure I&#8217;m gonna hear it about the actual TCA of Burning Man (Total Cost of Attendance), which is, of course, much higher than just the ticket price, but it doesn&#8217;t have to be.  You could buy some groceries, find your old tent, jump in your car and be there in a few hours. TCA: food + gas + ticket.  OK, no car, go with friends.  No friends?  Rent an RV. Wait, you want to look fabulous? Ok, you get my point, the pricetag can skyrocket depending on how much you want to put into it, but most of that is your choice on how much you want to participate.  But let&#8217;s be fair and put up some real numbers for 1 person, going with 3 friends.  Ticket: $300, food: $300, car rental: $600, gas: $100, costumes: $150, blinky lights: $40, beer: $60, tent $100, extras (goggles, sunscreen, lip balm, lotion, etc etc): $100. Let&#8217;s see where we&#8217;re at now: $1750. BUT you split the car and gas and food ($1000) with friends.  So your portion is $250. Now we&#8217;re at: $1000 for you to come to Burning Man in style.</p>
<p>Back to the math: $1000/168 hours = $5.95/hour, or $142/day.  But you&#8217;re STILL not up to Lady Gaga prices. So let&#8217;s do the math backwards.  To get $16.25/hr &#8220;worth&#8221; of entertainment at Burning Man, you&#8217;d have to spend $2730 ON YOURSELF.</p>
<p>Now, how is Burning Man free? I just paid $1000 to go!  I&#8217;m not going to break it all down, but think of this.  Go back and read all of the non-tangible things you might get if you&#8217;re not a total asshole, ruining everyone&#8217;s experience sitting at camp bitching and complaining about how it&#8217;s &#8220;hot &amp; dusty&#8221;.  Put a price tag on some of those things.  Let&#8217;s put a dollar figure on &#8220;self-esteem&#8221;.  Therapy to work out all the shitty things your parents said to you that make you think you&#8217;ll never amount to anything runs about $100/session. Sessions for once a week for a year: $5200. Welding class: $1000. Wilderness class: $250. Camping trip to the Redwoods: $300 (all told).  Basically, if it was even possible to put together all of the things that Burning Man gives you for free (once you&#8217;re there) and put a dollar value on them and come up with a price tag, I ABSOLUTELY GUARANTEE that it would come out to more than $300. More than $1000. And certainly more that $2730.</p>
<p>And while you&#8217;re there, everything is free*, all you have to do is participate to get your money&#8217;s worth. You can&#8217;t beat the price.</p>
<p><em>* Except coffee and ice</em></p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2010/08/you-cant-beat-the-price/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mozilla (Firefox) Accessibility  vs Design vs Me</title>
		<link>http://kapanka.com/2010/07/mozilla-firefox-accessibility-vs-design-vs-me/</link>
		<comments>http://kapanka.com/2010/07/mozilla-firefox-accessibility-vs-design-vs-me/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:34:14 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=84</guid>
		<description><![CDATA[Greetings again.  Today&#8217;s rant post is about Firefox and CSS and Accessibility/Usability.
The problem: Users (and QA) complaining about the dotted line that appears around links and form elements (buttons, submit, checkboxes, etc) in Firefox.  This line is usually just inside of the bounding box.  The line appears &#8220;on focus&#8221; and &#8220;on click&#8221;, or &#8220;:active&#8221; and [...]]]></description>
			<content:encoded><![CDATA[<p>Greetings again.  Today&#8217;s <span style="text-decoration: line-through;">rant</span> post is about Firefox and CSS and Accessibility/Usability.</p>
<p>The problem: Users (and QA) complaining about the dotted line that appears around links and form elements (buttons, submit, checkboxes, etc) in Firefox.  This line is usually just inside of the bounding box.  The line appears &#8220;on focus&#8221; and &#8220;on click&#8221;, or &#8220;:active&#8221; and &#8220;:focus&#8221; in CSS parlance.  So basically, if you tab through a form or series of links, this border gives you an idea of where you are in the tab order. It serves this purpose well, but there are times that it fails or can cause confusion.</p>
<p>If you have elements positioned off-screen or use off-screen image replacement techniques this border can behave strangely, showing the dotted border going off the screen in odd ways.  Also, if you fill out a form and click on a submit button that is a link, the border can persist while you wait for the form to process, which is unsightly.  Also, if you have image-based links, and click on them, this border persists until the HTTP response data starts to come in and the browser beings to load the subsequent page.  Again, unsightly.</p>
<p>Now, I understand this border&#8217;s role and purpose in the world, and I will go over how to remove it in a minute, but before I do that, I&#8217;d like to give my $1.50 service fee, which mostly has to do with clicking on things.</p>
<p>First, I think that this border can be unsightly to layouts.  When you click something, the design is not intended for it to suddenly become outlined and this outline is imposed by the browser.  Many of us are proud of our designs and the work we put in to them.  We don&#8217;t plan for them to have this &#8216;feature&#8217;.  My main beef here is that it is imposed by the browser and finding out how to control it takes some deft Googling.</p>
<p>Second, I think it is confusing, but only sometimes.  When you&#8217;re tabbing through things, it makes perfect sense and requires no explanation.  The user inherently understands it.  But when you click on something, it appears out of the blue.  Sure, you&#8217;ve drawn focus, and that&#8217;s why it&#8217;s there, but the user doesn&#8217;t think like that.  They think, &#8220;why is that there all the sudden?&#8221;, but then it&#8217;s gone and the user moves on.  Still, there is a moment of wonder.  I don&#8217;t really like that part.</p>
<p>Now, I want to support accessibility, so I don&#8217;t want to remove this border completely.  If I remove the border on &#8220;focus&#8221;, I eliminate the accessiblilty, which I don&#8217;t like.  So, my answer was to only remove the border on &#8220;active&#8221;, which seemed to work except for one thing: after &#8220;active&#8221;, you&#8217;ve drawn focus so the border THEN shows up for focus.  Feh!  You can&#8217;t win!</p>
<p>From a JavaScript perspective:</p>
<p>IDLE -&gt; MOUSEIN -&gt; HOVER -&gt; MOUSEDOWN -&gt; MOUSEUP -&gt; HOVER -&gt; MOUSEOUT</p>
<p>From a CSS perspective:</p>
<p>IDLE -&gt; ACTIVE -&gt; FOCUS -&gt; IDLE</p>
<p>Basically, you cannot activate without drawing focus.  Now, don&#8217;t get me wrong, it makes perfect sense, but it leaves my image button with an unsightly dotted border after clicking on it.  I can&#8217;t really argue that this shouldn&#8217;t be the case, either, I mean, you clicked on it, therefore you focused on it, right?  To me, it seems that at this point what does it matter to show focus?  The deed has been done, the page is about to be destroyed and a new one built.  The only [overkill] thing I can think to do is to build some crazy JavaScript (jQuery) that would de-focus buttons on mouseUp.</p>
<p>Anyhow, my solution was as follows:</p>
<pre>input[type="button"]:active::-moz-focus-inner { border: 0; }
input[type="button"]:focus::-moz-focus-inner { border-color: #eee; }</pre>
<p>This removes the border for when you click on it, but still shows it, although super-dimly.  This way, you still get a visual cue for tabbing through form elements, but when you click on it, you barely notice the border while the page is loading.  Won&#8217;t work well on varied backgrounds.  If ti came to it, I would do the JavaScript thing I talked about earlier.  Let&#8217;s see if I can do it now:</p>
<pre>$('input[type=button]').mouseup( function(){ $(this).blur(); });</pre>
<p>Well, there you have it.  So you only need the first piece of CSS above and this jQuery snippet, and it works how I want.  Feel free to apply to &#8220;A&#8221; links too.</p>
<p>Many thanks to the following:</p>
<p><a href="http://archivist.incutio.com/viewlist/css-discuss/108868">http://archivist.incutio.com/viewlist/css-discuss/108868</a><br />
<a href="http://stamatiskritikos.com/2010/01/03/remove-dotted-outline-vs-accessibility/">http://stamatiskritikos.com/2010/01/03/remove-dotted-outline-vs-accessibility/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2010/07/mozilla-firefox-accessibility-vs-design-vs-me/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why Twitterrific Failed</title>
		<link>http://kapanka.com/2010/06/why-twitterrific-failed/</link>
		<comments>http://kapanka.com/2010/06/why-twitterrific-failed/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:20:40 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=81</guid>
		<description><![CDATA[I am SO sad.  I love Twitterriffic.  It was the first Twitter client I used and every attempt to replace it has brought me back to it. Sure, I am admittedly addicted to the Tweeting bird sound, but that&#8217;s not all.  It&#8217;s clean, fast and uncluttered.  Despite missing some MAJOR features (like Retweet. Hello?!) I [...]]]></description>
			<content:encoded><![CDATA[<p>I am SO sad.  I love Twitterriffic.  It was the first Twitter client I used and every attempt to replace it has brought me back to it. Sure, I am admittedly addicted to the Tweeting bird sound, but that&#8217;s not all.  It&#8217;s clean, fast and uncluttered.  Despite missing some MAJOR features (like Retweet. Hello?!) I still use it.</p>
<p>Well, that&#8217;s over.  At least for the iPhone version.  <a href="http://iconfactory.com" target="_blank">IconFactory</a> just released their 3.0 version, after basically going dark about it, and releasing instead, tons of icon packs.  So, their customers (like myself) waited and waited.  We eyed other apps.  We tried out Tweetie which handled a lot of things better, but has a unique, nonstandard, and interesting (yet kindof wonky after heavy use) interface.  Well, here it is, and I can tell you that they just lost me and here&#8217;s why — and I haven&#8217;t even really used it heavily:</p>
<p>1. They made the avatar icons smaller and increased the font size, and offer no preferences/settings to change it.</p>
<p>2. No geotagging support that I can find.</p>
<p>3. Removed multiple account support (now in paid version)</p>
<p>4. Removed all the convenient bottom row icons in favor of a stupid &#8220;more actions&#8221; button</p>
<p>5. &#8220;Nearby&#8221; seems to be gone. Maybe it&#8217;s somewhere</p>
<p>6. The awesome filter button is gone.</p>
<p>7. Settings seems to be just&#8230;gone.</p>
<p>At least it has Retweet.</p>
<p>Here are some things that had to be added or it was a total flop:</p>
<p>1. Lists</p>
<p>2. Delete Tweet</p>
<p>3. Search</p>
<p>It just appears to me that this release is a huge step backwards with seemingly less feautres.  Maybe it was a complete redesign and they just couldn&#8217;t get all the features into the new codebase&#8230;not like they didn&#8217;t have a TON of time between releases.  Alas, to me it seems like they just don&#8217;t care anymore.  It seemed to me this was their flagship product, but maybe they see the hostile actions taken by Twitter as a sign to drop Twitter and focus on making fun eye candy instead.</p>
<p>I will continue to use Twitterrific on the desktop, switching to Tweetie only when I need to manage my other accounts (increasingly often).  I am sad to go b/c I really wanted 3.0 to be a success.  It isn&#8217;t.</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2010/06/why-twitterrific-failed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apple Can Eat A Bag of Dicks</title>
		<link>http://kapanka.com/2010/06/apple-can-eat-a-bag-of-dicks/</link>
		<comments>http://kapanka.com/2010/06/apple-can-eat-a-bag-of-dicks/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:56:49 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=75</guid>
		<description><![CDATA[If you know me well, you know that I&#8217;m essentially an Apple Fanboy. I mean, I own an AppleTV for crying out loud. (It sucks, BTW).  But you also know that I&#8217;m not blind to Apple&#8217;s faults.  For example, I routinely go off about OS lockdown and carrier lock on the iPhone, the endlessly shifting [...]]]></description>
			<content:encoded><![CDATA[<p>If you know me well, you know that I&#8217;m essentially an Apple Fanboy. I mean, I own an AppleTV for crying out loud. (It sucks, BTW).  But you also know that I&#8217;m not blind to Apple&#8217;s faults.  For example, I routinely go off about OS lockdown and carrier lock on the iPhone, the endlessly shifting landscape of hardware input formats (buy many cables?), and Apple&#8217;s inability to listen to what their most loyal consumers are asking for, opting instead to deliver simply what they think we want.</p>
<p>Well, today I&#8217;m pissed off, and if I had a viable alternative, I wouldn&#8217;t buy an iPhone.  But there is no viable alternative so I&#8217;m (re)ordering my iPhone 4.  Please, do not try to argue with me about Blackberry, Palm, or Android.  Especially Android.  The iPhone is the only acceptable smartphone experience in the game. Period. (Do NOT leave me comments about this point, I&#8217;ll write another blog post about it if you want to hear my thoughts on that)</p>
<p>So, why am I pissed off?  Well, like any good Apple Loyalist, I pre-ordered my iPhone 4.  I was up at 5a Pacific when the online Apple Store opened, and I seamlessly placed my order for my shiny new toy.  At the end of the process I was offered a choice: pickup or delivery.  It stated (I&#8217;m paraphrasing) that I would have a reservation and be able to go to the store and pick up my phone, so I decided that rather than incur additional shipping nonsense (extra packaging, possible delays, addition carbon output from delivery trucks, etc), that I would take the reservation and pick up my iPhone at the Apple Store.  The Apple Store is just a few blocks from my office, so it wouldn&#8217;t be a huge deal to get up a bit early and stop by the Store before heading to work.</p>
<p>This was a stupid decision.</p>
<p>Apparently, to Apple, having a reservation means &#8220;everybody show up at the same time&#8221;, so having a reservation is completely meaningless.  Instead of one line at the Apple Store, there are now two lines, and interestingly, the line for reservations was LONGER than the regular line.  So when I arrived this morning for my &#8220;reservation&#8221; I found the line to be 3/4-way around the block.</p>
<p>Now listen. I&#8217;m sure some of you are thinking &#8220;oh, right, you just thought you would walk right into the Apple Store, pick up your iPhone and walk out? On Release Day? Yeah, right&#8221;.  Well, no, of course that&#8217;s not what I thought at all.  What I thought was &#8220;I have a reservation for 7am, and probably so do a lot of other people, but they can only handle so many an hour, so I can&#8217;t have to wait more than an hour or so to get my phone.&#8221;</p>
<p>See, here&#8217;s what I would think you would do if you were taking &#8220;reservations&#8221;.  You would do it like a restaurant.  You would know your capacity (Number of dedicated Apple Store staff on hand), you would know your throughput (how long it takes, on average, each Staffer to process an new iPhone), you would do some math to give yourself some slippage, and then you would fill up that many slots per hour.  So, let&#8217;s pretend:</p>
<p>Apple Store SF has, say, 30 Blue Shirts dedicated solely to iPhone reservations.<br />
Each Blue Shirt can do 3 iPhones an hour. (20 minutes each)</p>
<p>Therefore it would be safe to assume that you would be able to process 90-100 iPhones an hour. THEREfore, you would give out 100 reservations for 7a, 100 reservations for 8a, and so forth.  This is the expectation you set by calling it a &#8220;reservation&#8221;.  Instead, it appears that Apple took this approach instead:</p>
<p>We&#8217;ll have 2,400 iPhones in stock on opening day, so we&#8217;ll give the first 2,400 people a reservation.  (I&#8217;m guessing on the numbers, of course).  So let&#8217;s do this math backwards, if you can process 100 iPhones an hour, and you have 2,400 iPhones, that means it will take you 24 hours, non stop, at pace, to clear out that many iPhones.  Well, last time I checked, the Apple Store was not open 24 hours.  Let&#8217;s say they only have 1,200 on hand.  That&#8217;s 12 hours.  I think the Apple Store (today) is open 7a-7p (12 hours) so they could reasonably expect to move all 1,200 iPhones in 12 hours, so reservations make sense, especially if you stagger them by hour.  Seems like a reasonable expectation, no?</p>
<p>But the point here is, why make &#8220;reservations&#8221; and give you this idea that that somehow means something if instead you&#8217;re just going to have yet another free-for-all under some false pretense? I thought the point of the reservations system was to alleviate lines and waiting and mayhem? I made a reservation because I don&#8217;t want to wait in a retardedly long line.  I made a reservation because I didn&#8217;t want to get up at 4a (probably still way too late) and sit outside in the cold and dark.  I made a reservation because I wanted to do my small part to save the planet, by using my feet to pick up my iPhone, rather than a UPS truck.  I made a reservation because I expected it to BE A RESERVATION.  I mean, I was awake at 1:00am working, so if I&#8217;d really wanted to, I could have gone down and gotten in line then.  But I didn&#8217;t because <strong>I HAD A RESERVATION FOR 7AM!</strong></p>
<p>So, Fuck You Apple, and Fuck You Steve Jobs.  Once again, ONCE AGAIN you have fucked me but yet you&#8217;re STILL going to get my money.  Why? Because your product Kicks Ass.  But you really have a lot to learn about being good to your loyal customers, especially you loyalest of customers.  I&#8217;m not the first person, and I won&#8217;t be the last that you Fuck, and still come back.  But like any abusive relationship, one day the sex won&#8217;t be so good anymore, I&#8217;ll tire of being treated like shit and ignored, and whatever after-the-fact apologies you offer, shiny gifts you try to appease me with, or kind words you speak that always seemed to work in the past, it won&#8217;t matter because it&#8217;ll be just one too many times, the love will be gone, and I&#8217;ll want your shit out, my keys back, I will look back and wonder what I ever saw in you in the first place, and I will never EVER want to speak to you again, no matter what.</p>
<p>Am I clear?</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2010/06/apple-can-eat-a-bag-of-dicks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installing Self-Signed SSL cert on OS X Snow Leopard</title>
		<link>http://kapanka.com/2009/12/installing-self-signed-ssl-cert-on-os-x-snow-leopard/</link>
		<comments>http://kapanka.com/2009/12/installing-self-signed-ssl-cert-on-os-x-snow-leopard/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 19:57:36 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=60</guid>
		<description><![CDATA[How to generate and install a self-signed SSL certificate on Mac OS X 10.6 Snow Leopard]]></description>
			<content:encoded><![CDATA[<p>Read either:</p>
<p>http://developer.apple.com/internet/serverside/modssl.html -or-</p>
<p>http://www.macosxhints.com/article.php?story=20041129143420344</p>
<p>Notes about problems with either will follow.</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2009/12/installing-self-signed-ssl-cert-on-os-x-snow-leopard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Office contest: Need ur halp, win some money!</title>
		<link>http://kapanka.com/2009/04/office-contest-need-ur-halp-win-some-money/</link>
		<comments>http://kapanka.com/2009/04/office-contest-need-ur-halp-win-some-money/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 23:59:34 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=54</guid>
		<description><![CDATA[Hey gang!
We&#8217;re having a little contest here at the office, and if you participate, you can win some money.  We&#8217;re doing some testing of our product FUZE Meeting, and if you&#8217;ll agree to give it a try and participate in a meeting, it&#8217;d be really helpful.  It&#8217;s free, totally painless, and won&#8217;t take [...]]]></description>
			<content:encoded><![CDATA[<p>Hey gang!</p>
<p>We&#8217;re having a little contest here at the office, and if you participate, you can win some money.  We&#8217;re doing some testing of our product FUZE Meeting, and if you&#8217;ll agree to give it a try and participate in a meeting, it&#8217;d be really helpful.  It&#8217;s free, totally painless, and won&#8217;t take much of your time.  Here&#8217;s the official text from the company:</p>
<blockquote><p>Friends,<br />
As many of you know, I’ve been working on an amazing high definition web and mobile collaboration service called FUZE Meeting.  We are launching a major new version of the service and really need your help to ensure a high quality release.  This quick test will only take 20 minutes of your time. What’s in it for you?  One participant from each meeting will win a $15 Starbucks gift card and all participants will be entered to win a randomly selected $500 grand prize.  You’ll also be helping me; the CallWave employee with the most participants wins a $250 prize!</p>
<p>We will hold four meetings a day from April 20th through May 1st.  Meetings will take place at 9am, Noon, 3pm and 6pm Pacific Time.  Please register below on the date and time that works best for you. If time/date you select is full, please select a different one.  You will be sent an invite with meeting details a few hours prior to the meeting start time you selected.</p></blockquote>
<p>Sign up and get a chance to win some cash, and help us out!</p>
<p><a href="http://fuzemeetingbeta.eventbrite.com?s=1158923" target="_blank">http://fuzemeetingbeta.eventbrite.com?s=1158923</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2009/04/office-contest-need-ur-halp-win-some-money/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A complex, flexible table layout</title>
		<link>http://kapanka.com/2009/03/a-complex-flexible-table-layout/</link>
		<comments>http://kapanka.com/2009/03/a-complex-flexible-table-layout/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 23:39:17 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[border]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[hack]]></category>

		<category><![CDATA[IE]]></category>

		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=44</guid>
		<description><![CDATA[A quick little walkthrough of how I set up this seemingly simple table.  It has some hidden complexities that are easily taken care of with some planning.]]></description>
			<content:encoded><![CDATA[<p>Greetings!</p>
<p>I was given the task of building what appeared like a relatively simple table for work, but in the end it turned out to have quite a few challenges, and I figured I&#8217;d document how I did it in case someone else wanted to give it a try (or I had to do it again.)  NOTE: I originally did this with DIV&#8217;s and reverted to a table, and some of the CSS was more important then. First, let me show you what I was given:</p>
<div id="attachment_45" class="wp-caption alignnone" style="width: 675px"><img src="http://kapanka.com/wp-content/uploads/2009/03/example1.jpg" alt="The Photoshop file" title="example1" width="665" height="417" class="size-full wp-image-45" /><p class="wp-caption-text">The Photoshop file</p></div>
<p>OK, so you can see at first glance it looks pretty simple.  Here are some of the tricky parts:</p>
<ol>
<li>The height must be flexible, since different browsers will have different font sizes</li>
<li>The cell borders must overlay the shaded border</li>
<li>There is a slight gradation in the background of the table</li>
<li>Table has no outside border</li>
</ol>
<p>So, here&#8217;s how (I think) I did it.</p>
<p>First the entire table is wrapped in a div with id &#8220;#left&#8221; for positioning and isolation purposes.  (The page had another smaller box floated right.)  The #left div has a set width and a background image.  The background image is sliver of the gradation and is set to repeat-x and to sit at the bottom:</p>
<p><code><br />
#left {<br />
width: 651px;<br />
background: transparent url('/graphics/pricing-box-background.png') repeat-x bottom;<br />
}<br />
</code></p>
<p>Next we define a table inside the DIV with the same width, no cellpadding, border, or cellspacing.  Yes, I&#8217;m still old-school like that.</p>
<p>Here&#8217;s where it gets tricky.  All the rows (TR) get a class of &#8220;row&#8221;, but the first and last row get ID&#8217;s of &#8220;first&#8221; and &#8220;last&#8221;.  Each table cell (TD) gets a class of &#8220;column&#8221; and a class of &#8220;column-1&#8243; or &#8220;column-2&#8243;&#8216; depending.  (The first column has to be wider than the rest, but the rest have to be equal.)  Here&#8217;s the HTML:</p>
<table border="0" cellspacing="0" cellpadding="0" width="651">
<tbody>
<tr id="first" class="row">
<td class="column column-1">
<h2>Plans:</h2>
</td>
<td class="column column-2">
<h2>Free</h2>
</td>
<td class="column column-2">
<h2>Unlimited</h2>
</td>
<td class="column column-2">
<h2>On-Demand</h2>
</td>
</tr>
<p>OK, now that might look simple, but the CSS is, well, involved. Let&#8217;s start with the &#8220;row&#8221; class:</p>
<p><code><br />
.row {<br />
width: auto;<br />
margin: 0 auto;<br />
background-color: transparent;<br />
background-image: url('/graphics/pricing-box-border.png') repeat-y;<br />
position: relative;<br />
}<br />
</code></p>
<p>Things of note here: we style the row with a background PNG that is 651px wide and consists only of the shaded left and right border of the table, transparent everywhere else.  This gets the edges of each row.  Originally I had done this to the entire #left div, but for some reason I forget now, that didn&#8217;t end up working out, so I decided to do it to the row.  IN the end I had to add &#8220;position: relative&#8221; to solve an IE 6/7 problem where background images applied to a row are inherited by the table cells contained in it. The other half of this hack is setting the TD&#8217;s to have no background image.  See below.</p>
<p>Now to style each cell.  I called them columns.  Here&#8217;s the column CSS:</p>
<p><code><br />
.column {<br />
border-left: 1px solid;<br />
border-top: 1px solid;<br />
border-color: #ccc;<br />
border-width: 1px;<br />
background-color: transparent;<br />
padding: 4px;<br />
vertical-align: top;<br />
background-image: none;<br />
}<br />
</code></p>
<p>Things of note: the order I&#8217;ve defined the border widths and colors seemed important at the time but now I don&#8217;t see why.  I do know that applying the border to the top rather than the bottom was significant because if you apply the border to the bottom, you have the problem where not all the cells are the same length&#8230;at least when they were DIV&#8217;s.  It still seemed prudent to keep the borders on the top.  I also put a border on the left, rather than the right because we have that second unique class on the first column (.column-1) where we can shut it off.  The background-image: none is the second half of the IE6/7 hack where the cells inherit the background image of the containing row.</p>
<p><code><br />
.column-1 {<br />
width: 30%;<br />
border-left: none;<br />
padding-left: 12px;<br />
}<br />
</code></p>
<p>Things of note: This column is wider than the others.  I used percentages because I absolutely hate trying to calculate margin/padding/width nightmares.  Give it a percentage, make them add up to less than 100% and most padding shouldn&#8217;t self-destruct the table.  As you can see we turn off the left border in the first column to achieve the empty outside border of the table on the left side.  I also want the text to have some breathing room, so I added a little left padding.</p>
<p><code><br />
.column-2 {<br />
width: 20%;<br />
}<br />
</code></p>
<p>The rest of the columns are all the same width, adding up to 60%.  Add 30% and you get 90%.  This swallows up the remainder added by padding/margins, which are all calculated differently under different circumstances/browsers, so I just fudge it and come under.  Note that because we chose to use the left border before, we don&#8217;t have to deal with shutting off the border on the right side.  Easy.</p>
<p>Now we start to pile some things up using precedence.</p>
<p><code><br />
#first .column {<br />
border-top: none;<br />
padding-top: 6px;<br />
}<br />
#first.row {<br />
background: transparent url('/graphics/pricing-box-top.png') no-repeat top left;<br />
}<br />
</code></p>
<p>Here we simply turn off the top border for the first row and give some breathing room to the titles.  Also we add the shaded rounded PNG to the top row to round out the shaded border of the table.  Note how the interior table border sits on top of this background image seamlessly. Nice.</p>
<p><code><br />
#last .column {<br />
border-bottom: none;<br />
padding: 9px;<br />
}<br />
#last.row {<br />
background: transparent url('/graphics/pricing-box-bottom.png') no-repeat bottom left;<br />
}<br />
</code></p>
<p>Not much special here (and some unnecessary code, oops) to add the shaded border to the bottom. One thing of note here.  Because the DIV (#left) has a gradation for a background, is positioned to the bottom, and sits UNDERNEATH the rounded corners, which are transparent, the gradation pokes through on the bottom corners.  If you look carefully, I&#8217;ve added white to the corners to prevent this from happening.</p>
<p>Right now, this page can&#8217;t be viewed live, but when it&#8217;s live, I&#8217;ll post the URL in all its glory.</p>
<p>All in all, it&#8217;s way more work than it should be.  Now that I look back, it&#8217;s way easier to explain than it was to do, simply because I tried a few things here and there.  I might have to go through and lint pick the CSS for leftover stuff from when I was doing it with DIVs.  I hope you liked this, if so, click my Google Ads a few times.</p>
<p>~Spanky</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2009/03/a-complex-flexible-table-layout/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Customizing Selenium RC to take command line args</title>
		<link>http://kapanka.com/2008/12/customizing-selenium-rc-to-take-command-line-args/</link>
		<comments>http://kapanka.com/2008/12/customizing-selenium-rc-to-take-command-line-args/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 00:00:10 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Selenium]]></category>

		<category><![CDATA[Selenium RC]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=40</guid>
		<description><![CDATA[Customizing Selenium RC to take a few arguments to facilitate testing multiple environments or switching browsers.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written a few lines of code that you can use to pass a URL or the browser type you want to use from the command line, using Python.  At the bottom of your Python-based selenium test, you can replace the &#8220;if __name__ ==&#8221; part with the following code:</p>
<pre>if __name__ == "__main__":

    ### custom
    import sys, getopt
    global testurl, browser
    testurl = "http://127.0.0.1"
    browser = "*chrome"
    try:
        opts, args = getopt.getopt(sys.argv[1:], "", \
            ["url=","browser="])
        for opt, arg in opts:
            if opt in ("--url",):
                testurl = arg
                argument = opt + "=" + arg
                sys.argv.remove(argument)
            if opt in ("--browser",):
                browser = "*" + arg
                argument = opt + "=" + arg
                sys.argv.remove(argument)

    except:
        pass
    ### /custom

    unittest.main()
</pre>
<p>and the setUp method with:</p>
<pre>    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, \
            browser, testurl)
        self.selenium.start()
</pre>
<p>Then on the command line, you can go:</p>
<pre>python test_myTest.py --url=http://myurl.com --browser=iexplore</pre>
<p>I&#8217;m sure the code could be better, but I&#8217;m not that great with getopt.</p>
<p>~Spanky</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2008/12/customizing-selenium-rc-to-take-command-line-args/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Selenium RC, Firefox, and the Self-Signed SSL Cert</title>
		<link>http://kapanka.com/2008/12/selenium-rc-firefox-and-the-self-signed-ssl-cert/</link>
		<comments>http://kapanka.com/2008/12/selenium-rc-firefox-and-the-self-signed-ssl-cert/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 20:59:30 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Cert]]></category>

		<category><![CDATA[Firefox]]></category>

		<category><![CDATA[Selenium]]></category>

		<category><![CDATA[Selenium RC]]></category>

		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=36</guid>
		<description><![CDATA[How to use self-signed SSL certs with Selenium RC]]></description>
			<content:encoded><![CDATA[<p>OK, this one&#8217;s been driving me nuts, mostly because it took the &#8220;automated&#8221; part out of automated testing, which basically defeats the purpose.  If I can&#8217;t run an automated test, I am much more prone to avoid running them, and therefore not test, and therefore introduce bugs.</p>
<h2>The Problem:</h2>
<p>The problem is with self-signed certs.  If you are working on something locally and it uses SSL (HTTPS), normally you&#8217;ll just create your own cert and forget about it.  The problem is that when you run Selenium RC (with Firefox/chrome) it&#8217;ll fire up a browser and when it reaches this secured page, it&#8217;ll throw an exception.  The exception is in an unscriptable window (AFAICT) and you wouldn&#8217;t want to code around the window in the test b/c it probably won&#8217;t happen on your staging or production servers.  Normally with Firefox, you can simply add an exception, which gets written to a file called &#8216;cert_overrides.txt&#8217;, and forever going forward you won&#8217;t need to worry about it.  Again, the problem is that because Selenium fires up a fresh profile each time you run it, you can&#8217;t simply add this exception anywhere.  You&#8217;d think adding the &#8216;-trustAllSSLCertificates&#8217; flag to the command line when you start the Selenium Server would work, but it doesn&#8217;t.  I think the problem I&#8217;m having is not an expired or invalid cert, but that it&#8217;s self-signed and the CA is not trusted. (Whatever, all I know is that it doesn&#8217;t work).</p>
<h2>The Answer:</h2>
<p>Well, at first glance, it seemed like I could just make a blank Firefox profile, by firing it up from the command line and saving a new profile.  The problem with this is that the new profile won&#8217;t have all of the Selenium proxy stuff configured.  In fact, there&#8217;s seems to be a whole buncha stuff missing from the profiles, so I don&#8217;t recommend doing this.  If you really want to know how to create a blank Firefox profile.  Open a Terminal and type:</p>
<p>/Applications/Firefox.app/Contents/MacOS/firefox-bin -profilemanager</p>
<p>Once you&#8217;ve followed all the prompts, a new profile will be created in: ~/Library/Application Support/Firefox/Profiles</p>
<p>But anyhow, you want to know how to make it WORK not how it doesn&#8217;t work!  This is what I did and it seemed to work.  First create a Selenium test with one step that is basically a really long wait.  I use Python so I have this step in my test:</p>
<pre>def test_WAIT(self):
    sel = self.selenium
    sel.open("/")
    sel.wait_for_pop_up('xxx', 999999)</pre>
<p>This bascially gives you time to do the next step.  OK, so now in your Terminal, open the /tmp folder in a regular Finder window by typing: open /tmp - Now, fire up the Selenium Server, and run the test.  While the test is basically just hanging, you&#8217;ll see there&#8217;s a new folder in /tmp called something like: customProfileDir0ad7f0b886b7499bbf53d2ee5f4dc3dd. Drag this folder somewhere (like your Desktop), you should be asked to authenticate.  Once you&#8217;ve copied the folder to your desktop (or wherever), you can use it as an alternate profile for firing the Selenium Server.  I renamed the folder &#8216;SeleniumProfile&#8217; and added the &#8216;cert_overrides.txt&#8217; file to the folder (with the overridden cert information in it. If you override a cert in your normal profile, you can just copy it out of that file).  Now you can use this fully prepared and ready Firefox profile with Selenium Server by running:</p>
<p><code>java -jar selenium-server.jar -firefoxProfileTemplate ~/Desktop/SeleniumProfile</code></p>
<p>To me, this was the simplest path to getting going.</p>
<h2>My suggestions:</h2>
<p>If it were up to me, I woul ddo one of a few things:</p>
<ol>
<li>Make the -&#8217;trustAllSSLCertificates&#8217; flag actually work.</li>
<li>Make it such that when the Selenium Server fires up and copies the files out of the Firefox default profile (found in /Applications/Firefox.app/Contents/MacOS/defaults/profiles ), it should copy ALL of the files in that folder, rather than just localstore.rdf and a few others.  This way you could drop your cert_overrides.txt file in there and go on your way</li>
<li>Include a fully formed &#8220;blank&#8221; profile with the distribution of Selenium RC to use or modify.</li>
</ol>
<p>Other than that, I continue to use and love Selenium.  I hope this article helps and gives folks who are doing the development some ideas to make things better for the users.  I see a lot of these problems not properly answered in the forums and will be posting this blog link in there.</p>
<p>~Spanky</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2008/12/selenium-rc-firefox-and-the-self-signed-ssl-cert/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mac OS X&#8217;s Ditto Command</title>
		<link>http://kapanka.com/2008/12/mac-os-xs-ditto-command/</link>
		<comments>http://kapanka.com/2008/12/mac-os-xs-ditto-command/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 19:34:35 +0000</pubDate>
		<dc:creator>spanky</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[copy]]></category>

		<category><![CDATA[ditto]]></category>

		<category><![CDATA[merge]]></category>

		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://kapanka.com/?p=34</guid>
		<description><![CDATA[A new handy command line tool called ditto]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bombich.com/"><img class="alignleft" src="http://www.bombich.com/images/software.gif" alt="" width="64" height="64" /></a>I learned of a new handy command while at the SF Apple Store getting my laptop fixed (long story).  Have you ever been copying a lot of files in the Finder, and left the room to make tea, watch a movie, or go to bed? (Yes, THAT much data?!) only to return and find that it crapped out part way through with some stupid File in Use or File Locked or other somesuch problem?  Well, I have.  Often.  This had led me in the past to do such large copies from the Terminal sudo-style.  When I was at the Apple Store, the &#8220;Genius&#8221; there told me about the command line tool called &#8220;ditto&#8221;.  The description from the man page reads:</p>
<blockquote><p>In its first form, ditto copies one or more source files or directories to a destination directory.  If the destination directory does not exist it will be created before the first source is copied.  If the destination directory already exists then the source directories are merged with the previous contents of the destination.</p></blockquote>
<p>Friggin&#8217; awesome if you ask me.  This means when I&#8217;m recovering my hard drive to my (very stale) backup, I just use <code>'sudo ditto src dest'</code> and it merges everything into one nightmarish glob that I&#8217;ll never look at again, but at least I know everything between the two is there.</p>
<p>I can also imagine it might be great for merging two iTunes Libraries.  Hope this is useful to you!</p>
<p>~Spanky</p>
]]></content:encoded>
			<wfw:commentRss>http://kapanka.com/2008/12/mac-os-xs-ditto-command/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
