Chip's Quips
A tiny spark of wit for a highly flammable world

Bullying starts with bull

May 31st, 2007 9:40:28 am pst by Sterling Camden

I’m not ready to declare meme-debt bankruptcy yet, so I’ll tackle another tag today.  Here’s one from Randy about bullying.  You’ll have to read his post first to know what the questions mean.

Am I a bad person, if I’m happy to know that the bully did not live a full life?

Randy was pleased to hear that someone who had bullied him died in an accident while they were both still young.  I can appreciate Randy’s sense of vindication and relief from further bullying.  But if you go on to say “he deserved it” then you’re saying that bullying merits a death penalty.  I don’t think I’d want to go quite that far.

Were you bullied as a kid?

Are you kidding?  If I had allowed anyone to bully me, I would not have been able to look my father in the eye.  He taught me how to fight when I was very small, often forcing me to continue until one of us drew blood.  I hated that, but it did prepare me for the playground.  My Dad always said, “Never start a fight — but always be the one to end it.”

One day early in my first grade year, a sixth grader decided to pick on me, and started punching me in the arm.  Without passion or anger, I followed my father’s advice and gave him a swift one to the nose.  He ran off, and I was never bothered on the playground again.  Naturally, someone reported this event to my teacher, who could not understand the logic of my actions, and punished me (with a spanking, ironically).  Very conflicted, I related all of this to my father that night.  He expounded a long and thorough explanation about how society often punishes you for doing what you must, replete with examples from his Air Force career.  Then he said he hoped that I had endured my spanking proudly, and congratulated me for standing up for myself.  My Dad should have been born in ancient Sparta.

Was bullying as rampant in your schools, as they were in mine?

Bullying was common, especially on the playground and the buses — but I don’t think it was as pervasive as Randy described.  I often felt compelled to intervene on behalf of those who wouldn’t stick up for themselves.  In those cases, it never came to blows — a well-aimed “pick on someone your own size” usually answered the purpose.

What happened to the bullies in your school?

Despite the fact that I was immediately reported for defending myself, nobody ever reported bullying to teachers.  Most were afraid that they would become more attractive targets if they did.  For me, I didn’t think telling teachers would do any good, judging from the justice I had received at their hands.

So instead, a silent culture developed — much like in a prison.  The best way to divert the unwanted attentions of bullies was to reveal them for the cowards that they were.  A satirical comment to others in their hearing about how they needed to pick on the weak would usually do the trick — but you always had to be willing to back that up with physical measures if it had the opposite effect.

But times have changed.  I don’t advise my children to get physical.  I do advise them to tell their teachers.  I believe that schools handle bullying more thoroughly and justly than they did when I was young. I hope to hell I’m not mistaken.

Was it just the boys, or did the girls bully too?

The girls were often worse — to other girls.  It’s a good thing that girls back then hardly ever picked on boys, because I would never have been able to use even the threat of violence as a defense.  My father taught me that striking a woman for any cause was the lowest form of low.  To even imply that you might do so would be a blemish on yoru character that could never be removed.

Sometimes it’s hard to realize just how divided the sexes were in those days.  The girls managed their own culture separately from the boys, for the most part.  I can recall only one time where I stepped in to reprove a girl my age for picking on someone smaller.  That happened on the school bus, and the only tool I could employ was to shame her.  Luckily, I’ve always had a way with words.

Were you the bully?

No.  I never picked a fight or pushed people around.  Even in defending myself, my conscience was always stung by my Baptist upbringing and Jesus’ command to “turn the other cheek”.  In fact, I became a radical religious pacifist by age 15 — abrogating even self-defense, much to the chagrin of my father – but somehow I had already established myself in the social hierarchy at school such that I never had to test my commitment to that creed.

I’ve never understood the mind that needs to subjugate others to its will, against theirs.  People are generally enough trouble as it is — why would you want to churn up resentment against yourself and make things worse?  I don’t want to get all psychoanalytic on you, but I can only think that a bully must have no life worth living – or they wouldn’t need that type of diversion.  So back to your first question, Randy — maybe his death was merciful.

I’d like to tag a few people who came to mind as imagined readers while I was writing this post: Shelley, ShelleyJoseph, apotheon, JessicaTDavid, Kent, Doug, and Cooper (sorry for the quick re-tag).  Tell us about your experiences with bullies in school.  As always, anyone else who would like to participate, feel free and I’ll give you some linkage.  I’d really like to tag Kathy, but I don’t think she’d answer.

