Oct 20 2012
So-called “Terrible” stock performance
A few days ago, Google slipped up in releasing quarterly earnings reports before they were PR-ified, popular media referred to their results as ‘terrible’:
What Page couldn’t apologize for, however, is that Google’s results were pretty terrible. The company’s profits plunged 20 percent from a year ago, according to the Wall Street Journal (source)
Today, AMD released their quarterly, and results were also ‘terrible’:
Just one day after the company posted pretty terrible quarterly earnings (“Net loss $157 million, loss per share $0.21, operating loss $131 million”), followed by a 16 percent drop in the company’s stock price and job cuts of 1,800 (15 percent of its global workforce), two financial analysts have now downgraded the company. (source)
In both cases, the companies made less than expected, except, Google’s so-called ‘terrible’ results are a profit of $1.74B on $14B of revenue (which was a 45% increase from a year previous). In other words, Google’s margins are getting tighter, but they’re still making nearly 2 billion dollars in profit every 3 months.
When google’s quarterlies came out, the world was aflame with news stories heralding the coming of the end times. A day later, AMD is making zero profit at all, and somehow in the same category of ‘terrible’ as far as investors (or at least investment media..) are concerned.
Investors want you to set a target, and exceed that target, so they grow rich off of you breaking your back for their hft algorithms that make money while they sleep. Don’t hit your mark, eat a little cost, and make $2 billion dollars while doing it, and their good will and faith goes right out the door.
Oct 18 2012
Life is like a movie..
Life is like a movie, except there’s a lot of boring filler between the scenes worth remembering. In other words, life is like a Peter Jackson movie.
Oct 17 2012
Users aren’t stupid, your UI is.
tl;dr; version: Get your head out of your ass, stop adding complex features that 90% of the world won’t care for. Instead, learn to stop, breathe, and make your software products simple by focusing on usability consistently.
Users aren’t stupid, your UI is.
In a big bad world of federated software product development, Usability is usually a bullet item way down at the bottom of a list of priorities for anyone but designers, at best. When your entire product team (including designers, developers, qa, etc) lives and breathes a particular software product for a period of months or years, *any* product becomes easy to understand. It’s easy to understand because you’re paid to think about, live, and breathe that product for 8 hours a day or better, for very long periods of time.
It’s no wonder when your amazing product ships and the users come out en masse and tell you what you’ve made is shit in one way or another.. your users don’t get paid to deal with your poor choices, in fact, in many cases, they’ve invested their own money (or at least their time) to endure your lack of focus and attention to detail. A user doesn’t have the time, or take the time to deal with something that’s difficult to understand or work just so.. unless of course, like you, they’re paid to think about, live with, breathe.. your product.
It follows then, that the holy grail of software development is truly internal tooling and products: the users have esoteric problems to solve, they’re paid by the hour to deal with your junk product with zero competition. And, best of all, all that matters is if you can measure the hours saved by converting that insane spreadsheet they were using before into a simple web app for the invoicing department, then you’re a hero. But, internal tooling and products aren’t the real world, and I’d argue that even internal tooling should have the same designer love, care, and attention that something you’d ship externally does (if you can afford it..).
Usability should be the primary concern for everyone involved with your product. That includes parties you’ll usually have to drag kicking and screaming into caring about usability, such as developers, qa personel, and dev managers. There’s always a bit of a trade off between perfect and good-enough, and while requirements estimated to the hour may look great on paper, if the product’s hard to understand on your ship date, what will the green check marks by deadlines buy you then?
So how do we learn about Usability? For starters, I’d highly recommend any or all of the following books, which were recommended to me by mentors and peers:
- Don’t Make Me Think – Steve Krug
- The Design of Everyday Things – Donald Norman
- Tapworthy: Designing Great iPhone Apps – Josh Clark
- The Business of iPad and iPhone Development – Wooldridge and Schneider
If you don’t have the time for books, the roundabout way to learn about usability is to start paying attention to the details in the apps and products you already love. Do you ever automatically attempt to pull a door with a handle, only to discover it pushes instead? Do you have to figure out which step is next in one app, while the next seems to just flow from step to step in an ordered fashion without worry? Have you ever endured godaddy’s checkout process?
Some usability sins are worse than others, but every sin is a chance to pay attention to underlying drivers of your frustration or annoyance. When we notice the design in things, we get a little closer to the zen of appreciation, and we sharpen our usability skills all the while.
More or less: listen to Steve Jobs, go take a walk and think about your product more abstractly; keep things simple, then simplify them again; make the most used bits of the product the easiest to get to, and don’t be afraid to require a little more effort for the less oft-used functionality; usability test with someone who is *not* a coder or designer or paid employee if you can help it; build analytics into your site or app; build easy/great feedback mechanisms right into your product; provide a customer service email or number, make them easy to find, and take every single customer complaint or criticism to heart.
Knowing usability in theory will not be enough, it’s nigh impossible to disassociate yourself enough from a product you’ve lived and breathed to understand the flaws in your immaculate design. And, if you can achieve the zen master state of dissociative “new user” nirvana, you’ll never be an idiot user.
Who or what is an “idiot user”?
An idiot user is 90% of your user base. That is, someone who is using your software to do something they want or need to do. They have zero interest in “learning” for your product to be useful, and they have an equal amount of interest in figuring out all the neat whiz-bang things your product can do. If they have to think about your software, your software has failed, and some poor techie in the family or IT dept is getting a phone call. It’s as simple as that.
Fun fact, did you know the #1 search term on google is almost always the phrase “yahoo”? Think about the implications of this for a moment. This means *most* (i dare say: the vast majority of..) users are opening their browsers, seeing the google web page, and typing “yahoo” to get to their mail and entertainment news. This means *most* users do not know what an address bar is, or what a url is, or that a browser has some hidden feature to make yahoo their starting page. This is your idiot user.
Nice-guy analysts will tell you users aren’t as dumb as the numbers suggest, people have just defaulted to using the search bar rather than the address bar because it’s quicker. I call bullshit, because I’ve seen it, and surely you have too. Why should our non-technical friends or family know or care about a default starting page in a browser, or an address bar that only shows them errors rather than guesses at the correct answers for them? It frustrates us techies to no end to say for the millionth time “Stop clicking on attachments!!!”, but the truth of the matter is simple: software is not yet user-friendly or simple enough.
It’s getting there: a 4 year old can use an iPad without being able to read, your mother in law can find and play any number of amazing casual games online on facebook with her friends and family, world of warcraft style. But we’re not there yet, especially as long as you and I keep making crap software where usability is a “maybe” priority at best.
Another fun fact: you and I are idiot users, too. Remember your first time trying to find the network preferences pane in your new shiny Vista or Windows 7 install after years of the Win9X control panel layout? Ever tried to make sense of iMovie ’11+? The fundamental difference between idiot users and idiot techie users is that idiot techie users have the patience, curiosity, or perhaps control issues that allow them to quickly try-discover-fail-and-iterate. The real question is perhaps, which user is really the idiot, the one who fails fast and gives up, or the one who deals with the absurdity of our software complexity and therefore continues the cycle?
So what does usability mean in the real world? A small example:
My buddies and I created TumbleOn, a photo viewing app for photos from Tumblr.
When we started making TumbleOn, every Tumblr photo app we could find made it nigh impossible to quickly view photos in a simple stream view. Most apps only allowed users to view their “dashboard” (like the news feed on facebook), and nothing more. Tumblr limits the dashboard to 300 posts total, so that gave us an easy metric to time: “how long does it take to see all 300 photos in these other apps?” answer: 5-10+ minutes depending on the app. Answer in tumbleon? 1 to 3 minutes on average. Success! … or so we thought.
We released TumbleOn, dreaming of riches, and picturing ourselves heroes for blessing the world with time savings on their dashboard. Then the feedback started to come. Users found bugs, they had crazy ideas, and good ones, but one comment we consistently received was “I want to see more photos on my dashboard!”.
Our app made it possible for 90% of the users to reach the end of the dashboard, where other apps were so limiting that perhaps 10% of the users would spend the in-app time and effort to ever hit the end, and yet our users were complaining! The nerve! This was not success, this was a usability failure.
Being smart little college-educated developers and designers, we set out to solve this usability problem in one of those esoteric and too-technical ways that only college-educated developers can: we added complicated features that nobody understood, and made the problem worse.
We added a nifty “analysis” feature, which analyzes a user’s posts on their dashboard and shows blogs the images come from, so the user can easily go view more or perhaps discover a new blog they’ll like. We added the feature, made it almost impossible to find, along with a few other new features, and patted ourselves on the back for another release.. heroes again, this time, surely, triumphant! Just look how smart we are, look at our neat new complex analysis feature and behold its glory, if you can find it, mere mortal!
Another cycle of complaints and confusion later, we made a little hint auto-popup to show users where we hid these treasures in the app. Even so the analytics showed abysmal numbers, for every 100,000 dashboard views, perhaps 100 analysis events would happen.. the top percent of a percent of our users even knew or comprehended what analysis was, in other words: the techies understood, and 90% of our user base thought we were out-of-touch idiots, rightfully so.
We then put the 300-post-limit usability issue on the backburner, essentially accepting defeat. We added some foot notes to in-app help documents that users never read. We also added a video about the features that users never watch (statistically speaking), because that video is also buried in the in-app help system. Users don’t have time for a 3 minute video, they use the app for less than 3 minutes on average as it is.
A few months passed and for whatever reason this review sparked a flood of the-right-way-to-do-it ideas from our subconscious:
The idea was simple, which is a sure sign you’re on the right track in terms of usability or anything to do with software development really. We simply needed to make it easier for users to use the analyze feature, without even requiring a super technical understanding of what post analysis meant. We added a “view more” button at the end of a photo stream, changed our verbiage about why the dashboard ended, and provided simplified “view top 10 xyz” views into the analysis data, like this:
Results? Between the verbiage and the view more options, we’ve done something right, because users no longer complain about the dashboard limit or perceived shortness. The users simply click “view more”, find something related to what they just saw, and almost instantly fall into a #lol tag with thousands of posts. They don’t even see or consider the “analyze posts” or other 5 options shown in the popup above, they see what they want, and go for it.
Are more users finding and understanding the “proper” analysis feature after our improvements? Not really. And that’s okay, because thousands more users are using the feature without even knowing it, because that’s how great software design works: as if it were transparent.
Great software is transparent to the user. It’s not about someone using your app, hitting the fourth wall and thinking “gosh, the software team behind this must be really really smart, it’s so complex!”. What sells is sparkle, shine, animations, and fundamentally transparent design. The shine will get them in the door, the transparent “it just works” attitude will keep them coming back for more.
Sometimes the first, second, or even the third version of your feature is not the feature that ultimately works, but taking the time to mentally iterate on an idea using quick wire frames will go a long way toward the product you truly want to deliver. For wire frames, I recommend pencil and paper (an idiot user’s choice) in a meeting with designers and developers actively involved, or something like balsamiq if you really must have a fancy tool (you idiot techie user, you..).
Getting from “neat” to “transparent” isn’t easy, because it requires us to be still, and simple. Creative professionals want to create, not philosophize, but fundamentally that’s exactly what Usability is all about: a philosophy of slowing down the feature cram-fest and spending a few more cycles iterating on simplification. We want to create the next hacker news worthy big thing with some esoteric and exceedingly complex technical feat that less than 1% of the users in the world will understand, but we need to learn to force ourselves to remember that the #1 search term in the world, 24/7/365 is the term “yahoo”. Your users don’t need analysis features that take 3 paragraphs of help documentation to explain, they just need “view top 10 xyz”.
“There aren’t stupid users, only stupid user interfaces.” – A great designer I know.
Oct 16 2012
Regularly losing hard drives? Try clean power.
A few years back, I was losing 1 to 2 hard drives a year, every year. I was purchasing quality drives (for consumer grade..), and it did not seem to matter if a drive was internal or external, the life span was just junk.
Your computer’s parts are highly sensitive pieces of equipment in terms of power. They operate correctly in a narrow range of voltage levels and wattage. Giving your hard drives or motherboard a bit too much juice or just a tad too little, and your hardware could become damaged.
There are three basic problems with power that you could encounter. I’ll bet you’ve only heard of these two:
- A surge or spike in power – this is when something goes wrong up the line from your house, such as a lightning strike nearby, and far too much power comes down the line to your house. This is protected for by a surge suppressor.
- A brownout or blackout – this is when power cuts off or dips enough below regular levels that your computer shuts off, potentially losing data while you were in the middle of something. We protect against this with a battery backup system (aka: ups system).
The third problem that you can encounter with power is voltage regulation issues. That is, when your voltage level at your socket isn’t quite what it should be during certain times. You can occasionally see a dip or spike in voltage levels around your house if you see your lights dim slightly or become brighter for a moment every time some large appliance (or, in our case, our A/C system) puts a huge burden on the power system as it powers up.
In my house, when my A/C kicks on, the voltage to my sockets drop or rise from 120v to something a few volts lower or higher, many times per day in the summer. Over time these “dirty power” fluctuations take their toll on your computer and other electronic equipment in your house, and in some cases ruin your equipment. The dirty power in my house and my apartments previous to the house were regularly eating my hard drives.
For voltage regulation issues, you need a voltage regulator. A voltage regulator is a device that maintains a constant voltage rate, in other words: clean power. It instantly dumps off excess power or boosts the power enough to maintain a constant clean power source that you otherwise would not have.
Most battery backup systems also have surge suppression built in, and some high end battery backup systems also have voltage regulators built in, but not all. Further, some high end power supplies for your computer may have some amount of voltage dip/spike tolerance built right in, but most do not, and you’re almost guaranteed that the $5 wall-wart power supply for your $50 external hard drive enclosure has no such protection built in at all.
The voltage regulator I bought was about $50. I bought this model: the APC LE1200. The voltage regulator has a plug for the wall, and 4 sockets on the back of the unit. It also has three LED indicators on the front of the unit that indicate dirty and clean power situations: high, low, and just right. The unit makes a satisfying (but not too loud) “click” sound when it jumps into compensation mode for high or low input. I can always tell my A/C is about to come on in a few seconds when I hear that click.
I haven’t lost a hard drive since I purchased my voltage regulator almost 4 years ago.
If you don’t have $50 to burn on a theory for your outlets feeding your computer, entertainment center, and so on, I would highly recommend buying a kill-a-watt for $20 and checking out your voltage levels around the house or apartment from time to time.
A kill-a-watt is an amazing device for learning about power consumption and dirty power. In voltage mode, you’ll be able to see your voltage drop from 120 to 118 when a dirty power event hits, and in the far more useful wattage modes you’ll be able to see precisely how many watts are drawn by your entertainment center in an instant. The kill-a-watt also features a KWH counter which is very useful to see usage over time, you simply leave the kill-a-watt between your outlet and your plug, and check it a few days later to see how many KWH of power your devices have eaten.
Oct 11 2012
The story of Freddie Kreuger, the brave three-legged cat.
This is the story of Freddie Kreuger, the cat who taught me what patience and love are, and what it means to be brave.
Freddie Kreuger and her 3 siblings were born in a neighbor’s backyard in May of 2010. The four kittens were born to a feral mother, who we mistakenly named “Mr. Bond” before we realized she was a she.
Mr Bond was named as such, because she was very sneaky and clearly feral and scared. She would only come to our back porch to eat in the dead of night, and only when other animals were not around.
One evening Mr Bond failed her mission, and a neighbor’s cat, named Cinderella, fell in love with her and gave her babies. Cinderella, a sweet male cat, was jokingly named Cinderella because we knew his owner was a little girl who we could picture dressing this super sweet orange tabby guy in dresses and having tea parties with.
A few weeks later, we started seeing kittens on the other side of our fence.
Our neighbors did not realize the kittens were there, because Mr Bond had sneakily hid them under their tool shed in their back yard, right between the tool shed and the fence. Every so often, we’d see a little kitten fight break out and one of the kittens would accidentally roll out under the fence into terrifying sunlight in our yard, then scramble back to safety.
My wife and I started the kittens out with some baby oatmeal, eventually switching to normal cat food when the time came. Even weeks later, the kittens were deathly afraid of direct sunlight and the big huge world in our backyard that was so much more vivid, and scary, than their 1 foot wide playground of darkness between the shed and the fence.
Even so, it became apparent, almost immediately, which kitten was the bravest.
Every day, little Freddie Kreuger would be the first to tentatively pop out from under the fence and have her meal. She’d eat first, and her siblings would wrestle with each other and avoid the sunlight until Freddie was done. Her siblings were not as brave.
Right from the start, my wife, Amanda, insisted that she would “train” the feral kittens, and be able to pet them and “make them” love her.
Amanda grew up in the high desert in California, a few hours north of L.A. When she was young, she had many adventures in the desert with her friends and family, constantly encouraged by her parents and her surroundings to be brave. Or maybe, maybe she was brave naturally. There’s a story of police men coming to her parents door because a neighbor across the street could hear baby Amanda screaming bloody murder. Amanda wasn’t afraid of the man, even as an infant.
By Contrast, I grew up very cautiously. Reared religiously as a child, learning far too late in life what “fun” was, and learning way too early what “regret” was. As such, I’ve always been a cautious, flippant, and not-so-brave person, like Freddie’s siblings. When my wife told me she’d “Make them” love her, I thought she was crazy, and laughed. Feral kittens are feral, I thought..
Then, this happened:
Amanda would sneak up to the fence ever so slowly and steal pets while a kitten was eating, and the kitten would perhaps pur for 2 seconds at the most, before realizing what was happening and again scrambling to the safety of darkness. Every time this happened I’d laugh to myself, relating with the kittens, it’s a big scary world out there, Amanda, you’re silly, I’d think.
For the next month, as the big vivid world became familiar, the kittens would steadily explore more and more of the backyard. We then moved the food bowl across the yard to the back porch, encouraging the kittens to come find it. I’ll never forget how funny it was to see the kittens inch ever-so-slowly across the shadowed part of the yards, stop at a sunlit area, and scramble like mad as fast as possible across the lighted strip to the next dark patch.
Amanda had already named all four of them. Freddie was named Freddie Kreuger because when she ate, she would eat alone. If any of her siblings came to eat at the same time, she would sink her claws in the top of their heads and either hold them down while she ate or push them away.
By the time the kittens got to the back porch, Freddie had her own bowl, and the other three would share another.
As time went one, the only male of the litter, Jerkface, turned into a feral thing like his mother. We still see him from time to time. The mostly-black kitten was found exploring in a neighbor’s yard, and now she lives a happy life inside that neighbor’s house. Freddie and her sister, Annie, stayed around and lived on our back porch.
Weeks turned into months, and all the while, Amanda kept trying to pet the kittens. Even at six months old, the only way you could pet Freddie was by touching her while she was face-down in food and not realizing what was going on.
Annie was the one that started proving Amanda right, and me.. wrong.
By the time Annie was 6 months old, she was a snuggle bug. Adorably cute to pet and play with, her feral upbringing morphing into this hilarious little habit where she’s cute and cuddly while you pet her, but as soon as you stop she swipes at you with claws, pulling your hand in for more pets.
Meanwhile, brave little Fred was at the same time extremely cautious, and scared. She always kept her distance.
Annie was the content one, basically living on the back porch. She only moved from the back porch when another cat, Blinkers, was giving her hell for being so pretty and desirable. Otherwise she was fine to stay in her little world, perfectly content with a one-back-yard-sized vivid world.
Freddie, on the other hand, was nothing but still. She was constantly exploring the back yard and beyond. We’d often find her standing on fences, walking along them for fun. She was also the first cat that discovered how to open the outside food bin, she was exceedingly clever.
In the Summer of 2011, Amanda and I went on a vacation. When we came back, we saw Annie and Blinkers, but not Fred. After 3 days of not seeing Fred, we told ourselves she must have finally joined her Mom and Jerkface’s feral cat gang, and we’d see her eventually.
4 or 5 days after we came home from vacation. We were watching T.V., and Amanda went downstairs to get a drink of water. It was late at night, pitch black outside, but Amanda could barely make out a kitty feeding on the porch. Amanda screamed with joy across the house, “Freddie’s back!”. I started down the stairs to see our little wallflower, when half way down, Amanda shrieked in the tone of voice I fear most in my life, she screamed “JASON, FREDDIE’S HURT, BAD, COME HERE, QUICK!”.
Freddie was eating, slowly, and she appeared to be dragging one of her legs. When pet, she tried to get away, but was clearly drained of all energy and very probably close to death, it was one of the most terrifying sights of my life.
We grabbed her, took her inside, and took her to the vet. The next 72 hours were a 72 I’ll never forget, as our entire lives felt upside-down. The vet kept her overnight, to clean her wounds and make her better. The vet discovered Fred was running a super-high fever and pumped her full of antibiotics, but her wounds were already heavily infected and her leg needed to be removed. She sent Fred home with us, telling us to keep a close watch on her, and schedule the surgery immediately.
Fred was in bad shape, really bad shape, and probably terrified. But she was also exceedingly brave. She lived in our bathroom for a couple of days until the surgery, and not once did she bite, hiss, or scratch at us.
A few days later, Fred had her surgery, and, amazingly, she got up and walked around the same day her leg was removed.
With only three legs, Fred was destined to become an indoor cat. She lived her first month of indoor life in our small guest bathroom, healing from her surgery.
Every day Amanda would come home from work, and sit in the bathroom with fred for hours at a time. And every day, Freddie would prove me right. She’d growl and hiss and even spit sometimes when you tried to touch her. All the while Amanda insisted just sitting in the same room with her would go a long way. Amanda was brave, and patient, and loving, which is more than I could say for myself.
In time, Freddie bravely stepped into another big world, 1500 sq feet of kitten bliss. She had two new roommates, our 10+ year old cats.
In some ways Freddie was karma for our youngest indoor cat. Amanda had one cat first, and the second one bothered the first one *all the time*, for life. When Fred entered the picture, Fred became our second cat’s bother, and the first one was left alone. Now our second cat doesn’t bother any kitties anymore, and smarts at the continual pain-in-the-ass of lifelong karma in the form of Fred.
When Fred was released from bathroom isolation, she was still obviously quite feral, standoffish and at times, a pain. She’d almost constantly have those saucer-size eyes and a look of mild-insanity combined with terrible fear, and you’d never know what she’d do next.
If anyone visited the house, Fred would instantly scramble into a little ledge hidden a few feet up in our fireplace, only to emerge hours later covered in soot. Over a period of months, Fred cleaned our fireplace, and nowadays she goes in and out of there without any soot emerging with her on the way out.
Fred’s been our little feral/crazy inside cat for a little more than a year now, and all the while, day after day, Amanda has been loving and patiently working with Freddie to “make her” love us. For many months Amanda continued doing this, all the while occasionally deflecting cold-hearted/critical noise from me about feral being feral and people/animals never changing their true nature.
For what seemed like eons of time, Fred was on my side, more or less. Amanda would pet her, or hell, every once in a while, I’d give it a try. Every time I tried, she’d systematically claw me, possibly bite me, and then scramble around me to safety somewhere (probably the fireplace). Every time I walked into a room, Fred’s eyes would go wide, no matter how far and safe from me she was, and she’d start her scramble to the other end of the house. She was a lost cause, I thought, and she was proving my point.
Still, Amanda, ever brave, peaceful, loving, and amazingly patient, would give fred a go every other night or so, whenever the kitten’s crazy eyes were ever so slightly not-as-crazy.
After a year of effort, earlier this summer, this happened:
Amanda “made” Freddie love her.
Seeing Freddie Kreuger, the kitten who stabbed siblings for food, rub her face on Amanda’s face is a memory I cherish and will not soon forget. It was nothing short of a miracle.
In recent months Fred is even so brave as to sleep on the bed with us, and stay in the same room without the insta-scramble of before. Fred is truly a brave and clever girl, learning against all odds to love and be loved, all thanks to Amanda’s amazing patience, care, and unending capacity for love.
It took some time for my stubborn soul to realize the lessons in Freddie’s story, but the parallels to Amanda’s and my’s relationship are too obvious to ignore. Like Amanda, Freddie was amazingly brave, willing to try anything once, including losing a leg. And yet, like me, Freddie was full of fear, distant and cautious of anything and everything. When Freddie hurt her leg, the moment only re-inforced my inner fear of the unknown, and doubly reinforced my caution about Amanda’s constant bravery.
Through Amanda’s loving care, and above all, her unending patience. Freddie learned to overcome her instinctual built-in fear, be brave, and venture into the unknown. For Fred, the unknown was being loved, and because she was brave, she now regularly experiences the other side of the unknown: the fantastic.
My siblings, friends, and family will not at all struggle to see the parallels of Freddie’s story and my own. I’ve always been, and perhaps always will be, a cautious grumbly stubborn gus jerkface who’s slow to warm and quick to spite. And yet, Amanda walked into my life about 7 years ago, and her effect on me has been as astonishing as that she has on Freddie, albeit, sadly, at a much slower rate, because after all, I am a stubborn jerkface.
The point is this: Venturing into the unknown is scary, but without bravery, you may not ever experience the fantastic. If you’re smart, and exceedingly lucky, like me, you’ll find a better half who can hold your hand, and occasionally drag you by it, kicking and screaming, into the unknown, toward the experiences and memories you will cherish.
Nowadays, Freddie Kreuger is a happy indoor cat. All the time, finding new experiences inside her 1500 sq foot wonderland.
She gets to see her sister from time to time, and one of the greatest moments of the year, every year, is the first day of Fall when we can turn the A/C off, and open the back door so Fred and her sister can catch up on their stories of adventure and bravery.
Oct 08 2012
Finally on GitHub, you should be too.
I’ve finally started migrating/publishing code on GitHub. Coder cowboy git code will be here: https://github.com/codercowboy
For starters, I’m migrating old World’s Worst Software code there, so I can retire WWS.
I highly recommend publishing your own open source code and projects on GitHub or SourceForge, or on a blog or website of your own.
You don’t need to be a coder to put something great out there (or even on GitHub), sharing your creative efforts with the world is almost always a good idea. Designers can share photoshop templates, writers can store and show their book writing/editing process, source control and sharing your efforts is truly for anyone.
When you share your efforts, you are doing the following: you’re saving other people time; you’re inspiring other people to share their own work; you’re building a portfolio of good deeds to cite on your resume; and you’re making the world a better place.
Git is a source control management (SCM) system, like Subversion (svn), ClearCase, Mercurial, Source Safe, and a dozen other such systems.
A source control system is a system that lets you store old and new versions of a file, and easily retrieve old versions of that file later. It’s basically a backup system, but it does so much more than backup. For example, source control systems can make it very easy for people to collaborate on a project, editing and changing files for a project together, from separate computers.
GitHub provides git repository hosting. They provide free hosting for open-source/publicly-accessible projects, and have reasonable paid hosting plans for private projects.
Git can take a little time to get used to, fortunately the official git website has some great tutorials to get you started. GitHub also has tutorials, as well. Though, I would say the easiest way to learn Git is from a friend or colleague. I’d highly recommend David Pratt’s quick tutorial, maybe someday I can con him into publishing something online.
If, like me, you’d rather just get-work-done and don’t care for command line source control tools unless absolutely necessary, I’d highly recommend downloading SourceTree, which is a free high-quality GUI Git client.
If you’re a Subversion die-hard, SourceForge is basically GitHub for svn, so you can share there instead if you prefer. Alternatively, many web hosts such as dreamhost (the host I use) now provide Subversion and/or Git hosting solutions.
I’d recommend Git over Subversion for a few reasons:
- Sourcetree is an amazing tool, on par with many of the paid clients for Subversion for non-windows users. (If you’re on windows, tortoisesvn is a pretty amazing free tool as well.)
- Git works offline, as the entire repository is cached on your local box. So you can commit piecemeal parts on your box, then “push” a bunch of commits home when you’re back online. Another major advantage of this offline feature is that you can almost-instantly revert changes or look at older changes without remote-server latency problems.
- Git merges better in many situations.
- Git allows you to work locally and micro-commit just like you would with Subversion, but you don’t actually have to push all of your work remote to work in git in small increments. If you want, you can even “squash” several commits into one.
- Git stores all repository information in a simple “.git” file at the top of your repository tree, so manually cleaning repository junk is as simple as deleting that one directory if you need to, which is even easier than a svn export.
There are other reasons users smarter than I would recommend Git, and there can be some confusing aspects to working in Git that will be foreign to someone familiar with svn, but the change will be worth it after only a little while.
A really great time to consider switching to Git is the next time you hit some merge hell with subversion where you *thought* subversion would just figure it out, but doesn’t. In many of those cases, Git does what subversion will not.
I’d recommend publishing your open source code to GitHub if you don’t already have a better place to store it. For me, pushing to github is something I’ve been meaning to do for a long while. It’s just easier to push to GitHub than manually zip and prep code pages here on my wordpress installation on coder cowboy.
A quick word about my inspiration to finally make the leap, today I saw a thread on KLOV about Seattle arcades, and someone posted a link to this amazing site: Pinball Map. Pinball Map’s home page mentions that the site is open source on Scott Wainstock’s GitHub page, which means maybe I or someone else can make an arcade maps page fairly easily in the future, all thanks to Scott. Also, you absolutely must check out Scott’s amazing iHodor app.
Sep 27 2012
Making objective-c blocks synchronous
Many IOS libraries require you to do things asynchronously. Some of the better libraries provide both asynchronous and synchronous models to work with, but some do not.
IOS’ ALAssetLibrary is a good example of a library providing only asynchronous processing. The ALAssetLibrary allows you to fetch images, videos, and the like from a user’s camera roll, and you’re required to work with things in blocks, using a forced asynchronous method. In most cases, you’ll want asynchronous processing when working with the ALAssetLibrary, but sometimes that may be overkill.
If you want to synchronously reason about a series of assets in the library, you’ll want to wrap the async block mess in something synchronous. For example, in my case, I wanted to synchronously check if asset URLS previously stored are still valid.
OmegaDelta’s How to wait for iOS methods with completion-blocks to finish shows you how to synchronously reason with ALAssetLibrary, or any other asynchronous block for that matter.
I’ve wrapped OmegaDelta’s example into a utility method that suits my specific use case in a utility called AssetURLChecker.
View or Download the AssetURLChecker utility code.
You can use this example code to easily wrap any asynchronous call into something synchronous, for simplified reasoning.
Careful though, synchronous code will not be as performant as asynchronous code, be sure you know what trade-off you’re making for your simplification.