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
trex eaterofcadrs
Jun 17, 2005
My lack of understanding is only exceeded by my lack of concern.

HappyHippo posted:

"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp."

Norvig's corollary: “Any sufficiently complicated LISP program is going to contain a slow implementation of half of Prolog”

Adbot
ADBOT LOVES YOU

ymgve
Jan 2, 2004


:dukedog:
Offensive Clock

yaoi prophet posted:

Look, I just want to know why we've been writing text using the same 26 letters for hundreds of years. Isn't it time we started using something more English 2.0?

Good idea!

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

pokeyman posted:

How does anyone justify using PHP for a new project?
Similar reasons to why people still regularly outsource critical core-business software to the other side of the globe.

-It's a popular enough solution to be something of a buzzword in the business domain, or at least it holds a mental association in the business domain for whenever "we have to build software to do X" comes up.

-It's super cheap, at least the sticker price is, when you factor in skillset availability, salaries, expected time to market and so on.

-It is involved in some appetizing success stories. Well, at least I'm sure there's an outsourced software success story out there. Maybe. I had to work jointly with a guy somewhere in the former USSR for a while and he knew his stuff and produced quality code, minus the times he'd randomly disappear for a month or two due to military service. Does that count?

Combine the above and it (outsourcing OR php) is far and away an A-list superstar when it comes to meeting requirements that are held to "page loads, looks pretty, good enough for me" standards of QA/testing. I think that's half the problem: dev costs and time to market are such a big deal for 99% of all webdev projects that a lot of decision makers under those pressures will ignore or happily assume the risks of heavy long term maintenance costs, security vulnerabilities, low threshold for new bugs, and so on if it means they can get the core requirements and most basic use cases up and working asap and on a budget they'll feel like bragging about.

Bhaal fucked around with this message at 01:26 on May 10, 2012

Zhentar
Sep 28, 2003

Brilliant Master Genius

shrughes posted:

Diff tools do not need to know about ASTs because they work perfectly fine without them and much more predictably without them.

Line based diffs using the classic O(ND) algorithm are unbearably awful and I don't understand how anyone who's had to look at non-trivial diffs could think otherwise.

Catalyst-proof
May 11, 2011

better waste some time with you
If I understand what this argument is about, if you have a diff tool based on the AST of the language in the source files, what if you make a change that is a syntax error in the language? Will the diff tool break down? Would the programmer have to keep two different diffing behaviors in their head for when the AST can't be created?

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed

Fren posted:

If I understand what this argument is about, if you have a diff tool based on the AST of the language in the source files, what if you make a change that is a syntax error in the language? Will the diff tool break down? Would the programmer have to keep two different diffing behaviors in their head for when the AST can't be created?

obviously the editor would just refuse to let you save the file

tef
May 30, 2004

-> some l-system crap ->

yaoi prophet posted:

Look, I just want to know why we've been writing text using the same 26 letters for hundreds of years. Isn't it time we started using something more English 2.0?

there are more than 26 letters (in english) if you are pedantic and see carolingian minuscule and latin as different scripts :eng99:

shrughes
Oct 11, 2008

(call/cc call/cc)

Zhentar posted:

Line based diffs using the classic O(ND) algorithm are unbearably awful and I don't understand how anyone who's had to look at non-trivial diffs could think otherwise.

When merging you just burn through them. So many people complain about merging and then when I look at their merges they just have to loving do the merge, burn out your mind's swap space, and get it over with and in the worst case it takes a few minutes modulo maybe one or two compilation mishaps. And it becomes an all day thing for them. Maybe I'm just superhuman.

Oh also some people for some reason don't enable 3-way diffs. They are wrong to not do so.

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

shrughes posted:

You end up never knowing what format your code is really in, and that has side effects like writing ad-hoc perl scripts to help with large renamings or refactorings much harder. That's not the only side effect, you surely get others because you decided to make things complicated instead of keeping them simple.

I agree about not storing/editing ASTs but you are missing the point on this one.

The compiler has the best knowledge about what each symbol in the code means. It knows the difference between a type named Foo and a local variable named Foo, something that is extremely difficult to get right with a regex. That's part of the reason MS is exposing the compiler as a service in the next version of VS - so you can write code that writes code, with full access to the compiler and intellisense. It's an extremely powerful concept once you wrap your brain around it.

Bottom line: refactors should never be dumb text replacements... They should use the compilers knowledge of the code to make sure the factor is verifiably correct. Same for renames.