Posted in Tempus fugit | 8 Comments » RSS 2.0

Chipping the web – black and white

May 30th, 2007 4:38:49 pm pst by Sterling Camden

Chipping the web

The Junkers Ju 87Stuka” dive bomber had a wind-powered siren under its nose, in order to frighten its victims.  Junkers referred to this siren as the Trumpets of Jericho.

Cooper (one of my faves) uses the tag cloud widget for WordPress.

Apotheon provides a history of Windows desktop OSes from the geek perspective.  I’ve had the joy of programming in C to target all of them, from Windows 3.11 to Vista.

Paul Fenton developed an API for creating PDF files in Synergy/DE.  You can download a demo copy here.

TDavid took advantage of the clear, sunny day to give us a great view of Mt. Rainier.

Pseudocoded.  $brain->viewSource().  Life as written in javascript (thanks, Joseph). 

Aki responded to my tag on the Random 8 meme.

Posted in Share the Love | 5 Comments » RSS 2.0

Thermometer races

May 30th, 2007 9:10:39 am pst by Sterling Camden

Vista sidebar showing warmer here than in CAHere’s an unusual sight — at 10AM on May 30, it’s 7 degrees warmer here on Bainbridge Island than it is down in California. Sunny here, too.

Shhh… don’t tell the Californians — even more of them will want to migrate here. The official myth is “it always rains in Seattle.”

Of course, by mid-afternoon it will be a bit more toasty down in Rancho, while we enjoy temperatures just around 80 degrees — which is unseasonably hot for Bainbridge.

Posted in Get a Grip | 1 Comment » RSS 2.0

Chipping the web – Trumpets of Jericho

May 29th, 2007 11:55:19 am pst by Sterling Camden

Chipping the webBesides ditch, another slang term for relieving oneself of something is 86.

Evolution of a Python Programmer (thanks, Assaf).  The Windows and Enterprise versions were so true they made me laugh and cry at the same time.

Tish, Shelley, and Randy responded to my tag on the What’s Your Web 2.0 meme.

Gabrielle wants to send her Dell to Hell – and she wants to enlist your help.  I’m glad I went with HP instead of Dell for my last purchase.  I was partly influenced by an earlier post from Kent — whom I consider a friend as well, although we’ve never met in meatspace (his point exactly – I’ll have to visit some of the others Kent included in that list.  Social network indeed).

I released a new version of the keywords-tagcloud widget for WordPress.  This one improves font sizing options and passes XHTML 1.0 strict DTD all at once.

Roxzen linked to my post on installing Apache and IIS on the same system.

I recently reconnected with a former college roomate: Darrell Grizzle.  Looks like we took quite different paths in life, but eventually they crossed again on the web.  Mutually subscribed.

Posted in Share the Love | 5 Comments » RSS 2.0

Random 8

May 29th, 2007 10:22:55 am pst by Sterling Camden

Catching up on meme-tags, here’s one I owe to Tish:

The Rules:

  • Players start with 8 random facts about themselves.
  • Those who are tagged should post these rules and their 8 random facts.
  • Players should tag eight other people and notify them that they have been tagged.

Eight random facts about yours truly:

  1. I like food that’s so spicy that most people can’t eat it, and some folks can’t even stand to be nearby while it’s cooking.
  2. As a US Air Force brat born in West Germany, I nearly reached the East German border alone one day when my parents weren’t watching.
  3. I’ve lived in Germany, New York, Texas, Maryland, Virginia, Oklahoma, Florida, California, and Washington State in roughly that order.  I’ve never lived in any one home for longer than eight years.
  4. I love to travel – by plane is OK, but driving is far better.  Unfortunately, circumstances keep me at home most of the time.
  5. I fell madly in love with a girl when we were both in second grade.  She rejected my advances (go figure), and I never fully got over it.  I’ve been far too careful with my heart ever since, although I’ve rarely lacked someone to love throughout my adult life.
  6. When I was in the third grade, I was on a live local TV quiz show.  As part of the introductions, the emcee asked me what was my favorite game.  I replied, “Poker.”
  7. Music for me can be almost any genre, as long as the creator(s) put everything they have into it – no holding something back for later.  Each piece of music should be written as if it were their last.
  8. I’d like to be able to say that I live each day as if it were my last, but that wouldn’t be true.  I’m often sulky, keep things to myself, and ignore my loved ones.  Sometimes I even sincerely wish for death.  Then at other times when enjoying life to the point of feeling a buzz in my scalp, I wonder how it was possible that I could have ever been possessed of such weltschmerz.  It makes me believe that my brain is a highly volatile chemical compound over which I have less control than I’d like.

Hmm.  Seems like some of these could be developed into full-blown posts of their own.

Now for 8 random tags:

8.times { |n| puts(blogroll[Integer(rand * blogroll.length)]) }

Gabrielle
Michael
Aki
Diogenes
Scott
Darrell
Cooper
Danielle

Posted in Out of Nowhere | 13 Comments » RSS 2.0

Homeward

May 25th, 2007 2:46:20 pm pst by Sterling Camden

Written on the plane last night

I’m seated by the window of a Boeing 737-400 on our way back to the Boeing mother-nest, Seattle.  The SPC went very well, I think.  The workshops, especially those presented by Steve Ives, did justice to what is without any hype the most significant release in the 30+ year history of the Synergy/DE product line.

As for me, I avoided getting hammered the night before my presentation. Back in the day, I could party all night with customers and give three or four presentations the next day on four hours of sleep and some Tylenol, but for better or worse I’ve gotten unused to that behavior in my advancing age.   I got to bed rather early that night, and I prepared better for that session than any I have ever presented before.  So I had no excuse for a bad performance other than by own ineptitude — but I think it went off well anyway.

I also had the opportunity to say a few words in honor of Ken Lidster, my mentor, who is retiring this year.  Ken was one of the two original creators of Synergy/DE (then called DBL), and his understanding of programming language theory and design continue to inspire me.  I’m hoping that Ken will find it difficult to stay uninvolved in the language, and that I’ll have plenty of opportunities to work with him in the future.

Besides Ken, Inge King is also retiring this year.  She’s my sales representative (I’m also a customer of Synergex), but more than that she’s a great friend of both my wife and I.  But I expect to see even more of her and her husband in the future, as they have a daughter and grandchildren living in the Seattle area.

Liz Marmins interviewed me on tape regarding Synergy/DE version 9 and the SPC.  No doubt they’ll edit out my repetitious babbling and make me look like I know what I’m saying.  When it gets posted on their web site, I’ll link to it — no matter how embarassing it turns out to be.  I’m such an exhibitionist.

It was good to reconnect with so many of these people after all these years, but I’m glad to be heading home.  After the two-hour flight, I’ll catch a ride  to downtown Seattle where I’ll take the 35-minute ferry ride to Bainbridge.  There I’ll catch a cab home — probably after midnight.  I’m hoping that I was missed and will be appreciated, but I fear that revenge may be in the cards instead.  We’ll see.  Maybe a combination.

Posted in Get a Grip | 2 Comments » RSS 2.0

Using OO in Business Applications

May 23rd, 2007 11:31:16 pm pst by Sterling Camden

The day before yesterday I presented on OOP in Synergy/DE version 9.  Here’s essentially what I said:

What is OO?

“OO” is the sound people are supposed to make when they behold your beautiful object-oriented code – but in many cases it comes out “OOPs” instead.  In this presentation I hope to provide some insights on how to evoke the desired exclamation.

Object Orientation is both a design philosophy and a set of programming language features to support it.  Languages that provide the latter are often called Object-Oriented Programming (OOP) languages.  Object Orientation’s primary goal: to make the code describe the real-world objects involved in the application, and their interactions and relationships, thereby reducing the translation between business rules and computer instructions.

How does this apply to business applications?

Well, you could begin to model your business processes in code.  Given an order entry system, for instance, you might make “Order” a class that contains all the data related to an order and the methods to do what an order needs to do.  A class defines a type of object.  So, an Order will contain some general information about an order and a collection of line items, along with methods to retrieve, commit, and maybe validate that data.

You might then find that sales orders and purchase orders have a lot in common, but differ somewhat.  So, you make both the SalesOrder and PurchaseOrder class “extend” the Order class, adding data and procedures that are unique to each, and possibly overriding some behaviors of the base Order class.

As you apply this principle to more areas of your application, you might start to see patterns emerge.  A lot of what you do to store, retrieve, update, delete, and list orders also applies to other types of tables.  You could then make the Order class extend some even more generic class that provides methods and data for manipulating any type of discrete data item.  If you’re familiar with Design Patterns, you might want to follow the Model-View-Controller pattern and call this class a Model.  Then you could create a View class which represents any type of user interface for the data, and extend that for specific ways of looking at certain types of data (input windows, lists, etc.).  Finally, a Controller class could be used to orchestrate the overall behavior of an application, and extended to create specific types of applications.

“Whoa!  You’re talking about a complete rewrite!”  I hear you cry.

You’re right — that’s a bad idea.  Any of you out there who have ever attempted it can testify that for any application that has taken many years to mature, a complete architectural overhaul is not in the cards.  You simply cannot rewrite from scratch and have any product ready to ship before you go out of business.  You need to incrementally incorporate newer methods and technologies in a way that allows you to continue to release your product on a regular basis.  And you don’t want that pavement-to-dirt feeling when your user navigates between different parts of your application.

So, I expect that most of you will begin using objects without even really thinking about OOP.  First, you’ll start consuming some of the supplied classes.  The new dynamic Array class might prove handy, with which you can size an array at runtime without having to use the obtuse ^m syntax.  You’ll be using classes and not even know it.

Or, quite likely, you’ll see the new try-catch-finally structured exception handling in Synergy 9 and say to yourself, “Self, you’ve been looking for something to replace that goto-by-any-other-name-still-stinks onerror statement for ages.  Time to learn something new.”  As soon as you catch your first exception, you’ll have an Exception object in your hot little hands.  You’ll see how naturally you can access the information contained therein using the new object syntax.  Maybe you’ll create your own derived class of exception in order to add your own custom information about an error encountered in your application.  That might be your very first class definition.

Then you’ll start to discover more of the useful features of objects.  For instance, scope and destructors.  How many times have you wrestled with problems related to cleaning up resources when they’re no longer needed?  The UI Toolkit provides the environment concept to release all resources that were allocated in an environment when that environment level is exited, which works fine for many cases.  But in more complex applications you often find that you need to preserve some resources across environment-level bounds.  So, you promote those to global, but then you have to remember to clean them up when you’re done.  Wouldn’t it be nice if the resource would just get cleaned up automatically as soon as you lose all references to it?  That’s what you can do with a class.

As you begin to think more in terms of objects, it will become more natural for you to create classes that model other aspects of your application.  But don’t rush yourself.  And don’t massively redesign, unless you’ve got a lot of extra time on your hands.

General principles

A class should reflect a single type of object.  That means it’s a noun — some actor within your application.  Without referring to existing code, try to describe, in natural language, how your application works from the user’s perspective.  Whenever you encounter a noun, that’s a candidate for a class.

Methods are verbs that describe some action that a class of object can perform, on other objects or on itself (or intransitively).  If the name of the method doesn’t involve a discrete action, then maybe it needs to be thought out differently.

Properties can be seen as adjectives that describe the object, or members that compose it.  If your class has a property that you can’t think of in one of these ways, perhaps it shouldn’t be a property of this class.

A class should extend another class if it passes the “is a” test.  A Bugatti is a car, so Bugatti extends the class of cars (does it ever – this baby can do 253 mph.  Why from here to Los Angeles — of course, you couldn’t do 253 mph all the way to Los Angeles, because there’s always some jerk hogging the left lane at about 180).  A Bugatti is not a chassis.  A Bugatti contains a chassis, it isn’t derived from it.  That distinction trips up class designers all the time.  For instance, given the Model class we discussed earlier (from which an Order is derived), does it extend or contain a database table?

Often you can get away with inaccurate inheritance models for a while.  But eventually, the practice of deriving classes from things that they logically contain causes conflicts, because you end up wanting to derive them from more than one ancestor class.  Use the “is a” test to avoid that problem.

Signs you should have contained:

–You feel the need for multiple inheritance

–You add way too many methods

–You don’t override any virtual methods

Sign you should have inherited:

–You replicate all of the same methods and just forwards or duplicates them

What else to avoid

As Ken Lidster has said to me on many occasions, OO rewards a good design handsomely, but punishes a bad design to the end of your days.  Lets discuss some common pitfalls.

