How Apple Will Lose the Mobile Computing Race

by Stephen M. Redd 9. May 2010 00:41

bad appleI've heard several people say that "Apple is the new Microsoft". These people are wrong; dead wrong.

Apple is the new Apple. They've not changed in the last 20 years, not even a little bit.

Google is the new Microsoft, and Apple is going to lose the mobile device market to Google the exact same way it lost the desktop market to Microsoft 20 years ago.

How is this going to happen? First you have to know the history.

Let me tell you a little story...

Back in the 80's there were two companies; Apple and Microsoft. Suddenly Apple comes out with a magic new product way ahead of the competition. Enter the Macintosh. The Mac was guaranteed to change personal computing forever, and everyone knew it before the Mac even hit the shelves. There was media hype and gobs of nerd excitement well in advance of the Mac's debut. And the Mac delivered spectacularly on all of its promises.

But Apple insisted on near complete control of the entire platform; hardware and soft. They were terrified that someone else might come along and spoil the pure awesome.

Apple used deliberately unusual hardware, and controlled it with an iron fist. Only Apple and a few licensees were allowed to make Mac hardware. The 3rd party accessory market was as restricted as Apple could make it too.

Programmers could make applications for the Mac of course, but Apple maintained tight control over how applications used the hardware and interacted with the OS. Developers played in the sandbox, but it was Apple and select partners that created the majority of useful Mac software.

Apple was also territorial about who could sell their precious. Macs were distributed mostly through select retail partners. Anyone else that wanted to sell a Mac paid full retail price --which made it very hard to compete with Apple's preferred retailers.

Because Apple had tight control end-to-end, the Mac was a very stable and reliable computer. Most of the software was also high quality, which made the Mac a joy to use.

On the other side, you had Microsoft. They weren't really a hardware company though. They concentrated on making a decent operating system and left the hardware to other companies that specialized in that sort of thing.

There was a lot of compromise and cooperation between Microsoft and the hardware makers though, of which there were many. They created a large market with a wide range of different systems, each with different capabilities, quality, and prices. Microsoft just did what they could to make sure that Windows worked reasonably well with whatever crazy-ass hardware the other guys came up with.

Microsoft made a decent enough OS, but what they did really well was make programming languages, compilers, and development tools --all that stuff you need in order to make software for the regular folks. Microsoft made it easy to develop applications for Windows, and they stayed out of the way as much as possible. They didn't put up a fight when developers released software to compete with Microsoft's own, and they didn't stop developers from extending the operating system itself in new and unusual directions.

Microsoft was later than Apple in coming out with a good GUI based OS. Windows wasn't too pretty nor much fun compared to the Mac; especially at first. But PCs were cheaper, and came in a variety that fit different people's needs and budgets. The most important thing was that a Windows PC could do everything that a Mac could, though not always with the elegance of the Mac. People often preferred a Mac, but they could (and did) settle for PCs instead.

In the end, what killed Apple the first time around was Apple's own paranoia. All by itself, Apple couldn't evolve the Mac hardware nor the OS fast enough to keep up with a young and rapidly changing personal computer market.

All Microsoft had to do was try and keep up while other companies raced forward with new ideas.

Now jump forward 20 years.

There are two companies; Apple and Google. Suddenly Apple comes out with a magic new product way ahead of the competition. Enter the iPhone. The iPhone was guaranteed to change mobile computing forever, and everyone knew it before the iPhone even hit the shelves. There was media hype and gobs of nerd excitement well in advance of the iPhone's debut; and the iPhone delivered spectacularly on all of its promises.

But Apple insists on near complete control of the entire platform; hardware and soft. They are terrified that someone else might come along and spoil the pure awesome.

Apple uses deliberately unusual hardware, and they control it with an iron fist. Only apple is allowed to make iPhones, and the 3rd party accessory market is as restricted as Apple can make it.

Programmers can (and do) make applications for the iPhone of course, but Apple maintains near complete control over how those applications use the hardware and interact with the OS. Developers are allowed to play in the sandbox only if they use the specific tools that apple permits. Apple and a few select partners make the majority of the useful iPhone apps. Most developers that make apps to competes with Apple's own are denied access to the app store; which is the only way users can obtain apps for the iPhone. Apple will even deny an app if they just don't like what it does.

Apple is territorial about who sells their precious. The iPhone is (currently) only distributed through one network in the U.S., and apple exerts enormous control over how that network does business. AT&T had to wait to roll out 3G services until there was an iPhone that also supported it. There were other mobile phones sold by AT&T that had  3G support as much as a full year before, and AT&T had deployed the network hardware long before Apple's 3G iPhone came out.

Because Apple is in such tight control, the iPhone is a very stable and reliable smartphone. Most of the software is also of high quality, which makes the iPhone a joy to use.

On the other side, you have Google. They aren't really a hardware company though. They make a good mobile operating system, but have left most of the hardware in the hands of companies that specialized in that sort of thing.

There is a lot of compromise and cooperation between Google and the many hardware makers. They have created large market with a wide range of different Android phones with different capabilities, quality, and price. Google just does what it can to make sure the Android OS works reasonably well with whatever crazy-ass hardware the other guys come up with.

Google makes a good mobile OS, but what they do really well is provide cloud services --services developers can use to make useful mobile software for the regular folks. Google makes it easy to build applications for Android, and supply much of the cloud services free of charge. They stay out of the way as much as possible, but give developers a way to distribute software through a centralized app store, with very few restrictions. Apps can also be obtained through independent channels too. Google doesn't put up a fight when developers release software to compete with Google's own products, and they don't stop developers from extending the Android OS in new and unusual directions.

Google was later than Apple with a smartphone. Android isn't quite as pretty compared to the iPhone; though it is rapidly getting there. Android phones are cheaper, available for nearly any network, and come in a wide variety of forms to fit different people's needs and budgets. And the important thing is that an Android Phone can do anything that an iPhone can; sometimes even with the same elegance as the iPhone. People often prefer the iPhone, but they can (and do) settle for Android phones instead.

In the end, what will kill Apple the second time around is Apple's own paranoia. All by itself, Apple cannot evolve the iPhone fast enough to keep up a young and rapidly changing mobile computing market. Their treatment of developers is pushing them to other platforms fast.

All Google has to do is try and keep up while other hardware and software companies race forward with new ideas.

This same exact pattern of behavior is repeated with the new iPad.

The situations are so similar it is almost insane that Apple can't see their own doom coming.

There are some major differences between now and 20 years ago, but none of them bode well for Apple.

Google is in a much more competitive position than Microsoft was 20 years ago, and Android is a much better product to pit against the iPhone than Windows was against the Mac.

Perhaps the biggest difference between now and then though is that Apple wasn't crapping all over their software developers back then. Apple did limit developers in some ways, but never in the arrogant and insulting way they do now... and especially not through any legal or contract trickery like the iPhone developer agreement.

Apple is also much more blatantly motivated by pure monetary greed. Twenty years ago, it felt like the Mac more about a vision of excellence, making a better tomorrow, being different, and enabling new and wonderful possibilities. The iPhone today though is clearly just a cash cow. Apple's every legal and marketing move is so transparently profit motivated that it doesn't even fool kindergarteners.

There is no greater vision behind the iPhone like there was the Mac; behind the iPhone it's just dollar signs, abused developers, and shackled customers. 

Tags: , ,

Filed Under: Rants & Stupidity

ADO.NET Entity Framework: Impressive! Powerful! Useless!

by Stephen M. Redd 22. August 2008 18:57

The new Microsoft Entity Framework is the latest in a long line of very impressive, yet tragic failures in Microsoft's data access strategy...