Edit: as for diffs, why does it have to be one or the other? Why can't the diff tool use both textual analysis and compiler services to figure things out? I'm not aware of any such tool but I wish there was one. It is often immediately obvious that the diff tool has picked up a stray bit of code between two methods and made hash of the file, where if it had even rudimentary knowledge of the context it would know it was looking at two different methods. It could even trivially handle things like source code reorganization.

Simulated fucked around with this message at 02:49 on May 10, 2012

Zhentar
Sep 28, 2003

Brilliant Master Genius

shrughes posted:

When merging you just burn through them. So many people complain about merging and then when I look at their merges they just have to loving do the merge, burn out your mind's swap space, and get it over with and in the worst case it takes a few minutes modulo maybe one or two compilation mishaps. And it becomes an all day thing for them. Maybe I'm just superhuman.

I don't have much trouble with merges, since we've got a huge, established code base people are rarely stepping on each others' toes. Except there was this one time where I made a bunch of changes to a file and another guy had the gall to move a bunch of code from near the top of the file to the bottom of it. It took me a couple hours to sort that one out, even with the 'just burn through it'.


But when it comes to looking at code diffs (which I do a lot, since all of our development is required to go through two rounds of code review), I just couldn't handle going back to a plain jane diff tool.

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

Bhaal posted:

Similar reasons to why people still regularly outsource critical core-business software to the other side of the globe.

-It's a popular enough solution to be something of a buzzword in the business domain, or at least it holds a mental association in the business domain for whenever "we have to build software to do X" comes up.

-It's super cheap, at least the sticker price is, when you factor in skillset availability, salaries, expected time to market and so on.

-It is involved in some appetizing success stories. Well, at least I'm sure there's an outsourced software success story out there. Maybe. I had to work jointly with a guy somewhere in the former USSR for a while and he knew his stuff and produced quality code, minus the times he'd randomly disappear for a month or two due to military service. Does that count?

What about
-We already have PHP-skilled programmers and are actually good at our job and don't gently caress it up like 99% of PHP programmers do?

New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug

Ender.uNF posted:

That's part of the reason MS is exposing the compiler as a service in the next version of VS - so you can write code that writes code, with full access to the compiler and intellisense.

That won't be in VS11/2012 (whatever they call it), unfortunately. It's pretty cool stuff, though.

My favorite part of it is that it adds a REPL for C#.

trex eaterofcadrs
Jun 17, 2005
My lack of understanding is only exceeded by my lack of concern.

Fren posted:

If I understand what this argument is about, if you have a diff tool based on the AST of the language in the source files, what if you make a change that is a syntax error in the language? Will the diff tool break down? Would the programmer have to keep two different diffing behaviors in their head for when the AST can't be created?

I suppose it would be the same as some theoretical precommit hook in svn not allowing you to commit a file with a syntax error in it.

Gazpacho
Jun 18, 2004

by Fluffdaddy
Slippery Tilde

Ender.uNF posted:

The compiler has the best knowledge about what each symbol in the code means. It knows the difference between a type named Foo and a local variable named Foo, something that is extremely difficult to get right with a regex. That's part of the reason MS is exposing the compiler as a service in the next version of VS - so you can write code that writes code, with full access to the compiler and intellisense. It's an extremely powerful concept once you wrap your brain around it.
All true, but oh the WTFs we'll see! :buddy:

Suspicious Dish
Sep 24, 2011

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

Ender.uNF posted:

Edit: as for diffs, why does it have to be one or the other? Why can't the diff tool use both textual analysis and compiler services to figure things out? I'm not aware of any such tool but I wish there was one. It is often immediately obvious that the diff tool has picked up a stray bit of code between two methods and made hash of the file, where if it had even rudimentary knowledge of the context it would know it was looking at two different methods. It could even trivially handle things like source code reorganization.

I remember some sed-like tool for C that allowed you to do replacements based on templates (replace the names of local variables, etc.) I know I saw it once, but I cannot find it again for the life of me.

EDIT: I believe it was Coccinelle. Blog post about it.

Suspicious Dish fucked around with this message at 05:51 on May 10, 2012

w00tz0r
Aug 10, 2006

I'm just so god damn happy.
code:
struct Rect
{
    int x;
    int y;
    int z;
};
Where Rect is clearly short for Rectangular Coordinate in Three Dimensional Space. I really hope none of my co-workers read SA, I'm terrible at anonymizing.

xf86enodev
Mar 27, 2010

dis catte!

Ender.uNF posted:

the difference between a type named Foo and a local variable named Foo, something that is extremely difficult to get right with a regex.

The right tool for something like this is a kick in the balls.

gonadic io
Feb 16, 2011

>>=

xf86enodev posted:

The right tool for something like this is a kick in the balls.

Giving a type and its constructor exactly the same name is standard practice in Haskell
code:
newtype SafeString = SafeString String

trex eaterofcadrs
Jun 17, 2005
My lack of understanding is only exceeded by my lack of concern.
Not only that but it's valid code, so either you do "the right thing" with tooling or you go all Douglas Crockford.

Munkeymon
Aug 14, 2003

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



Golbez posted:

What about
-We already have PHP-skilled programmers and are actually good at our job and don't gently caress it up like 99% of PHP programmers do?

Must be nice to work inside a unicorn. Do you guys have a mermaid tank in the lobby? :allears:

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

Munkeymon posted:

Must be nice to work inside a unicorn. Do you guys have a mermaid tank in the lobby? :allears:

Funny thing is, I referred to us as a unicorn to my boss this very morning.

We send out a rather simple PHP test. It has been passed 100% exactly twice since I've been here: Once by me, and once by the one guy we've hired since I've been here. Some of the responses we get from that... oy.

Internet Janitor
May 17, 2008

"That isn't the appropriate trash receptacle."
question: "Is '==' a transitive operation?"
response: "Yes?"
correct answer: "No."

question: "Is a string distinct from a number?"
response: "Yes!"
correct answer: "Not really except when it is."

Impotence
Nov 8, 2010
Lipstick Apathy
question: it's php 5.4 already and there is still an error in transliterated hebrew. what causes it?

:v:

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

Biowarfare posted:

question: it's php 5.4 already and there is still an error in transliterated hebrew. what causes it?

:v:

in my defense we're still on PHP 5.1

:eng99:

Impotence
Nov 8, 2010
Lipstick Apathy
What is it with PHP and virtually every environment for it? It seems like PHP is almost always running disgustingly out of date versions, no "normal host off the street" (or anywhere else really) runs up to date/anywhere close to up to date versions/5.4?

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

Biowarfare posted:

What is it with PHP and virtually every environment for it? It seems like PHP is almost always running disgustingly out of date versions, no "normal host off the street" (or anywhere else really) runs up to date/anywhere close to up to date versions/5.4?

In our case it was either RHEL5 only supporting up to PHP 5.1, or if they supported higher they didn't include the extensions we needed, or what not. I don't know, I've been bitching at the higherups for years about it, and they consider having support more important than bleeding edge. We're finally testing a new version of RHEL so we should be at 5.3 soon!

As for normal webhosts... laziness? No clue. The worst is when someone's still running PHP4.

TOO SCSI FOR MY CAT
Oct 12, 2008

this is what happens when you take UI design away from engineers and give it to a bunch of hipster art student "designers"

SlightlyMadman posted:

What about an svn hook that runs a whitespace formatter, and if it passed some threshold of changes, rejected the commit. In my experience, anyone who can't think straight enough to format their whitespace has other problems too.
There's a presubmit hook like this where I work. It parses the input file, then generates the "correct" output, and refuses the submission if the input file and generated output are different.

On one hand, it's a bit annoying when it won't accept some particular special-snowflake formatting that makes one function a bit easier to read.

On the other, there are absolutely no files with mangled indentation, trailing whitespace, elided braces, or other such formatting horrors.

Munkeymon
Aug 14, 2003

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



Golbez posted:

We send out a rather simple PHP test. It has been passed 100% exactly twice since I've been here: Once by me, and once by the one guy we've hired since I've been here. Some of the responses we get from that... oy.

Care to share? A short-lived pastebin or whatever wouldn't show up on search results

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

Munkeymon posted:

Care to share? A short-lived pastebin or whatever wouldn't show up on search results

It's basically:
* Replace part of a string with something else.
* Using regular expressions, remove everything that's not a letter or single space from a set of strings.
** Most people simply go for /[^A-Za-z ]/, without realizing the single space part of the instructions.
* Add X days to a date, and if the new date falls on a weekend, push it to the following Monday
** This is where most people trip up. They usually add days to it by adding seconds to the time, so... strtotime($date1) + 60*60*24*x. Which fails because we cross daylight saving time in some of these, where you run into days that are not exactly 86400 seconds long.

The main thing this tests is reading comprehension, if you can read and understand the instructions. About half fail on this alone. The other half fail on the adding days. Usually other things too, but no one's gotten the date addition right without acing the rest.

The sad thing is, if they actually cared about getting the job like I did and verified their work by counting days for each example, they'd realize that they'd screwed up.

Zamujasa
Oct 27, 2010



Bread Liar

Golbez posted:

It's basically:
* Replace part of a string with something else.
Basically str_replace("a", "b", $str)...

quote:

* Using regular expressions, remove everything that's not a letter or single space from a set of strings.
What about using a two-pass search and replace, where you look for /[^A-Za-z]/ the first round then / {2,}/ the second? (I forget offhand if PHP accepts that length format, though. There's also probably an easier way to do it but work has me too preoccupied to put much thought into it)

quote:

* Add X days to a date, and if the new date falls on a weekend, push it to the following Monday
This one is easy enough, using mktime(). Just provide the stuff getdate() gives you to it and run the returned timestamp through getdate() again, adding a day if wday == 0 || wday == 6. Since mktime allows days beyond the end of a month (which go into the next month) this is pretty simple even for a braindead solution I just came up with in 30 seconds.


Granted, I can see how some people would trip up (it's easier to take the obvious mistake route) but provided the information that the easy solution fails, the alternate working solution is pretty easy to come up with.


At least, I hope I got that right. :ohdear:


(It'd also be a lot easier to pass if this was something you got to do on your own time or at least on a computer, instead of a written Javascript syntax exam that I had to take for this job. :barf:)

Zamujasa fucked around with this message at 19:16 on May 10, 2012

epswing
Nov 4, 2003

Soiled Meat

Golbez posted:

if the new date falls on a weekend, push it to the following Monday

Zamujasa posted:

adding a day if wday == 0 || wday == 6

Add two days if it's Saturday, one if it's Sunday.

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:

Basically str_replace("a", "b", $str)...
Basically. It's a little more complicated in the actual test but that part's in there mainly for reading comprehension. And yes, people do screw it up.

quote:

What about using a two-pass search and replace, where you look for /[^A-Za-z]/ the first round then / {2,}/ the second? (I forget offhand if PHP accepts that length format, though. There's also probably an easier way to do it but work has me too preoccupied to put much thought into it)
Other way around, wouldn't it? Otherwise the first one would get rid of all spaces. But yeah, that's basically it - condense multiple spaces into one, then remove all non-alphas and non-spaces.

quote:

This one is easy enough, using mktime(). Just provide the stuff getdate() gives you to it and run the returned timestamp through getdate() again, adding a day if wday == 0 || wday == 6. Since mktime allows days beyond the end of a month (which go into the next month) this is pretty simple even for a braindead solution I just came up with in 30 seconds.
There are multiple ways to do it, but most people appear to have been taught to always add time by using seconds so there's a lot of 86400s out there. The simplest way is simply strtotime('+x days', $foo), though using mktime() comes close, but requires you to remember or no or have an IDE that knows what order the arguments go in.

quote:

Granted, I can see how some people would trip up (it's easier to take the obvious mistake route) but provided the information that the easy solution fails, the alternate working solution is pretty easy to come up with.

Exactly, YOU think it's easy, and I think it's easy, but 99% of the people taking the test either don't think it's easy, or don't even notice they did it wrong. It's not like this is timed. They are choosing to hand in substandard and unchecked work. :sigh:

Edit:

epswing posted:

Add two days if it's Saturday, one if it's Sunday.

strtotime('next Monday', $foo)

Suspicious Dish
Sep 24, 2011

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

Zamujasa posted:

(It'd also be a lot easier to pass if this was something you got to do on your own time or at least on a computer, instead of a written Javascript syntax exam that I had to take for this job. :barf:)

Did it have questions on semicolon insertion?

Q: What is the proper interpretation of:

code:
a
++b
is it a; ++b; or a++; b;

pigdog
Apr 23, 2004

by Smythe

Golbez posted:

It's basically:
* Replace part of a string with something else.
* Using regular expressions, remove everything that's not a letter or single space from a set of strings.
** Most people simply go for /[^A-Za-z ]/, without realizing the single space part of the instructions.
Two or more spaces are simply two or more instances of single space placed adjacent to eachother. :geno:


quote:

This one is easy enough, using mktime(). Just provide the stuff getdate() gives you to it and run the returned timestamp through getdate() again, adding a day if wday == 0 || wday == 6. Since mktime allows days beyond the end of a month (which go into the next month) this is pretty simple even for a braindead solution I just came up with in 30 seconds.
Did the week start with Monday, or Sunday?

pigdog fucked around with this message at 19:26 on May 10, 2012

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Zamujasa posted:

What about using a two-pass search and replace, where you look for /[^A-Za-z]/ the first round then / {2,}/ the second? (I forget offhand if PHP accepts that length format, though. There's also probably an easier way to do it but work has me too preoccupied to put much thought into it)

Or one pass with positive lookahead:
/ (?= )|[^A-Za-z ]/

(edit: simpler regex)

pokeyman fucked around with this message at 19:38 on May 10, 2012

Zamujasa
Oct 27, 2010



Bread Liar

quote:

Did the week start with Monday, or Sunday?
The documentation says 0 == Sunday and 6 == Saturday.

Golbez posted:

Other way around, wouldn't it? Otherwise the first one would get rid of all spaces. But yeah, that's basically it - condense multiple spaces into one, then remove all non-alphas and non-spaces.
Oh, yeah. Right. You'd have to add the space to the first one, too (to keep them for the next pass).

As for positive lookahead: I haven't delved into those because a lot of the playgrounds I mess with regexes on don't really support those. Good to know though, thanks -- I'll have to remember it.

quote:

There are multiple ways to do it, but most people appear to have been taught to always add time by using seconds so there's a lot of 86400s out there. The simplest way is simply strtotime('+x days', $foo), though using mktime() comes close, but requires you to remember or no or have an IDE that knows what order the arguments go in.
I've had a lot of bizarre issues with strtotime before, so I try to avoid it if I can help it.

Besides, I can't help but think that localization issues might cause problems, too. Does it always use "days"? (Then again, PHP in general seems to barf all over localization formatting.)

quote:

strtotime('next Monday', $foo)

That would work as a second step, yes. As for the prior code, a niave solution would be to just keep running that in a loop until it didn't fall on a weekend any more, which was what I meant. Switching it would be better based on the number, of course, or strtotime if it worked reliably.



And now my excuse for the above, I've been frying my brain trying to figure out why my boss seems to think this is "just seperate this poo poo into different files and call them as needed". I gave sample estimates for every part of the task (3 days, as every estimate prior has ran over due to discovery of horrors) and got a bunch of grief over it.


And lo and behold, I find another horror:

code:
// This file runs as a service, as root!

$data = mysql_fetch_assoc(mysql_query("SELECT userenteredfield FROM database"));
$data = $data[userenteredfield];

[many lines later]

shell_exec("php somefile.php $foo $bar $baz $data > log.log");
So now I have a dilemma where I can either explain this latest horror that basically allows any of a growing number of people to effectively reformat our server, or just keep it quiet and fix it in the redesign I'm doing.

Given how the last few times I've pointed out these horrors I've gotten in poo poo because suddenly I have to take time from my already-too-short estimates to fix, I might just keep this one buried until I can fix it later. :sigh:

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

Internet Janitor posted:

question: "Is '==' a transitive operation?"
response: "Yes?"
correct answer: "No."

php.net posted:

Note that php comparison is not transitive:

"php" == 0 => true
0 == null => true
null == "php" => false
:catstare:

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

Golbez posted:

What about
-We already have PHP-skilled programmers and are actually good at our job and don't gently caress it up like 99% of PHP programmers do?
Besides the unicorn argument I'd say this is a problematic justification because of the Dunning-Kruger effect (not that I'm accusing you of falling under it). PHP seems to be a magnet for people who whether they dabbled in other languages or not, find that they can hack away all sorts of stuff pretty quickly and easily in PHP. They reason that they ARE rockstars because of their successful wrangling of all the extra complications a project presents--probably introduced by poor design, poor implementation, poor (and therefore highly fluctuating) specs & requirements and so on--plus the atta-boys earned from their employer cements that they know what they are doing, they fully understand the problem space, and they are doing things in The Best Way Possible. But at the end of the day their experience is limited (often solely) to PHP, they grow blind spots to its crazy idiosyncrasies, and even sometimes become aggressive to any alternatives and regard them as crazy, unproven experiments for people who aren't serious about Getting Things Done.

It's certainly not unique to PHP either. It has just that right mixture of accessibility and productivity, and came along around the right time, to attract such a crowd. When I was in college it was VB that had a similar role, but to be fair, at least in the world of GUI apps, I remember my brain melting once or twice trying to navigate the MFC of circa 1999-2001 (6.0 I think?). That domain has come a long way since then, and I'm thinking when webdev and the toolset and paradigms used for it finally start to shift comprehensively instead of iteratively (I'm not sold on Nodejs or RoR or backbonejs or whatever else is trending on github these days as being the vanguard of that shift) we'll start to see PHP drop off and some other new framework/appstack start taking in all the fallout developers.

Bhaal fucked around with this message at 20:09 on May 10, 2012

TOO SCSI FOR MY CAT
Oct 12, 2008

this is what happens when you take UI design away from engineers and give it to a bunch of hipster art student "designers"

Golbez posted:

:catstare:
I never get tired of posting this.

Adbot
ADBOT LOVES YOU

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

Janin posted:

I never get tired of posting this.



It's stuff like this that made me religiously start using ===.

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