In Execution in the Kingdom of Nouns, Steve Yegge describes how Java’s (and C#’s) insistence on requiring all functions to belong to a class causes programmers to manufacture many needless nouns in order to perform any activity.  You don’t have to fall into that trap in Synergy/DE, because Synergy/DE provides stand-alone functions.  So if your description of a process begins with a verb, just make it a function.  Don’t give it an actor if it doesn’t need one.

Classes whose names include the words “manager”, “broker”, “locator”, or any other verbal noun, should be suspected.  If the noun’s purpose in life is merely to perform some action, then that should be a function instead of a class.

What about singleton classes?  Singleton classes are only instantiated once.  Sometimes that means that they’re really just a set of global data and functions disguised as a class.  Take, for instance, an Application object.  Java and C# virtually require classes like this because otherwise you can’t get anything done.  Because these languages require that you have a class to contain any function, you typically pick yourself up by your bootstraps by creating an Application object that has, at least, some sort of ”run” method.  You don’t need that in Synergy/DE, unless it’s useful.  Singleton classes can be useful for encapsulating related data and functions together, creating derivations of similar applications, and for avoiding global naming conflicts — but be careful not to let them become big, miscellaneous messes or just the equivalent of namespaces.

In OOP and the death of modularity, Chad Perrin notices a trend in object-oriented programming in which classes become coupled with one another, reducing modularity.  Sometimes, by thinking in terms of objects rather than starting with processes, you can bundle too much functionality together into one class.  Interfacing with such a complex class soon requires complex knowledge about how that class operates, creating unnecessary dependencies.  By contrast, keeping the design simple and atomic requires less intimate knowledge and maximizes reusability.

Geek24 provides a series of humorous programming quips, including: ”The great thing about Object Oriented code is that it can make small, simple problems look like large, complex ones.”

Unfortunately, that often proves true.  But you can avoid doing that, and make OOP work for you instead:

Avoid creating overly ornate inheritance hierarchies.  Focus on the abstractions that you use in the business model, and ignore the rest.  In real life, we always ignore certain layers of abstraction.  It’s useful, for instance, to talk about an overnight envelope as a type of shipment, but we rarely need to state the fact that all shipments are types of molecular collections.  That’s not the level on which we operate.  Likewise within an object hierarchy, don’t bother including ancestor classes that no one will ever need.  Make use of inheritance where it makes sense.

Rule of thumb: simplify.  If adding a class simplifies the code and makes it easier to understand and manipulate, that’s a good design.  Oooo.  If it complicates the code and adds unnecessary layers and dependencies, you were better not to use objects at all.  OOPS!  The beauty of Synergy/DE is that it lets you decide.

Posted in Coding...OK?, Geek Meditations, Wildly popular | 6 Comments » RSS 2.0

Still smiling

May 21st, 2007 8:44:51 pm pst by Sterling Camden

MeThis little icon of yours truly has become my online visual proxy in a number of fora (that’s plural of “forum” for the Latinally challenged), including Technorati, TechRepublic, MyBloglog, BlogCatalog, Gravatar, and who knows where else that I’ve forgotten that I dropped my pixels. But have you ever wondered (oh to imagine my vast following of groupies) whence cometh said image? Well, wonder no more!  Behold, the full image from which this icon was clipped.

 

I’m standing on the beach belonging to our former home on Rich Passage.  This was the last day that we visited that beach, being under contract for sale.  It was a bittersweet day.  We loved that place — at low tide we had about 100 feet of beach from our house to the ocean, and at high tide you could cast a line from our upper deck and hit the water.

Sometimes at night the deer would walk down to the beach and lick the salt off the rocks.  I often miss the sound of the waves breaking on the shore while I was drifting off to sleep.

Why did we leave there?  The lot was a grand 0.19 acres, and half of that was under water at high tide.  Our children had no place to play.  The road, which was within twenty feet of our front door, was getting busier every day.  And every available square yard of land around us was being built up with grand houses overlooking the Passage and destroying our peace.

Our children needed a place to ride bicycles.  Our fifteen-year-old dog passed away, and we wanted to get a new puppy (which turned out to be Halley), but we had no room for an active dog to run around.

So, we sold our waterfront dream home and bought a place on 2.35 acres surrounded by huge cedars and hemlocks.  We can’t see our next door neighbors.  Our kids can ride their bikes for hours and never leave our property.  Our dog has a huge run.

But sometimes I miss the water.  Early every morning I would walk along the shore.  On a clear day, I would pause to gaze at Mount Rainer.  I took this picture on one such walk.

This was about a mile from our house.  Another quarter mile brought me to the Treehouse Cafe, run by my good friend Arnie.  He was just getting started in his own business there when I first visited.  Now he’s booming — rented more space in Linwood Center, installed taps.  He’s fathered two kids since then and hardly shows up on weekends.  I’m happy for his success.

Many times while the sky was still black I’d show up at his doorstep before opening time, but he’d let me in and pour me a Triple Americano Grande with cream.  He and I would philosophize while I sipped the strong brew and he prepared for the day’s business.

One day in mid-winter, the cold rain beat upon me as I advanced along the shore in the darkness.  But the lights at the Treehouse ahead promised dry air and hot coffee.  I lurched through the door and threw the hood off my head in the warmth.  Arnie greeted me and introduced me to Bill, who was seated at a table, sipping a cup and eating a bagel. 

Bill was a retired trucker from Arlington, Massachusetts (that’s pronounced AH-lingten Mass) who took a part-time job delivering the bagels from Port Townsend.  The Treehouse was his southernmost delivery, so he would relax with a cup of coffee and a bite of something before heading back home.  He greeted me with a big handshake and asked me to sit down at the table with him.  We hit it off instantly.

At one pause in the conversation, Bill sighed.  “Have you ever had to deal with the approaching death of a pet?”  I had — just a few months before, our beloved fifteen-year-old Samoyed had passed away in her sleep.  Bill revealed that his seventeen-year-old dog was on his last legs.  We got to talking about dogs of ours that had gone before.

“The last time this happened, I swore I’d never own another, ” Bill said.  “After that one died, you’d never want to see a sorrier sight than this rough old trucker driving his big rig down the turnpike and blubbering like a baby.”

“I know how you feel, ” I replied.  “You can stand beside the casket of your own parent whom you mourn bitterly, and nevertheless be aware of their faults in life — as much as you love them.  But a dog only ever wants to please its master.

Once when I was a sapling Southern Baptist, I asked my great-grandmother the question that was always difficult for other church members: “Do dogs go to heaven?”

She replied, “Well, son — of the dogs I have known, if they didn’t deserve heaven, then no people do.”

Bill slapped his big palm on the heavy oak table and declared “Isn’t that the truth!”  We talked for an hour or more on many subjects.  After that, Friday conversations with Bill became a regular event.

When we were preparing to move, I told Bill that my new home was too far away to make it to the Treehouse even once a week.  We traded phone numbers and promised to keep in touch. 

But neither of us ever called.  I think we both knew that the same ongoing conversation couldn’t be transplanted out of the Treehouse, away from the big oak table, two cups of coffee, and Arnie cleaning up behind the counter, getting ready to open for the day.

Posted in Tempus fugit | 7 Comments » RSS 2.0

En route…

May 21st, 2007 5:26:50 am pst by Sterling Camden

… to Sacramento for the SPC.  I’m sitting on the Bainbridge-Seattle Ferry using Verizon EVDO to connect at a blinding 34.1 kbps.  It’s almost as good as dial-up!  Too bad I couldn’t get a window seat — the extended antenna might have made a difference.  I’m surprised that Outlook 2007 even manages to send/receive.  Normally it would time out at this speed.

More to come later today.  Right now I need to shut down and pack up before we get into port.  Then I’ll limo it to the airport (it’s actually cheaper than taking a cab).  Once there and checked in, I’ll probably be back online before my flight.

Talk to you then!

Posted in Geek Meditations | 1 Comment » RSS 2.0

Chipping the web – ditch

May 16th, 2007 8:03:01 am pst by Sterling Camden

Chipping the web

The number 85 (decimal) can be represented in binary in a single byte of alternating bits: 01010101.  One other number fits that category — 170 (10101010) — by shifting the bits left (i.e., multiplying by 2).

Religion’s rules of inference (thanks, Assaf).  I’ve been on both sides of this type of debate at different points in my life, and I don’t think my changes in point of view had anything to do with logic — it’s more a matter of taste.  The discussion in the comments waxes lively and thought-provoking.

Can I get an Amen?

Can it get any worse?  (thanks, apotheon)

“Give a man a fish… teach a man to fish…” but make sure everyone has to pay you for their Fish(tm).

Posted in Share the Love | 1 Comment » RSS 2.0