Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
ToxicFrog
Apr 26, 2008


bobthecheese posted:

I'm of the personal opinion that if you can't write clean, clear, and consistent code in PHP, the language is not the problem.

Sure, it's missing a few features that you'd expect in, say, Java or python, or whatever else, but it works and it doesn't force you to write your code in one particular way.

Features like transitive equality :v:

Also, pointing out that "a good programmer can write good code, and a bad programmer bad code, in any language" is a cop-out. Part of being a good programmer is being able to choose good tools. PHP is not a good tool - due in large part to the fact that it has so many exceptions, weird corner cases, inconsistently named library functions, low-level C wrappers, and intrinsic security issues that the amount of overhead involved in writing good PHP code is quite high.

And even if your PHP code is utterly without flaw and flows across the mind like the sweetest of lisp, that won't help you when the next remote code execution exploit that the developers take multiple tries to actually fix comes along.

ToxicFrog fucked around with this message at 17:34 on Jun 21, 2012

Adbot
ADBOT LOVES YOU

Mustach
Mar 2, 2003

In this long line, there's been some real strange genes. You've got 'em all, with some extras thrown in.

The Gripper posted:

I prefer that over goto any day, plus it adds the convenience of being able to fold code blocks properly and not have to gently caress around following gotos to skim program flow.
The only reason you need to fold those blocks is because the logic is otherwise too hard to follow. Nested ifs that split up the common-case logic require the reader to keep a mental stack of each state in what should be a straightforward line. Well, I guess it is a straight line, if you tilt your head 45 degrees. This is especially made worse when there are else clauses.

Anyhow, here's a fraction of a different kind of >-shaped code:
code:
                     switch(thing[index + 7]) {
                        case 4:
                           switch(thing[index + 8]) {
                              case 1:
                                 switch(thing[index + 9]) {
                                    case 3:
                                       switch(thing[index + 10]) {
                                          case 7:
                                             switch(thing[index + 11]) {
                                                case 1:
                                                   switch(thing[index + 12]) {
                                                      case 1:
                                                         switch(thing[index + 13]) {
                                                            case 1:
                                                               switch(thing[index + 13]) {
                                                                  case 1:
                                                                     if (tweedlieDum(thing, thingSize));
                                                                     break;
                                                               }
                                                               break;
                                                         }
                                                         break;
                                                   }
                                                   break;
                                             }
                                             break;
                                       }
                                       break;
                                 }
                                 break;
                           }
                           break;
                     }
                     break;
The real thing is more like several sideways W's but you get the idea.

Mustach fucked around with this message at 15:01 on Jun 21, 2012

New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug
Indentation more than a few levels deep is a pretty good indication that you need to split the method apart.

Zamujasa
Oct 27, 2010



Bread Liar
Or otherwise condense your checks. We have more than few like the one posted above scattered about, where the code is just several nested if-then with no else clauses.

Then again we have code floating around that's about 16 indentation levels deep, but I prefer to stay as far away from that code as possible. It somehow continues to work and I do not want to touch the Jenga tower.

MrMoo
Sep 14, 2000

Yay,
C++ code:
// seconds of one day
inline __time32_t getOneDay() {
    return 86400;
}

// seconds of one min
inline __time32_t getOneMin() {
    return 60;
}

// milisecond of aa onesecond
inline __time32_t getOneSecond() {
    return 1000;
}

MrMoo fucked around with this message at 16:47 on Jun 21, 2012

Golbez
Oct 9, 2002

1 2 3!
If you want to take a shot at me get in line, line
1 2 3!
Baby, I've had all my shots and I'm fine

MrMoo posted:

Yay,
C++ code:
// seconds of one day
inline __time32_t getOneDay() {
    return 86400;
}

It's sweet to see someone who hasn't learned that not every day has 86400 seconds.

Vanadium
Jan 8, 2005

Mustach posted:

Anyhow, here's a fraction of a different kind of >-shaped code:
code:
                     switch(thing[index + 7]) {
                        case 4:
                           switch(thing[index + 8]) {
                              case 1:
                                 [...]

For a moment I hoped this would mean that in a nested switch statement like for example switch (1) { case 2: switch (2) { case 1: } } would actually jump straight into the inner case similar to those crazy nested switch/while abominations, but it doesn't look like it actually works like that. :(

Blotto Skorzany
Nov 7, 2008

He's a PSoC, loose and runnin'
came the whisper from each lip
And he's here to do some business with
the bad ADC on his chip
bad ADC on his chiiiiip

MrMoo posted:

Yay,
C++ code:
// seconds of one day
inline __time32_t getOneDay() {
    return 86400;
}

// seconds of one min
inline __time32_t getOneMin() {
    return 60;
}

// milisecond of aa onesecond
inline __time32_t getOneSecond() {
    return 1000;
}

I like how there's three layers of garbage in one concise ball of trash

Internet Janitor
May 17, 2008

"That isn't the appropriate trash receptacle."
Oh man, I just noticed that __time32_t can represent three different units. At first I just thought the horror was assuming that the number of ms in a day is a constant while bending over backward to avoid using a constant.

MrMoo
Sep 14, 2000

Golbez posted:

It's sweet to see someone who hasn't learned that not every day has 86400 seconds.

You would think in a market data system that might be pertinent, they didn't.

Golbez
Oct 9, 2002

1 2 3!
If you want to take a shot at me get in line, line
1 2 3!
Baby, I've had all my shots and I'm fine
It's something we put on our PHP test, not so much as a 'gotcha' but... if you know that some days don't have 86400 seconds then you're either inherently wise, or you've run into that problem before and therefore have wisdom from experience. (The task: Add 100 days to a date, if it's on the weekend push it to the next weekday. We deliberately have some of the dates cross a daylight saving time start or end.)

The ultimate IDE would raise a red flag whenever '86400' was typed.

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe

Internet Janitor posted:

Oh man, I just noticed that __time32_t can represent three different units.

There's seconds and milliseconds in that code. What's the third unit?

EDIT: also, https://github.com/twitter/time_constants/blob/master/lib/time_constants.rb

Zamujasa
Oct 27, 2010



Bread Liar

Golbez posted:

It's something we put on our PHP test, not so much as a 'gotcha' but... if you know that some days don't have 86400 seconds then you're either inherently wise, or you've run into that problem before and therefore have wisdom from experience. (The task: Add 100 days to a date, if it's on the weekend push it to the next weekday. We deliberately have some of the dates cross a daylight saving time start or end.)

The ultimate IDE would raise a red flag whenever '86400' was typed.

86400 isn't bad in and of itself (it's a lot easier to remember than "86400 unless it's some bizarre leap second today"), but if you're doing anything that actually depends on certain seconds being in a specific spot then that'd be a good time to get angry.

But if you just want "Has this happened in the last 24 hours", you can't really go wrong with 86400.

Golbez
Oct 9, 2002

1 2 3!
If you want to take a shot at me get in line, line
1 2 3!
Baby, I've had all my shots and I'm fine

Zamujasa posted:

86400 isn't bad in and of itself (it's a lot easier to remember than "86400 unless it's some bizarre leap second today"), but if you're doing anything that actually depends on certain seconds being in a specific spot then that'd be a good time to get angry.

But if you just want "Has this happened in the last 24 hours", you can't really go wrong with 86400.

It's not about leap seconds, it's daylight saving time. In [most of] the United States, November 4, 2012, will have 90000 seconds. March 10, 2013, will have 82800 seconds. Which is why, if you want to to arithmetic with days, do arithmetic with days rather than seconds. You wouldn't do year arithmetic with days, so why do day arithmetic with seconds?

Golbez
Oct 9, 2002

1 2 3!
If you want to take a shot at me get in line, line
1 2 3!
Baby, I've had all my shots and I'm fine

Suspicious Dish posted:

There's seconds and milliseconds in that code. What's the third unit?

EDIT: also, https://github.com/twitter/time_constants/blob/master/lib/time_constants.rb

quote:

T_1_MONTH = 2592000
T_12_MONTHS = 31104000
:catstare:

nielsm
Jun 1, 2009



Someone please install rocket boosters on Earth and the Moon and adjust their orbits so we programmers can get a more regular calendar tia.

Zamujasa
Oct 27, 2010



Bread Liar

Golbez posted:

It's not about leap seconds, it's daylight saving time. In [most of] the United States, November 4, 2012, will have 90000 seconds. March 10, 2013, will have 82800 seconds. Which is why, if you want to to arithmetic with days, do arithmetic with days rather than seconds. You wouldn't do year arithmetic with days, so why do day arithmetic with seconds?

DST honestly needs to just go gently caress off forever.

But yeah, good point. I had forgotten. (For the 24-hour case, though, it still works well enough.)

Doctor w-rw-rw-
Jun 24, 2008

ToxicFrog posted:

Features like transitive equality :v:

Also, pointing out that "a good programmer can write good code, and a bad programmer bad code, in any language" is a cop-out. Part of being a good programmer is being able to choose good tools. PHP is not a good tool - due in large part to the fact that it has so many exceptions, weird corner cases, inconsistently named library functions, low-level C wrappers, and intrinsic security issues that the amount of overhead involved in writing good PHP code is quite high.

And even if your PHP code is utterly without flaw and flows across the mind like the sweetest of lisp, that won't help you when the next remote code execution exploit that the developers take multiple tries to actually fix comes along.

Zombywuf posted:

PHP is bad code.

I've personally talked to Rasmus Lerdorf before and I assure you I have no respect for his language design skills whatsoever. Hell, he doesn't either. I'm not copping out because I'm not asserting that PHP is in any way a good tool. If you want to write secure, well-written code, the language will work against you, to a point. And the language implementation itself is yes, plain bad - even though, regarding the cgi exploit, only those who deployed PHP very poorly were vulnerable.

What I *am* saying is that making GBS threads on the language so much is stupid and boring and makes you sound ignorant. I've seen my fair share of lovely Java and Python code, two languages i like (for different reasons), and "good" PHP code (as good as it can really be). PHP is not "the worst thing ever". poo poo code is. Good PHP (well-abstracted, carefully-written, etc) is more conducive to productivity than poorly coded anything in any language no matter how awesome. And the language itself, while extremely full of warts to the point it seems like it's nothing but, is, at least, a very productive language.

EDIT: I still have more to say apparently. The overhead in creating a production-quality PHP infrastructure is largely a one-time cost, or at least not a recurring one, and issues with equality can be addressed mostly by telling anyone who isn't familiar with it yet "You're using double-equality. Stop. Use triple-equality." along with some code reviews until they've grasped the language's gotchas.

Doctor w-rw-rw- fucked around with this message at 19:55 on Jun 21, 2012

Zombywuf
Mar 29, 2008

Doctor w-rw-rw- posted:

What I *am* saying is that making GBS threads on the language so much is stupid and boring and makes you sound ignorant. I've seen my fair share of lovely Java and Python code, two languages i like (for different reasons), and "good" PHP code (as good as it can really be).
You misunderstand. It is not that bad code is written in PHP, PHP is bad code written in C.

quote:

PHP is not "the worst thing ever".
It makes an excellent case for it's contention.

quote:

a very productive language.
This makes you sound like someone who has never used Perl.

quote:

EDIT: I still have more to say apparently. The overhead in creating a production-quality PHP infrastructure is largely a one-time cost, or at least not a recurring one,
I'm going to stop you there and laugh at the idea that infrastructure is not a recurring cost.

Bhaal
Jul 13, 2001
I ain't going down alone
Dr. Infant, MD

Zamujasa posted:

Or otherwise condense your checks. We have more than few like the one posted above scattered about, where the code is just several nested if-then with no else clauses.
Some years back I was working under a Senior Developer making a C++ app. This guy was quirky as hell. He believed you couldn't trust short circuit evaluation "because it's up to the compiler and we can't be guaranteed it won't turn it into a short circuit" (answer: first, just no. Second, we're using GCC and this is totally closed source and proprietary, so we're always the ones making builds).

So when it came to checking for null pointers before doing stuff with them, whenever he saw someone (me) check something like this into the repo:
C++ code:
if( myPtr && myPtr->meetsCondition())
{
  //stuff
}
He would rewrite and re-commit this:
C++ code:
 if( myPtr )
{
  if(myPtr->meetsCondition())
  {
    //stuff
  }
}
Also, he was also the author of The Most Difficult Function To Understand Ever. It was a member function for a class, it weighed in around 1000 lines, and about every 5th line was an if, an else, a loop, or a brace stepping into or out of one of the above. Most lines of code it contained were nested about 4-6 scopes deep. The function took about 8 arguments, most of them pointers or bools (every single one had a null/false default so you could call it any way you liked), which along with some class variables and global static variables were the driving force for almost all the conditionals and loops. Deep in this forest of loops and conditionals you would frequently find a block that would include any combination of the following: change some of the global static variables that control so much of the logic in here and other parts, call this same function on a different object (with varying amounts of arguments), call this same function recursively on itself (with varying amounts of arguments), and either continue on with execution or return early (textbook casus belli for the "one point of exit" philosophy).

The first time I was tasked to find and solve a bug in that beast that I had very arduously avoided even looking at until I had to, I printed out the whole function, grabbed some colored pens and went to town trying to follow through the general flow of logic. Even stepping through it in a debugger would make your head swim and you'd lose your place. God, what a nightmare that was. Also he was making about 130k plus around a 4% share. Startups are such a crazy loving place sometimes.

Bhaal fucked around with this message at 20:21 on Jun 21, 2012

Doctor w-rw-rw-
Jun 24, 2008

Zombywuf posted:

You misunderstand. It is not that bad code is written in PHP, PHP is bad code written in C.

It makes an excellent case for it's contention.

This makes you sound like someone who has never used Perl.

Companies for the most part aren't in the business of selling their codebase but are in the business of selling a service. If they code fast and code well in Perl I honestly don't have a problem with that. Both PHP and Perl have proven that solid codebases can be written on top of them. They've also proven that lovely programmers love writing lovely code whenever possible.

Any reasonably successful language has a compelling reason to use it and it's for that reason that I think that making a joke out of "it's the worst language ever" promotes ignorance of the actual flaws and dooms people to repeat them in the "better" languages, which seems to be a recurring pattern.

Zombywuf posted:

I'm going to stop you there and laugh at the idea that infrastructure is not a recurring cost.

It is, but at that point I believe the codebase is most of the cost, not the language.

Zombywuf
Mar 29, 2008

Doctor w-rw-rw- posted:

Companies for the most part aren't in the business of selling their codebase but are in the business of selling a service. If they code fast and code well in Perl I honestly don't have a problem with that. Both PHP and Perl have proven that solid codebases can be written on top of them. They've also proven that lovely programmers love writing lovely code whenever possible.
I'm not sure you realies just how many rungs above PHP Perl is.

quote:

Any reasonably successful language has a compelling reason to use it and it's for that reason that I think that making a joke out of "it's the worst language ever" promotes ignorance of the actual flaws and dooms people to repeat them in the "better" languages, which seems to be a recurring pattern.
The absolute worst thing you could do to a novice programmer is to allow them to just form the thought in their minds: "maybe PHP isn't that bad." PHP is that bad, as many many posts in this thread have shown. Posting PHP's many flaws and joking about how terrible they are does not promote ignorance.

trex eaterofcadrs
Jun 17, 2005
My lack of understanding is only exceeded by my lack of concern.
PHP's security record should be all that's necessary to show that it should not be used for anything serious.

pigdog
Apr 23, 2004

by Smythe

Zombywuf posted:

This makes you sound like someone who has never used Perl.
Perl has a share of coding horrors as well. In 5.6.0 it introduced Unicode (or UTF8) support, which was in theory pretty great. Everything would have continued to work as usual, except there's support for weird characters to manipulate and match. Well.. except it didn't work too well. For starters

quote:

Unfortunately, there is currently no way to tell Perl that incoming data from an external file is Unicode; while you can write Unicode data out to a file, you cannot read Unicode data back in again. While you can work around this with tr///CU, it's obviously a serious shortcoming, which we hope will be addressed soon.

It was a horribly broken mess. In its quest for backwards compatibility and doing the right thing intuitively, it made guesses about the character set the text it manipulated was in. They weren't very good guesses. If you got tired of the brokenness, said "gently caress it" and tried to revert to previous approach of use bytes;, then external libraries (like XML parsers) broke in turn.

One of the greatest such "features" I wrestled with was when you got everything right and it started outputting a page in a correct encoding and everything was peachy... but upon inserting a substring or encountering some character it decided it had guessed wrong and changed the encoding on the fly. Had a fun time solving bug reports saying that half of some page displayed properly, but the other half of the page was in gibberish. :suicide:

They gradually improved the stuff and somewhere around 5.8.4 5.6.4 I think it got better. Thankfully I was over doing serious app development in Perl by then.

pigdog fucked around with this message at 21:23 on Jun 21, 2012

Zombywuf
Mar 29, 2008

pigdog posted:

They gradually improved the stuff and somewhere around 5.8.4 I think it got better. Thankfully I was over doing serious app development in Perl by then.

Perl 5.8.0 had the Encoding pragma. Incidentally, have you tried handling unicode data in Python recently? Perl 5.8 is one of the very few languages that gets unicode right.

Zombywuf
Mar 29, 2008

So, in other emulating 50s business practices news, two UK banks overnight transaction processing system fell over last night (you or I may measure transaction times in ms, but banks in the UK still do it in days).

They're keeping really schtum on the cause, I can only hope it comes out and turns out to be really really embarrassing.

http://www.guardian.co.uk/money/2012/jun/21/natwest-rbs-customer-technical-hitches

npe
Oct 15, 2004
I can vouch for how at least how one major US bank works... transfers were done via what amounted to timed FTP jobs of text files which listed each transaction. These transfers frequently failed and had to be restarted, involving manual effort to rerun the transactions that hadn't processed yet. Naturally, this was a 24x7 department of people to monitor these jobs (which ran 5 times daily, as I remember) and repair them when they failed.

As you can imagine, double transactions or missed transactions were not uncommon...

Zombywuf
Mar 29, 2008

Well the UK has BACS, which standardises payments between banks so it's not as bad as that. Sort of. http://faq.webpayrolltraining.co.uk/4429.htm Turns out each bank has its own implementation of the standard. I notice RBS and Natwest (the banks affected) have their own particular format, I suspect this is related.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

npe posted:

I can vouch for how at least how one major US bank works... transfers were done via what amounted to timed FTP jobs of text files which listed each transaction. These transfers frequently failed and had to be restarted, involving manual effort to rerun the transactions that hadn't processed yet. Naturally, this was a 24x7 department of people to monitor these jobs (which ran 5 times daily, as I remember) and repair them when they failed.

As you can imagine, double transactions or missed transactions were not uncommon...

gently caress banks.

Just clear transactions as soon as I do them! This is the god drat 21st century, yet you insist on these stupid pending transactions and all sorts of poo poo that doesn't make any sense except to irritate me.

Scaramouche
Mar 26, 2001

SPACE FACE! SPACE FACE!

npe posted:

I can vouch for how at least how one major US bank works... transfers were done via what amounted to timed FTP jobs of text files which listed each transaction. These transfers frequently failed and had to be restarted, involving manual effort to rerun the transactions that hadn't processed yet. Naturally, this was a 24x7 department of people to monitor these jobs (which ran 5 times daily, as I remember) and repair them when they failed.

As you can imagine, double transactions or missed transactions were not uncommon...

There's a lot of weird little banks in the US that exist solely to issue 'less questions asked' credit cards and run little deposit accounts. I know for a painful fact at least some of them will use a 9600 bps dial up modem to connect to what is basically the WildCat! BBS software to do certain things.

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe
https://bugs.php.net/bug.php?id=50696

Look Around You
Jan 19, 2009


Wow what in the gently caress.

e: this is horrible on so many levels. Why was the change made? Why does it silently return NULL instead of raising an exception if you want it to be prohibited? Why is Rasmus acting like a dick when asked about the rational behind a pretty odd change in a core function?

Look Around You fucked around with this message at 07:14 on Jun 22, 2012

carry on then
Jul 10, 2010

by VideoGames

(and can't post for 10 years!)


I wonder where the point that you start asking for a platform migration stands in relation to the point of having an internet argument with the creator of your current platform.

Strong Sauce
Jul 2, 2003

You know I am not really your father.





Look Around You posted:

Wow what in the gently caress.

e: this is horrible on so many levels. Why was the change made? Why does it silently return NULL instead of raising an exception if you want it to be prohibited? Why is Rasmus acting like a dick when asked about the rational behind a pretty odd change in a core function?

Read the whole thing:

quote:

Why are you passing an empty string in place of a number there? You
are essentially asking for an empty string to be printed with 0 decimal
places and you are getting back an empty string. You also get a big
warning about that, of course. How about "a",0 what do you expect that
to return?

I think the right solution for you here is to be explicit about casting
your weird inputs to a float. number_format((float)$weird,'0') will
take care of it.

quote:

The change was part of standardizing all of PHP on the same parameter
parsing code. It is called zend_parse_parameters() internally. Most
of PHP was using this already, but there were still some stragglers
like number_format().

PHP generally doesn't throw exceptions (and didn't get them until 5) so it'd be even worse to make it throw an exception here since that would stop PHP from generating the rest of the page.

There were 3.5 years between 5.1 and 5.3, in that time PHP released several versions of 5.3 and notified developers to test and address any problems.

Version 5.3.2 04-Mar-2010
Version 5.1.6 24-Aug-2006

How is rasmus being a dick when he already gave a solution for the developer to fix the problem?

Strong Sauce fucked around with this message at 07:38 on Jun 22, 2012

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
Honestly I don't think "it makes our codebase prettier internally" is a good reason to take a breaking change like that. Especially in this case, since PHP still treats strings not containing any digits pretty much the same as the number 0 almost everywhere else that it expects a number.

Zombywuf
Mar 29, 2008

I don't think there's any point in attempting to unravel the clusterfuck that exchange represents. I mean, they fixed the parser and it changes the return value of a function.

A A 2 3 5 8 K
Nov 24, 2003
Illiteracy... what does that word even mean?
Rasmus: "Why are you passing an empty string in place of a number there?"

Because you created a generation of developers who don't give a poo poo about data types due to poo poo like "1" + "2" = 3, genius!

tef
May 30, 2004

-> some l-system crap ->

https://bugs.php.net/bug.php?id=60758 :3:

qntm
Jun 17, 2009

Zombywuf posted:

So, in other emulating 50s business practices news, two UK banks overnight transaction processing system fell over last night (you or I may measure transaction times in ms, but banks in the UK still do it in days).

They're keeping really schtum on the cause, I can only hope it comes out and turns out to be really really embarrassing.

http://www.guardian.co.uk/money/2012/jun/21/natwest-rbs-customer-technical-hitches

I bet this is because Santander just bought RBS and Natwest, and they're trying to migrate their processes over, and failing. Santander has a strong reputation as the worst bank in the UK.

Yeah, it's time to get out of that whole mess.

Adbot
ADBOT LOVES YOU

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



Strong Sauce posted:

There were 3.5 years between 5.1 and 5.3, in that time PHP released several versions of 5.3 and notified developers to test and address any problems.

Version 5.3.2 04-Mar-2010
Version 5.1.6 24-Aug-2006

Most developers who get paid to do work aren't going to have time to gently caress around with every new version of every part of their stack that comes out because they have features to add and their own bugs to fix. I got a job at a place that was using 4.4 in 2007 and I think they were up to 5.1 when I left last year. RHEL shipped with 4.3 in 2009 and 5.1 in 2011. That's the reality of PHP (or any language, really) use out in the world: you stabilize on a version and don't change because that probably means tons of work - especially when the developers of your platform pull poo poo like this. Either Ledorf doesn't understand reality or doesn't care.

quote:

How is rasmus being a dick when he already gave a solution for the developer to fix the problem?

Because he didn't even explain why there was a breaking change to the platform until the third dickish reply that 'solution' was really just more condescension along the lines of "oh you must be such a retarded child that you don't know how to do a string replace".

Munkeymon fucked around with this message at 15:07 on Jun 22, 2012

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply