There have been multiple accounts created with the sole purpose of posting advertisement posts or replies containing unsolicited advertising.

Accounts which solely post advertisements, or persistently post them may be terminated.

programmer_humor

This magazine is from a federated server and may be incomplete. Browse more on the original instance.

RandomVideos , in This one goes out to the sysadmins in the crowd.

Why did it change from 64 gb of ram to 1.268869321 E+89(64!) gb of ram

Also, 2.092278988 E+13(16!) gb is a lot more than 64 gb

AeonFelis ,

Said app is Chrome

stoicmaverick ,

Came here to say this. Nerd…

Hupf ,

What you said makes 0! sense

RandomVideos ,

What does 1(0!) sense mean?

TehPers ,

It means it made 100% sense.

yum13241 , in This one goes out to the sysadmins in the crowd.

The second guy is the exact same type of person as my Dad.

marcos , in This one goes out to the sysadmins in the crowd.

Yeah, almost certainly the software only uses 4GB because it limits itself to what memory it has available.

I have seen this conversation pan out a few times already. It has always been because of that, and once expanded things work much better. (Personally I have never took party at one, I guess that’s luck.)

yum13241 ,

Does the OS really eat up 7GB RAM?

marcos ,

Oh, ok, I overlooked it has space to grow. This is one conversation I’ve never seen.

ptz OP ,
@ptz@dubvee.org avatar

I phrased that panel poorly. App in question always had 16 GB and still never used above 4.

lorez , in This one goes out to the sysadmins in the crowd.

For some reason I love this meme.

kamen , in What could possibly go wrong

Left pad is a good example of why you shouldn’t.

Caboose12000 ,

can you elaborate

v1605 ,
johannes ,

That was a rather nice read :) thank you!

milkjug ,
@milkjug@lemmy.world avatar

Thank you for sharing this. I learn something new everyday, much appreciated.

Feirdro ,

This was excellent, but conveniently left off any discussion that npm can “un-un-publish” a programmer’s code against their wishes, and apparently without repercussions?

Fuck npm, I guess.

mexicancartel ,

Absolutely they can un-unpublish since the programmer has given everyone the rights to use his code wherever they want, with its open license. Npm can actually use the older version of the code and give it to everyone. Its actually a good thing

Feirdro ,

Right, the “open” part of open source.

DarkenLM ,

Thank fuck for that, cause if they didn't faker.js and node-ipc would have caused a lot of trouble, with the developers adding malware to a new version and later deleting the entire packages, breaking tons of projects. And those were everything but small packages.

Anonymousllama ,

All for the greater good, especially if it’s the choice between one guy’s desire to nuke their own code VS tens / hundreds of thousands of projects that depend on it.

magic_lobster_party ,

Event stream as well. TL;DR: popular npm library get infested with Bitcoin stealing code.

https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident

phorq , in Zero to Hero in 1 hour

I count 13 steps, so it just means you’re gonna trip up on 3 of them…

db2 ,

15 steps. You’re not counting the top, and the bottom is step 0 and we all know counting starts there.

jerome ,
@jerome@kbin.social avatar

Both of you are nerds.

GuybrushThreepwo0d ,

We are on a programming sub of a federated and open source reddit clone. We are all nerds.

ripcord ,
@ripcord@kbin.social avatar

I assume it was meant as a compliment.

jerome ,
@jerome@kbin.social avatar

(i said it with love)

UnRelatedBurner ,

sometimes i start my iterator with = -1. As I only +=1 it with a condition and I know that it will return true on the first cycle. I’ll chuck array[iterator] and need it to be 0 to start with ofc.

I just have no idea how to not do this, but it looks so bad, i need a i8 instead of a u8 at least because of this

Kache ,

What? My intuition is there’s always gotta be some equivalent nicer refactor that could do away with such an awkward construct.

In what kind of situation would that be totally unavoidable?

UnRelatedBurner ,

I could tell you my recent cenario, but it wouldn’t get us anywhere. because I know that it’s avoidable, but it’d take for me to run a different logic for only first element of my array. which is doable, but it’d make the code like 5 extra lines longer, harder to read/follow. But I just simply choose to put -1 and boom it’s fixed, just works.

another solution would be (without context) is to add one more variable and one more check to my foreach, but that takes more memory and cpu, I usually choose the i = -1, it’s ugly but not as ugly as other solutions would be

KIM_JONG ,

I hope I never have to see this code.

UnRelatedBurner ,

sending it asap (when I get home)

UnRelatedBurner ,

lucky, I forgot it

darcy ,
@darcy@sh.itjust.works avatar

thats great unless you want i to be an unsigned integer

edit: oops u already mentioned that

pec ,

That’s accurate. There’s always a few steps not included in the tutorial

beckerist , in The lengths we have to go to

spaces or tabs

GandarfDeGrape ,

Tabs. But really with modern IDE it’s irrelevant. Whatever the tech lead says I guess.

GBU_28 ,

With things like black, flake 8 and Isort I can code however I want, list/format however I want, and commit team compliant content. The dream is real

theneverfox ,
@theneverfox@pawb.social avatar

Wait wait wait, what is this black magic and how have I not heard of it?

GBU_28 ,

So you can have a local, and a team config. So at time of commit the code rules your team has selected are enforced. So if I looked at my code, on GitHub, it would look as expected by the team.

If I load it locally, it formats as I like.

Check out the cicd stuff on PRs for github

CoderKat ,

I love such formatters and wish they were even more widespread. In many cases, I really want consistency above all and it’s so dang hard to achieve that without an opinionated formatter. If the formatters isn’t opinionated enough, it just leads to countless human enforced rules that waste time (and lead to an understandable chorus of “why can’t the formatter just do that for meeeee”).

RogueBanana ,

Yeah but outside of that where the code is implemented or in a documentation, tabs are still easier to look through. And it does look pretty as long as there aren’t too many nested functions.

mexicancartel ,

Even with nested functions tabs are neat.

Does you app have too many nested functions?

Use tab width = 2

Do your app have too less nested functions?

Use tab width = 8

Is your app having average number of nested fns?

Use tab width = 4(mostly default)

And all theese can happen without modifying a single byte in the source file, unlike spaces!

reflex ,
@reflex@kbin.social avatar

Doesn't PEP 8 say spaces somewheres?

UlrikHD ,
@UlrikHD@programming.dev avatar

4 spaces, although I’ll die on the hill that tabs should always be used instead of space for indentation. Not just in python.

Ocelot ,

Questions like that are likely to start a war

TheBananaKing ,

semicolons

Agent641 ,

Full colons

Jakylla ,
@Jakylla@sh.itjust.works avatar

4 Spaces, then one tab, then 3 spaces, then 2 tabs, then 2 spaces, then 3 tabs…

Python supports that (and I hate this)

realaether ,

Please elaborate (eg which standard is this defined in?)

Jakylla , (edited )
@Jakylla@sh.itjust.works avatar

Not any standard (and actually not at all something to do for real), but try it, it works


<span style="color:#323232;">def magic(a, b, c):
</span><span style="color:#323232;">    if a > 0:
</span><span style="color:#323232;">    	if b > 0:
</span><span style="color:#323232;">    	   		if c > 0:
</span><span style="color:#323232;">    	   		  return 'All positive'
</span><span style="color:#323232;">    
</span><span style="color:#323232;">    return 'Not all positive'
</span><span style="color:#323232;">
</span><span style="color:#323232;">print(magic(1,2,3))
</span><span style="color:#323232;">print(magic(-1,1,2))
</span><span style="color:#323232;">print(magic(1,-1,0))
</span><span style="color:#323232;">print(magic(-1,-1,-2))
</span>

(you should be able to verify I used both tab and spaces f*cking bad way in this example, like I described)

Output:


<span style="color:#323232;">All positive
</span><span style="color:#323232;">Not all positive
</span><span style="color:#323232;">Not all positive
</span><span style="color:#323232;">Not all positive
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">** Process exited - Return Code: 0 **
</span><span style="color:#323232;">Press Enter to exit terminal
</span>
realaether ,

That’s really interesting. So does that mean the interpreter just checks whether the current line is more indented, less indented, or equal vs. the preceding, without caring by how much?

grozzle ,

“indentation is indentation!” (mr_incredible_cereal.jpg)

it may look messy, but would you actually rather Python didn’t support some inconsistency when the intent is clear?

being exact just for the sake of being pedantic isn’t useful.

kevincox ,
@kevincox@lemmy.ml avatar
  1. Use tabs.
  2. Enable visible whitespace.

Tada, your indentation level is nicely visible.

LanternEverywhere , in I'll just sort it myself

As a non-programmer, why does it do this? Sorting by leftmost digit seems super dumb.

jormaig ,

Because when it’s sorting some of them as ints and some of them as strings. JavaScript has implicit conversion to string.

kevincox ,
@kevincox@lemmy.ml avatar

Wrong. JavaScript sort’s default comparison function always converts to strings.

jormaig ,

Only if one of them is a string right? If you have only numbers then it works fine right? Right? (Please say that I’m right 😭)

kevincox ,
@kevincox@lemmy.ml avatar

No. It always compares by converting to string. I actually think this is more consistent then having different behaviour if you have a string somewhere in your list.

Basically the default comparator is a.sort((a, b) => ${a}&lt;${b} ? -1 : 1).

nero ,
@nero@lemmy.world avatar

It sorts them based on their unicode character, not the actual numbers. 1 is U+0031, 2 is U+0032, etc.

KiofKi ,
@KiofKi@feddit.de avatar

“By default, the sort() function sorts values as strings.

This works well for strings (“Apple” comes before “Banana”).

However, if numbers are sorted as strings, “25” is bigger than “100”, because “2” is bigger than “1”.

Because of this, the sort() method will produce incorrect result when sorting numbers.”

www.w3schools.com/js/js_array_sort.asp

floofloof ,

It also produces incorrect results in many languages other than English. You can pass it a compare function that uses localeCompare or Intl.Collator to get a correct alphabetical sort.

ImpossibleRubiksCube ,

JavaScript is what’s called an “untyped” language, so here, it assumes that the numbers are words, and tries to sort them alphabetically. Specifically, it tries to sort them alphabetically as a dictionary would in a left-to-right language like English. In this case, just as “apple” would come before “asterisk”, 100000 would come before 21.

(Some would argue that it’s more of a “weakly typed” language, I know, but I’m trying not to be pedantic here.)

Sorting them as actual numbers would require some extra explicit instructions and guides. Most typed languages, like C, aren’t like this.

affiliate ,

is there a good reason for javascript to work like that? python also isn’t typed like C and it sorts integer lists in the “normal” way, so it seems avoidable. (i don’t really know what im talking about here. i’ve never used javascript and i’m not familiar with how typing works under the hood.)

Quasari ,

Mainly because JavaScript was designed to work along side HTTP in a browser. Most of its input will be text, so defaulting common behavior to strings makes some sense.

affiliate ,

thank you for the explanation, that does clarify things

severien , (edited )

That’s misleading at best and most likely just false, and it’s worrying it’s so upvoted.

There’s no historical record explaining why this was designed this way, but we can infer some things. HTTP is very unlikely a factor, XHR / AJAX has been added years after the .sort() function. Additionally, it doesn’t make sense in the context that other comparisons are not string-wise (sort()/quicksort is basically a series of comparisons).

The trouble with JS arrays is that they can contain any values - e.g. [false, undefined, 1567, 10, “Hello world”, { x: 1 }]. How do you sort those? There must be one function to compare every combination of value, but how do you compare booleans and objects?

There’s no such function which would provide reasonable results. In that context, doing .toString() and then string-wise comparison/sorting doesn’t seem that crazy - every object has .toString(), it will compute something, and often it will work well enough.

There could be some additional smartness - if the array contains numbers only, it could choose to use a number-wise comparison function. But that would require a) extra implementation complexity (JS was famously designed in short time) and b) reduced performance - since JS runtime doesn’t know what type of values are present in the array, it would have to scan the whole array before starting the sort. But I guess the a) was the decisive factor in the beginning and backwards compatibility prevented improving the function later.

Quasari , (edited )

You are probably correct. I don’t know if it’s true, it’s probably more likely it was a way for it not to fail.

I said HTTP mainly because HTML is plaintext because of it. 1.0s main purpose was to manipulate the page. Of course Array objects weren’t added til 1.1, when netscape navigator 3.0 released, but it was still mostly 1.0 code. I felt like having everything be coercable to string made it easy for you to just assign it to the document. If you assigned the wrong thing it wouldn’t crash.

I originally thought there was a precursor to microsofts XMLHTTP in an earlier version due to the 1997 ECMAScript documentation specifically talking about using it both client and serverside to distribute computations, but it was far more static. So, I’m probably just wrong.

kevincox ,
@kevincox@lemmy.ml avatar

The hard part is sorting values of different types.

Python 2 had a order of built it types. Something like None < bool < numbers < strings. This means that you could sort anything like JavaScript and behaves fairly reasonably.

Python 3 takes the “safer” approach and comparisons of different types throw an exception. (You can override the comparison behavior for your own types and do something different).

JavaScript has conventionally been a very loosely typed language. So it almost certainly wouldn’t have chosen the exception throwing option. It does something similar to Python 2. But instead of just directly comparing the values of different types it converts them to strings first, then compares everything as a string. This is probably the most reasonable option. Otherwise you would have problems because 10 &lt; “2” and “2” &lt; 3 but 3 &lt; 10. How can that work? You have no total ordering! So basically because the comparison operators convert to strings if either argument is a string the default sort comparator really doesn’t have a choice but to do convert to string. The other option would be to define a total order just for the sort function but that seems more confusing.

floofloof , (edited )

It’s also an incorrect alphabetical sort in many languages that use accented characters. For a correct sort you need to pass it something like the localeCompare function or Intl.Collator.

fidodo ,

You can put any type of value in an array in JavaScript. You can have numbers, strings, booleans, arrays, and objects. So what should the default sort function sort by? Sorting by numbers makes sense, but what if it wanted to sort strings instead?

When you don’t know what value is in an array ahead of time you can’t assume how to sort it. When you’re controlling the program you can provide a sort function for the type of values you know will be in it, but when you’re writing the standard default sort function, there’s only one type that you can convert all the other types to safely and simply in the most predictable way, which is strings.

reverendsteveii ,

Think of digits like you would letters. You’re essentially sorting numbers alphabetically. It’s not the right way to do it, of course, but it’s the natural way to do it using a system like computers use that doesn’t necessarily differentiate between digits and letters unless you tell it to specifically.

CheezyWeezle ,

I think the main shortcoming here is that there isnt a way to specify the type to sort as, instead you have to write the function to compare them as numbers yourself. If it’s such a simple implementation, why isn’t it officially implemented? Why isn’t there a sortAs() that takes two args, the input list, and a Type value? Check every element matches the type and then sort, otherwise return a Type Error.

reverendsteveii , (edited )

I mean, there’s a sort() method that takes a comparator(a,b) such that if a comes first it returns 1, if b comes first it returns -1 and if they’re equivalent wrt sortinf it returns 0. If you absolutely need type safe number sorting you can use that to get it.

CheezyWeezle ,

Right, but you have to make that comparator yourself, it’s not a built-in part of the language. The only built-in comparator converts values to strings and compares them in code units orders.

Also, that technically isnt type-safe, is it? If you threw a string or a NaN at that it would fail. As far as I knew, type safe means that a function can handle type errors itself, rather than throwing an exception. So in this case the function would automatically convert types if it was type-safe to prevent an unhandled exception.

reverendsteveii ,

Not every use case can be the built-in default. I wouldn’t have made JS weakly typed if I were designing it, but once the decision was made to use weak typing it made sense to either have no default sort method or to have a default sort method that assumes a type.

What I’ve outlined for you is the interface for a comparator, not the implementation. You can type check and convert and do anything else you want under the hood of the comparator you write.

CheezyWeezle ,

It doesn’t have to be the default to be built in, tho. It could be an overloaded function, having the “default” be the typical convert-to-string sorting, and an overloaded function that allows to specify a type.

It’s just such a common thing, wanting to sort a list by different types, that I’m surprised there hasn’t been an official implementation added like this. I get that it a simple “fix” to make, but I just think that if it’s that simple yet kind of obscure (enough that people are still constantly asking about it) there should be an official implementation, rather than something you have build yourself.

reverendsteveii ,

Thats just JS for you. If you’re being generous, it’s a “quirky” language. If you’re being ungenerous, it’s a steaming pile of arbitrary decisions, gotchas, unexpected behaviors and problems that no one bothered to solve because there’s a workaround.

CheezyWeezle ,