The basics of ADO.NET are great. SqlCommand, SqlConnection and their relatives for other platforms... awesome. But almost every single version of ADO.NET has failed when it comes to useful higher level abstractions. To be sure, they each demo well and they each have uses with simple applications (like those you'd be shown a demo of).

But whenever it comes to complex applications, the abstractions tend to become cumbersome, restrictive, an inflexible. The result is that most serious application end up using 3rd party frameworks or custom abstraction layers instead and under-the-hood they tend to stick to the basic ADO.NET SqlConnections and SqlCommands to do the dirty work.

In .NET 1.x it was DataSets and SqlAdapters. In .NET 2.x it was DataTables and TableAdapters. And now we have the ADO.NET Entity Framework (EF).

I had high hopes for EF. MS had clearly recognized that a radical new approach would be needed if they were to achieve a useful abstraction without having to re-invent the same wheel over and over again every few years. They had also set some pretty good goals in terms of making EF useful in support of other data stores outside the classic relational database.

Sadly, what has been delivered in the 1.x version of EF is hopelessly crippled by the deliberate lack of implicit lazy loading.

Here is an example of what this means. Assume we have two logical EF entities that map more-or-less directly to physical tables in a database. One is the Order object and the other the Customer. These entities have a navigation relationship between each other (which is analogous to the physical database's foreign key).

If you get a reference to an Order object it will have a property called Customer. This property is how you'd navigate the relationship between the entities.

So you'd expect that if you look at MyOrder.Customer you'd get back a reference to an instance of the Customer entity... But you would be fucking wrong!

The Customer property on the instance of Order may not have been fetched from the database automatically when you obtained your reference to the Order...

Instead of implicit lazy loading, EF has "Deferred Loading"... or if you prefer you can call it "Explicit Lazy Loading". The idea is that you can check to see if the Customer has been loaded for an Order, and if not then you can explicitly load it when and if you need it. But it will not automatically load the data for these properties and related entities unless you explicitly tell the framework to do so (which is unlike most ORM frameworks, LINQ to SQL, etc.).

What happens in real applications is that you never know what has and has not been loaded. So your code is chock-full of bullshit like this:

if(!someOrder.CustomerReference.IsLoaded)
{
	someOrder.CustomerReference.Load();
}
string customerLastName = someOrder.Customer.LastName;

This allows you to do what you need to be doing in your code, but the price is that you HAVE to do this all over the fucking place... every time you want to access a property that traverses a relationship. You end up with more checks for data than you do data in the first place.

Even worse than that though, when you code something to use your EF model, now you now have to somehow magically "know" which properties on your entities are going to traverse a relationship and which don't.

If you know in advance that you are going need the related data later on, then when you fetch your entity you can a technique known as "Eager Loading" to tell EF to go ahead and load up the related data in advance.

This looks like this:

var x = entities.Orders.Include("Customer");

Again, this allows you to do what needs doing, but if you are making the fetched order entity available to other classes (like as a return value from a public method)... then the caller isn't going to know if you pre-loaded the relationships or not... so they'll still have to do the whole "IsLoaded" anti-tard checking shit anyway.

In his response to a nasty online petition called the "Vote of No Confidence", Tim Mallalieu defended the lack of implicit lazy loading with this statement:

"We took a fairly conservative approach in v1.0, because we wanted developers to be aware of when they were asking the framework to make a roundtrip to the database... our take on 'boundaries are explicit'."

That has to be the most depressing statement that I've ever read regarding ANY data access technology ever!

Hey guys!

The entire point of an abstraction layer is so that developers using that layer DON'T have to be aware of the damned internal workings under the abstraction layer!!!!

But most offensive to me is the overall fact that I cannot "trust" the EF model. For example... if I have a Customer entity then I have no way to know if Orders property contains an empty collection because there aren't any orders of if it is empty because the framework hasn't loaded data. Instead of being able to trust the entity model to be accurate I have to baby sit it and constantly ask "are you sure you loaded data for this already?".

Fuck that!

Then we get into the other side effect. All the mechanisms needed to do the paranoid checking-up after EF use some counter-intuitive techniques. Before I check the Customer property on an Order entity, I have to first check up with a CustomerReference property on my Order to get information about the state of the contents of the actual Customer property? Huh?

Yeah.... that's really slick there!

The eager load technique pisses me off even more!

So I can tell the EF to go ahead and load relationships... but to load them I have to use a method that takes a fucking string as an argument?!

So now I also have to be an expert on exactly what each navigation property in my EF model is specifically named... and that without strong type checking or intellisense? Sure... I can do that, but it slows me down and is just begging for a runtime bug (typoed the name or messed up the capitalization). That means I am constantly having to refer to the damned diagram all the time too which just slows me down and annoys the shit out of me at the same time!

Using EF without lazy loading is a good way to drive yourself into becoming so paranoid you'll need to remember to take your anti-psychotic meds before you even open Visual Studio!

There are a few 3rd party attempts out there to get implicit lazy loading features with the current version of EF. These are clever hacks, and I even tested out one of those. Overall, the hacks give you a much better experience than using the stock Entity Framework as is, but this is also code that will be hard to update to use any future releases of EF too, and these impose other limitations on your code too. I suppose though that if you HAD to use EF, you'd still be smart to use one of these 3rd party techniques to get the implicit lazy loading anyway.

LINQ to SQL may lack the ability to provide a true logical abstraction for your physical data model, or do fancy inheritance, or even handle some of the more unusual data mappings...  but at least you can TRUST that properties in a LINQ to SQL Entity will actually contain data that reflects what is in the real database. Plus the overall usage pattern of LINQ to SQL is much clearer and simpler.

Until EF gets built-in implicit lazy loading, screw it... I'll just use LINQ to SQL.

Tags: , , ,

Filed Under: Code

Should I hate Orson Scott Card?

by Stephen M. Redd 18. August 2008 10:47

Card opposes gay marriage... should I avoid reading his brilliant fiction books? WTF!?!?

In a recent entry over at "geekdad", one of wired's so-called blogs, Matt Blum wrote a piece contrasting his love of the book Ender's Game with his hatred for the book's author, Orson Scott Card. The source of the problem seems to be that Card has, especially in more recent years, been a very vocal opponent of gay marriage. We can find Orson's viewpoint very clearly stated in a piece that was published on the Mormon Times web site.

On one side of the argument we have a brilliant writer that makes a convincing and logical argument and on the other we have a hyper-reactionary hate monger that simply cannot deal with opinions that differ from his own.

Sadly, in this case the hate monger is Matt Blum.

For the most part, Matt is struggling with a problem that faces a lot of people in a celebrity obsessed internet culture. Any person of any minor fame will have their entire personal life splattered all over the place... and what we often find is that the people behind great works are not always good people. The knowledge sometimes impacts our ability to appreciate the work itself.

But in this case, what I find truly annoying is how Matt and many similar people treat Orson Scott Card, especially over his opposition to gay marriage. 

Matt seems to have bought into the left-wing activist's propaganda machine which preaches that it is wrong to even question the whole "gay rights" thing, especially in regards to gay marriage. He has other views that I can pick on in this piece too.

...about anti-semitism!

Contrary to the opinions of the political correctness crowd, including Matt, many people have legitimate complaints about Jews, Jewish culture, the Nation of Israel, etc.

Just because the Jewish people were treated badly in Germany half a century ago doesn't give them a free ride to be forgiven for being ass-hats today. There is a lot to dislike and disapprove of in Jewish politics and culture, just as there is in any culture.

Pointing out those flaws doesn't make you an evil bastard. But here in the home of free speech Jews appear to have earned a permanent “get out of jail free” card.

Anyone that says anything even mildly disapproving about anything that can be related to the Jewish is instantly flagged an anti-Semite... which is apparently something REALLY bad despite the fact that no one seems to actually know what exactly a semite might be... but everyone here sure does knows that you are a truly evil fucker if you aren't down with the semites! 

He is quick to label anyone that disagrees with anything Jewish in nature as an anti-Semite...  with the expected references to Nazi Germany of course.

By the end of his post, matt resorted to just picking on Sean Connery for a statement that he made in 1987 (where he offered the opinion that there were some cases where it was OK to slap a woman with limited force)... a viewpoint I can disagree with in general, but that did made sense in the original context of Sean's interview... it certainly wasn't as offensive as it was made out to be in the resulting media spin.

There are at least a few legitimate arguments to be made opposing gay marriage and Orson Scott Card successfully makes one of those. Card even managed to makes his point without having to bring in the religious angle, which is admirable considering his audience was Mormon and it would have been much simpler for him to just play the God angle.

But Card didn't do that, and that is part of the reason why Card is such a fantastic writer. Instead he breaks into history, politics, law, and science to make a rational argument in support of his opinion (something you don't often see from the religious right these days).

I'm sure the underlying reason that Card is so passionate about this topic is motivated by his own religious views, but unlike most religiously motivated bull-shit out there, Card's argument holds some water when it is held up to non-religious analysis.

I disagree with Card's overall viewpoint of course. I personally don't see the merit in ANY form of state recognition of marriage, gay or straight. Card does talk intelligently about why there is a legal idea of marriage though:

 "The laws concerning marriage did not create marriage, they merely attempted to solve problems in such areas as inheritance, property, paternity, divorce, adoption and so on."

Card is a smart guy, but in my opinion he missed a vital point... the areas of "inheritance, property, paternity, divorce, adoption and so on" do not need to be solved via legal recognition of marriage. It could just as easily be solved via standard contract and tort law.

Ironically there is already precedent for this in the legal system. Prenuptial agreements are an example of how contract law is used to extend and/or modify the standard rules of legal marriage. Divorce agreements are another example.

As it stands though, the existing legal institute of marriage is extremely discriminatory and unjust towards a sizeable group of citizens. It is as repressive to these people as slavery was towards black Americans. I would argue that legal marriage law is also highly discriminatory towards heterosexual people that just aren't married or don't want to be. Certainly the tax system punishes single members of our society very harshly indeed.

But I still respect Card's argument. It is well thought out, logical, and well presented. Which brings us back to Matt's problem... what do you do when a creator of great work holds personal opinions that you strongly disagree with?

Well, first, it probably doesn't help to come off as a total ass-hole like Matt did. I mean, by the end of his post he devolved into plain and simple name-calling.

How very mature Mr. geekdad, what a role model for your kids!

The geekdad "blog" over at wired is generally aimed at parents. In my opinion most of the writers over there seem to have some really silly ideas on parenting. These are the kind of parents that are shoved so far up their kid's ass that their kids will turn out to be worthless adults that just live in their geekdad's basement until they're 40... but since the blog does aim at parents, it brings up the question:

Should let you kids read a work if the person that created it also teaches ideas you don't agree with, or even find outright hostile, immoral, etc?

Well... you can be a narrow minded ass-hole and just steer your kids clear of such works... protecting them and making sure they grow up to believe only what you want them to. Or you might choose to teach them how to fucking think for themselves so they can make up their own minds when it comes to contentious political issues...

So I recommend you burn all of Card's books and add his name to your fucking net-nanny firewall or whatever...

 

Tags: , ,

Filed Under: Rants & Stupidity

I'm not advertising for you...

by Stephen M. Redd 26. June 2008 05:28

The South Carolina DVM expects to use my car's license plate to advertise for the state... we'll see about that!

Every few years the state of South Carolina sends me a new license plate. For some reason, they just can't pick a color and design and stick with it. But this time... they have really managed to pissed me off.

Here is the new license plate that arrived in the mail yesterday.

 

First of all, I don't give a rat's ass about the plate being pretty. I was fine with the plain white & blue plates with the high-visibility red font they used to use in the 80's. The purpose of the plate is to give police a way to identify the car. That's all it has to do. But if they want to spend my tax dollars making it all pretty then that's OK with me.

What gripes my ass though is that "TRAVEL2SC.COM" written at the bottom of the plate.  Never mind that it's in all upper-case... it's the idea of having it there at all that pisses me off.

I don't mind branding to some extent. If you make some physical thing that I buy and you want to have your name on it then that's fine as long as your branding isn't over-the-top annoying and doesn't negatively impact the usefulness of the thing you brand. Take my car for example... it has the Toyota logo on front and back, and on back the word "Toyota" and the model of the car. That's fine with me. If someone looking at my car likes it, they might find it useful to know what kind of car it is so they can see about getting one themselves. I always like to be able to look at other people's car and know what kind it is too.

Same with most things and branding... as long as you keep it kinda subtle, tactful, and out of the way.

Advertising is a different matter though. I fucking refuse to advertise for you, especially not for free.

Take my car as an example again. I went to several car lots before I bought my car. One of them had a car that I liked, but it had a big-ass steel logo for the car dealer bolted onto the back. The dealer logo was actually larger than all the Toyota logos combined. I asked them if they could order me the car without the logo or remove the logo and "repair" the hole that the bolts would have left.

They looked at me funny and said they couldn't do that. So I told him that the only way I'd buy his car is if he gave me $100/month each month I owned it or knocked off $7200 off the price ($100/month times the 6 years I'd financed the car for). He laughed thinking I was joking... so I got up and walked out of the sales office.

I ended up buying the same car from a dealership that had a simple "sticker" logo that I could remove. I made sure they knew that the only reason I bought their car instead of the other guy was because I could remove the logo.

Its just a thing with me. I will allow you to brand my stuff if you can do it tactfully... but I'm not running around throwing someone else's name in everyone's face. That's why I don't buy a lot of name-brand clothing lines. If your logo is the prominent feature of the shirt, then fuck-off! You aren't charging me $20 to $40 for a shirt AND getting me to do your advertising for you.

But in this case with the license plates, it is even more offensive to me. The state requires that I have a license plate, and I have no alternative vendor I can go to get a plate from. I could buy a "custom" license plate from the state that doesn't have advertising on it... but why should I have to pay $50 more for the "privledge" of dodging having to do the governments dirty advertising.

In the end... duct tape came to the rescue:

I'm serious... I will not advertise for you. I don't give a damn if you are the government or my mom. If you want me to advertise for you.... pay me!

 

C Snobs

by Stephen M. Redd 2. June 2008 18:45

Recently, I ran across one of the many little spats that develop between bloggers. This time it was between Alastair Rankine of girtby.net and Jeff Atwood of Coding Horror.

It's the typical spat.

One blogger decides that another blogger is no longer writing what they want to read. Rather than just unsubscribe, they write a big public post about why they have decided to unsubscribe and why the other blogger sucks.

And, as is typical of these kinds of spats, the blog post starts by talking about how they don't normally slam on people they unsubscribe from... then they slam on them anyway.

Sigh....

Anyway... you can read the spat at the two links below if you want... but the details aren't that important to what I have to say.

Rankine's post:

Atwood's reply:

What really got my attention in reading Rankine's part of this train-wreck (this is the nerd version of Jerry Springer right here) was that Rankine jumped Atwood's shit for not knowing C. In fact, he went as far as to say that by not knowing C, Atwood was not credible as a programmer.

Every time I see this opinion put forth by otherwise smart programmers it makes me foam at the mouth in rage and frustration.

This isn't a minority opinion in my experience.

I see this "must know C" prejudice all the time. I've even been passed over after a job interview had revealed my lack of a C background. There isn't any telling how many interviews I didn't even get to attend because my resume lacked C/C++ (even though I've never applied for a C/C++ dev position).

I also see this idea put forth by people that I otherwise respect... even Joel Spolsky, a hero of mine, makes a big deal out of knowing C. In his legendary advise to college students article  #2 on his list is "Learn C before graduating".

He even gives an amazing (in terms of stupidity if you ask me) example:

"...if you can't explain why while (*s++ = *t++); copies a string, or if that isn't the most natural thing in the world to you, well, you're programming based on superstition, as far as I'm concerned"

So how does knowing this help me write better C#? This doesn't directly apply in C#. Wouldn't it be better if I knew how C# does string stuff, which mechanisms are more efficient in specific cases, and why?

I could take Joel's advice and go off wasting my time learning C. Then, like him, I'd be able to translate my C# concepts into C in order to understand how it all works under the hood... or I can just learn how C# works and skip the C translation step. Both are valid approaches, but I think it's unfair and narrow minded to discount my ability to understand what goes on under the hood just because I lack a formal C background.

I'm not saying that knowing C would hurt me. In fact, I've often wished I had the patience to go back and learn C. But honestly, writing in C makes me want to die. How did any of those old C guys actually get anything done?

Besides, if everyone based their understanding of higher level languages on C then where is the diversity? In some ways, my understanding of some areas of C# is actually better than that of people with C backgrounds precisely because I DON'T have a C background.

While Joel has good reasons for preferring C experience in his employees due to the kind of development his company does, that doesn't map well to other areas of the programming field.

I do asp.net web applications. When I'm hiring, I'd MUCH rather you have a solid understanding of how IIS works internally. I don't care if you can write a fancy-pants sorting algorithm in C. I trust that the .NET framework guys will work out most of that anyway. As long as you understand the internals of C# or VB and the .NET framework you'll do fine in my field without knowing any straight C at all.

When someone like Rankine makes such a prejudicial assumption about an otherwise competent person based just their lacking a C background... well... it strikes me about the same as the racial prejudices I've had to hear all my life.

See, I live in the Deep South of the USA where all Mexicans are illegal, all black men have 15 kids by 5 different women, and all Arabs are terrorists. Here most narrow minded ass-holes blame their minimum wage income on the irrefutable fact that non-English speaking illegal Mexicans have stolen all the jobs. While everyone here complain that Mexicans should be wasting their time learning English instead working, the Mexicans are working their asses off, getting shit done, and getting paid.

I guess it's fair that all you C snobs can watch those ignorant non-C speaking savages steal all your jobs too.

while (*bigot++ = *asshole++);//see, natural isn't it?

 

Tags: , ,

Filed Under: Rants & Stupidity

Powered by BlogEngine.NET 1.6.1.6
Theme by Stephen M. Redd