Yeah, JS always seemed like the red-headed stepchild of modern languages. I’d be curious to know if other ECMAScript languages like JScript are as, eh, “quirky”, suggesting that the ECMA spec is the source of the quirkiness, or if JavaScript itself is the one making silly decisions. Technically, I mostly work with Google’s AppScript when I use ECMAScript stuff, but I’m fairly certain AppsScript is based off of JavaScript instead of directly based on the ECMA spec, so I don’t think it’s separate enough for me to draw a conclusion there.

Blackmist ,

Because it turns everything into text first. Just in case you try to sort [1,“apple”,45.99,false,[true,3]] rather than an array of similar things like a normal person.

jdeath ,

it’s lexicographic order

ipha , in The lengths we have to go to

Better than counting curly braces.

cerement ,
@cerement@slrpnk.net avatar

parentheses

30p87 ,

Even vim can show you that
^(fucking nano user)

UndefinedIsNotAFunction ,

There’s a joke here about using echo “some python code” > main.py in here somewhere but I can’t find it. Imagine I did instead.

thanevim ,

Import python.Joke.ShellProgramming()

grozzle ,

“the punchline is clearly trivial, the set-up is left as an exercise for the reader”

Overshoot2648 ,

Obligatory mirco is better.

30p87 ,

Is mirco a little man sitting on your SSD flipping bits manually as you dictate him?

lud ,

No that’s macro. Micro is when small gnomes sit inside your HDD and moving the read/write head around manually.

shotgun_crab ,

Why not both

EvokerKing ,

Because Python uses indentation instead of curly brackets, which is why this meme exists. Also jetbrains ide s like pycharm and webstorm do all of this for you.

mexicancartel ,

Even the mosy basic text editors does indentation for you, not even an IDE needed

EvokerKing ,

Not as good as jetbrains does, it automatically does things like realign when you paste things and lots of little things that improve the coding experience by a lot.

mexicancartel ,

Okay cool!

sentient_loom ,
@sentient_loom@sh.itjust.works avatar

I’ll take the curly braces

TheGreenGolem ,

Me too, any day. I hate everything where indentation matters. Let me just throw my garbage there and YOU sort it out, you are the fucking computer, not me. You do the work.

So fuck you, YAML! All my homies love JSON!

KIM_JONG ,

All your homies hate comments.

nilloc ,

Yeah Yaml is nicer than json, but I’m not into the Python indenting at all.

TheGreenGolem ,

My code also documents itself, of course.

JonEFive ,

I’m here to spread the good word about JSONC. It is the way and everyone should adopt it in place of JSON wherever possible.

wols ,

Yup.

Spaces? Tabs? Don’t care, works regardless.
Copied some code from somewhere else? No problem, 9/10 times it just works. Bonus: a smart IDE will let you quick-format the entire code to whatever style you configured at the click of a button even if it was a complete mess to begin with, as long as all the curly braces are correct.

Also, in any decent IDE you will very rarely need to actually count curly braces, it finds the pair for you, and even lets you easily navigate between them.

The inconsistent way that whitespace is handled across applications makes interacting with code outside your own code files incredibly finicky when your language cares so much about the layout.

There’s an argument to be made for the simplicity of python-style indentation and for its aesthetic merits, but IMO that’s outweighed by the practical inconvenience it brings.

merc ,

But, nobody ever copies code from Stack Overflow!

kameecoding ,

if you have to count the curly braces I understand why you are a python developer

vosjedev ,

yep.

Knusper ,

You don’t usually count them. They just have to form a neat diagonal.

Reptorian ,

Also, highlighted the way you expect when you click next to braces works too.

fidodo ,

Have you tried using an auto formatter? Let’s you write code however and fixes the structure automatically on save. It’s way easier for me to write curly braces then hit ctrl+s than have to select multiple lines manually and tab in and out. I feel the biggest gains I’ve made in productivity came after I learned to embrace tooling.

James_Ryan , in It's routine

You all use notepad to code?

GigglyBobble ,

According to my recruiter, you code on a whiteboard.

JazzAlien ,

These memes are made by first semester cs students

fidodo ,

I was taught java my first semester. I certainly hope no schools teach dynamic languages in the first semester.

alphacyberranger OP ,
@alphacyberranger@sh.itjust.works avatar

I had to edit code on terminal using nano in production.

original_ish_name ,

Use the great vim, install a linter plugin if you need one

257m ,

Why not just use vim? It’s preinstalled.

alphacyberranger OP ,
@alphacyberranger@sh.itjust.works avatar

Not inside a docker container.

257m ,

Oh.

ChickenLadyLovesLife ,

I used to write websites with Notepad. The upside is that you really had to learn HTML to do it; the downside is that it proves to the world that you’re a fucking lunatic.

pamymaf , in The lengths we have to go to
@pamymaf@kbin.run avatar

@alphacyberranger
This is why I have my VSCodium set to highlight all indentation levels in my settings.json

To see the editor indent guides, set "editor.guides.indentation": true and "editor.guides.highlightActiveIndentation": true.

editorIndentGuide.background: Color of the editor indentation guides.
editorIndentGuide.activeBackground: Color of the active editor indentation guide.

https://code.visualstudio.com/api/references/theme-color

Toldry ,
@Toldry@lemmy.world avatar

Can you please share a screenshot of how this looks like?

pamymaf ,
@pamymaf@kbin.run avatar

@Toldry

Here's the relevant section of my settings.json

json { "workbench.tree.renderIndentGuides": "always", "workbench.tree.indent": 15, "editor.guides.indentation": true, "workbench.colorCustomizations": { "editorIndentGuide.background": "#fd6bff", "tree.indentGuidesStroke": "#fd6bff" } }

@alphacyberranger

Konlanx , in I'll just sort it myself

This is due to the default sorter in JavaScript sorting by the string value. The reason for that is that this won’t create errors at runtime. Since JavaScript does not have types, this is the safest way of sorting.

This works:


<span style="color:#323232;">const unsorted = [1, 100000, 21, 30, 4]
</span><span style="color:#323232;">const sorted = unsorted.sort((a, b) => a - b) 
</span>
UndefinedIsNotAFunction ,

Get out of here with your sensibility!

^kidding, ^js ^via ^ts ^is ^my ^life.

jmcs ,

Which is a fine decision if you have a programming language to do silly stuff on a personal geocities page, but a horrible one when you start using that language to handle serious data. Silently ignoring what’s probably a bug is dangerous.

seitanic ,
@seitanic@lemmy.sdf.org avatar

Which is a fine decision if you have a programming language to do silly stuff on a personal geocities page

And that is, of course, what it was designed for.

JS is brilliant considering that it was created by one dude in 10 days. Nobody thought it would become nearly as important as it has become.

AVincentInSpace ,

ah yes, a reasonable solution to that problem that any human would think of

ah yes, a reasonable problem that any human would think of – “what if someone tries to sort a list containing some integers and some arrays, and our interpreter needs to keep chugging instead of telling the programmer they fucked up?”

Enkers , in Zero to Hero in 1 hour

OK, but who can I sue if I suffer grave bodily injury while installing kubernetes?

aksdb , in I'll just sort it myself

Looks like they should have called that function sortOf()

darcy , in It's routine
@darcy@sh.itjust.works avatar

bro has never heard of reading the compiler error

UndefinedIsNotAFunction ,

When you’re in VSCode with 10 different red squiggles, who can be bothered?

Edi: Also, OH MY GOD JUNIORS WHO WON’T JUST GOOGLE THE ERROR MESSAGE.

darcy ,
@darcy@sh.itjust.works avatar

vim supremecy

redempt ,

man will never survive the rust programming language

Klaymore ,
@Klaymore@sh.itjust.works avatar

Python issue

ChickenLadyLovesLife ,

I first started programming with TurboBasic which had the oh-so-amusing characteristic that you could have variable names of any length but the compiler only used the first two letters (and case-insensitive at that). So “DonutCount” and “DoobieCounter” actually referred to the same variable.

Really good times trying to debug that kind of shit.

PoolloverNathan ,

I’m trying to write an intentionally bad programming language. Don’t give me ideas.

ChickenLadyLovesLife ,

Make sure you add a “Variant” type lol.

PoolloverNathan ,

It’s called a String.

ChickenLadyLovesLife ,

Oh you sweet summer child. The Variant type in VB was so much worse than just a String.

PoolloverNathan ,

I’m just complaining since I have the fortune of using a language where everything is represented as a string.

What is 3 + 5?

ChickenLadyLovesLife ,

35, naturally!

PoolloverNathan ,

A lot of people would say 8, I’m glad I didn’t have to correct you.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • [email protected]
  • random
  • lifeLocal
  • goranko
  • All magazines