Case in point: https://stackoverflow.com/q/19622198
What's up with the "man Y" aversion towards the usage of examples in the man pages? I don't expect some behemoth like ffmpeg to have a billion examples in the man files, but damn, every other reasonably sized CLI app would be so much easier to use, if you had just a dozen or two of examples at the end of the man file.
tldr ffmpeg
Sometimes, the original poster is not mistaken. Especially when an expert asks a question, there's a reason for it. Assuming the expert to be a beginner who hasn't tried easier solutions is degrading, and forces experts off the site.
Actively insulting your userbase, especially your expert-level userbase, is a bad idea. It leads to StackOverflow falling and collapsing over the years.
IMHO Copilot Chat has picked up on these bad habits.
I literally cannot remember when last SO was useful time, due to the false positive identification of the XY problem.
At least with ChatGPT, it's much faster to get it to answer the question asked and not the question that was not asked.
the XY problem-problem
I never saw this term before, but it is perfect. So many times I have experienced it when asking questions in mature tech domains. It is so frustrating. Frequently, my question is asked poorly from the view of an expert, so they sweep it aside as not a real problem. Only after getting help (from comments) to provide more info or improve the writing, does the expert suddenly agree it is an issue.This is also why I no longer waste my time raising bug tickets for open source projects. You just get shouted down and feel terrible about yourself. I raised many "WONTFIX" bugs in my career against open source projects. What a waste of my time and a harm to my self esteem.
So I do know this problem (problem-problem) very well and I've since stopped asking or answering on SO.
This is called the XY problem and is extremely common on tech related forums and mailing lists.
But I think it will always be up to the user of SO (not the poster or answerers) to make the real judgement on what is useful.
Often I think SO is useful to use as a bunch of puzzles folks solved. You gotta decide if they are relevant.
SO is at its best when it’s actual error debugging IMO. When you google some specific error whoever else has the similar error it’s right there. I feel like GitHub is replacing this more and more though - I often get the GitHub ranked specific error higher than Stackoverflow these days. Usually you get better discussions on the GitHub issues too, for a multitude of reasons. Two off the top of my head:
1. all of the people working on the stuff related to the issue are very close by
2. the moderation is not nearly as heavy handed as SO.
ChatGPT is also much better than SO as well if you can give it enough context and the thing you are working on wasn’t built on stuff released after 2021
I also really like Stackoverflow for current event type stuff, like black swan type events. One recent example is when google’s Paris data center was on fire and infra guys were helping each other out trying to get systems online.
All of this combined means that StackOverflow the forum is probably on its way out though. They made the mistake of taking VC money and the model hasn’t really proven profitable so they have really made some poor decisions to please the vc overlords.
I won’t miss Stackoverflow much other than nostalgia unfortunately - better alternatives have arrived. Seeing the decline of all of the other Stackexchange sites kind of sucks though. There aren’t better alternatives for many of those
Both sides can identify ChatGPT answers as being wrong. The question is how can they be deleted. The moderators say they can delete a lot by manual inspection. SO say that AI tools were deleting wrong ones.
Which is more than Google, or a previously answered StackOverflow question, can say.
But then, it’ll probably greatly vary depending on the problem you are facing.
Bots closing issues because someone doesn't spam the page. Closing as duplicate of (non related bug). A slew of random solutions that are only tangentially related and don't really solve the problem.
Comes up all the time when people ask how to do things in bash/sh. I know there are better tools for the job, but this is the one I have.
Explaining what the XY problem is to people who are telling you about it's high false positive identification is, itself, an XY misdiagnosis.
Your reply is an example of what people are complaining about - you are addressing the issue you wished was asked, not addressing the issue you were presented with.
But those are correctly diagnosed XY problems. No one is complaining about those.
My parent was told the issue is too many incorrectly identified XY problems, and responded with an explanation of what the XY problem is.
That is the example of a misdiagnosed XY problem, which was kinda my point. This sort of behaviour makes the actual experts leave the site in droves.
If, when answering a question, one where to discard the answer the minute they write "Why would you want to do this?", you'd get much fewer incorrectly diagnosed XY problems.
As I said in a different thread, ChatGPT sometimes does this as well, but at least with ChatGPT, when it is answering a question that was never asked, it doesn't also act like a condescending jackass. There are no "Why would you want to do this?" type of questions.
But on second consideration, I suppose you would not, either, and I suppose you are specific'ly talking about responses which, each taken as a whole, are easily interpreted as some form of hostile.
I responded to the person above me when there were literally two other comments in this thread.
> Your reply is an example of what people are complaining about
Defining something is not an example of an XY problem.
> - you are addressing the issue you wished was asked, not addressing the issue you were presented with.
As I am not much of a programmer but work on electronics and computer hardware I deal with different types of people than would be on SO, so I am not addressing anything but my own experiences.
And then to ice the cake you find the question because your question has been marked as a duplicate of the older question where they answered using unix binary tools… and you specifically asked about doing something in “pure shell script” or something similar to that phrase.
Stack overflow is fundamentally a system design that breaks down at scale due to misalignment of incentives that are necessary for it to work well at smaller scales (as can be seen in the successful operation of various smaller Stack Exchange sites for various topics such as Law, Aviation, Physics, etc)
I must admit that I don"t buy in to that philosophy and like using one tool so for scripting I would do all in python, so I would not be asking that question.
Many Linux users think that their way is the only and thay means bash as the shell and many others like GNU coreutils, gcc etc.
You may know, but someone else asking the exact same question may not.
So sorry then, but listing every constraint and design descision it is.
You don't need to do that, a simple "I know what the XY problem is, and this isn't it" prefixed to every question you ask should be enough to stop the race to tell you all about the XY problem.
I mean, at this point it's clear that more people know about the XY problem than people ho don't.
True, but that logic goes both ways: Unless told otherwise, whoever reads the question, isn't required to assume that there is a constraint.
If I get asked how to water plants with a sieve, without getting told why getting a watering can is impossible, "You don't, use a watering can", is a perfectly acceptable answer.
Especially when the question is aked in a question archive, rather than a help-forum.
If specific constraints apply to a question, then they should be a part of the question.
I’m sure if you’re twitter Kafka is actually a better solution, for everyone else, it isn’t.
"I'm trying to learn foo.js and attemt to do so by porting Tetris to it. I know foo.js is a terrible option for a game. So. How can I write to the canvas from foo.js?"
Is often answered properly, if only because to many it's a nice puzzle.
"How can I write to the canvas fro foo.js?" Is different in that it will attract a lot of people explaining that foo.js deliberately did not allow writing to the canvas, because Z"
This may help less experienced engineers not understanding their problem set, but for a more experienced engineer it's absolutely obnoxious to think of all the ways to defend my question so I don't have to deal with a rush of "oh but you should do this instead" answers getting up voted that don't actually answer my question, then asking to accept the answer.
To one set of users it's possibly helpful, to another it's useless if not also condescending, often condescending to both sets.
The bottom line is now, SO is so filled with these types of responses, I can't expect to get a very specific question answered, which is really the only reason I'd ask a question in the first place, so why use it?
There are plenty chat groups now via Slack and discord in my field where I can get much more direct answers. People aren't worried about getting down voted for a bad question, people aren't giving low quality answers to boost their points. So for me, SO is practically dead except for the occasional obscure error message that I can query for there.
My experience is that it's not so much a defensive argument, but context. My example was poor in that it could be misread as a defensive argument, sorry about that.
I meant it to show how adding some context changes the question. Because, in programming, it is all about context. AKA that "It Depends" meme.
Want to host videos on a laptop (which has a big SSD) and stream them to a Pi (which is attached to a big screen) over a LAN? Hey, here's a post about how to host videos on a Pi and stream them to a laptop! Upvote and share! My point is, you don't even have to be trying to do something all that strange for people to apply the XY Problem logic and refuse to help you.
(Solution: NFS mount and a patient understanding that the Pi cannot play certain kinds of video, so you'll need to transcode some of them first. See? Nothing bizarre, but surprisingly outside-the-box given what I could find online at the time.)
One common example I've run into lately, as I've been reading about state machines, is people asking how to implement a simple react component as a state machine, and others objecting to the premise of the question since using a state machine for a simple react component is obviously a bad idea.
It’s fine, I think, to answer a question and then suggest a better method. It’s presumptuous in the extreme to dismiss a question with some pseudoacademic neologism.
IOW, any time you think you have spotted an XY problem, you're probably wrong.
And that's the problem with SO moderators and regulars. They classify everything as an XY problem because it allows them to answer the question they know the answer to rather than answer the question that was asked.
The thing people don’t get is: when you answer on SO you’re not answering that poster. You’re answering anyone who will ever have this question. It’s quite arrogant to assume it will be an XY for every single person forever more.
The proper way to answer is to answer the question exactly as ask and then insert your “but you probably should be doing Y instead” at the end.
Doing things the right way is BETTER.
If you can't, you should add a bit to your question saying "I know the standard way is to do Y, not X, but because of reason Z I can't do it."
Most readers will be able to use the "right way".
My experience with less experienced developers is that they ask the exact question as that is where they have stuck but they are ignorant of the better ways.
I do tend to answer differently depending on the questioners reputation. If they have a higher rep then I can assume they know what they are doing.
Because you're answering every person who ever will ask, a lot of the people who pass through your question & answer will be people who don't know the difference between the right way and the wrong way. If they want to know how to do something the wrong way, because they don't know what the right way is, an answer that simply tells them how is a bad resource.
It's not enough to tag caveats onto such dangerous answers, because people can't read. Instead, newbies should have to overcome a sufficient amount of opposition to filter out those who don't know why they're doing what they want to do, and the rest can make the little effort of being very explicit about why they want to do something the wrong way.
Can't be done, will be marked as duplicate.
Then Googling for doing X with Y gets you a bunch of closed questions and a labyrinth of links all leading to a question that was answered 10 years ago on a different software version where Z possibly was the right way to do it but now isn't.
And of course there's no way to reopen the question because it has been closed by a level 15 Magister Templi moderator and a lowly level 3 apprentice moderator like yourself needs to either answer 146 more questions or moderate 192 other questions to clear enough arbitrary hurdles to achieve holy question reopening powers.
And there's possibly an appeals process but that involves recruiting 13 moderators who you have to convince to give this question special treatment and declare that one of their number of sacred moderators made a mistake.
Some of it is that SO has gamified shitting on and suppressing the question/asker instead of gamified providing the answer, and built a culture of toxicity that tolerates the abuse of the tools in this fashion.
And when the CEO asked them to tone it down maybe 5 years ago they basically did a collective “am I so out of touch? no, it’s the askers who are wrong”. Extremely funny to read the meta responses to that at the time.
https://stackoverflow.blog/2018/04/26/stack-overflow-isnt-ve...
https://news.ycombinator.com/item?id=16934942
(admittedly "women and people who don't speak english well are particularly unlikely to adopt to the pedantic neckbeard culture we've built" is a spicy take for your average SO'er, or wikipedian, but it's also not actually a wrong one either. SO's culture problems probably do disproportionately chase away users with marginal engagement, nobody likes putting up with formalized neckbeard culture.)
Then you have to do two things in your answer:
1. Correctly answer the question as asked.
2. Add your opinion about the "right way" to do it.
If you only do #2, you are failing "every person who ever will ask."
[0]: https://www.joelonsoftware.com/2000/04/26/designing-for-peop...
You know that's not your responsibility. If some newbie makes a mistake, that's their responsibility (and a learning experience for them).
And frankly, I think you overestimate how valuable and essential your non-responsive answer is.
> https://www.joelonsoftware.com/2000/04/26/designing-for-peop...
That link is about users. You're misapplying its lesson if you're using it to justify not answering a developer's development question.
Quit coming up with excuses for not answering the question.
Why do you think "users" is an inaccurate description of the role question askers have on a developer Q&A board?
Put another way - when was the last time you used a development tool, or a library, or some other resource, and sat down to read the full documentation of it? I would posit that that's very rare as an activity, even for developers who need to develop a deep understanding of what they're using.
It's much more common to learn by doing, and the limit of that learning is very often what the developer can't do. Answers which easily enable developers to do something are overwhelmingly likely to lead to developers doing that thing - much in the same way that a long page of library documentation which gives an example is likely to lead to developers repeating that example, even if at the end of the docs, there's a little caveat saying that you shouldn't follow the example for so-and-so reason.
>If some newbie makes a mistake, that's their responsibility (and a learning experience for them).
But is it a good experience? Sure, maybe they'll learn that they always have to read the whole answer before they use any part of it. But we sensibly have abandoned this no-guardrails approach to teaching in almost every arena where it's been used, because it's not really suited to the way people do things in real life - and in real life, people often end up affecting others with their mistakes.
Does junior developer who learns how to glue SQL strings together in their favourite programming language, and makes the "small mistake" of not learning anything about SQL injection in the process, benefit from the learning experience when they cause a data leak? Do their customers? Or should the learning resources they access maybe use the pedagogical tools available to make sure those kinds of mistakes are really hard to make, even if it occasionally inconveniences a seasoned pro?
The are a lot of different kinds of "users," and I think the kind of thinking in that article is totally inappropriate when applied to developer Q&A board.
To be perfectly blunt: the result if what you're advocating is to condescendingly treat experienced people as newbies so dumb that their question should not be answered, because you think they're so dumb the real answer might distract them from the lecture you want to condescendingly give them.
People like that are super annoying and almost always unhelpful.
Every single fucking question I ask on SO has some lazy condescending dude chiming in to answer the easy question he thinks I should have asked, after he totally failed to understand the constraints that made my question hard. Of course, lazy condescending dude always thinks he knows better.
Here, I'll coin a name for a problem I see much more often, which is called the XX problem:
1. User has problem X, and asks for a solution for it.
2. People viewing the question decide that the original user actually has problem Y.
3. Those people tell the original user that they actually want to solve problem Y, flame the original user, and if they have the power to do so, edit the original user's question to be asking about problem Y.
4. Those people use poorly-thought-out pop-social-psychology to justify their shitty behavior.
5. The original user still doesn't have a solution to problem X, because they really needed a solution to problem X all along.
You realize that it's dismissive and condescending to ignore the problem I'm describing and respond with an assumption that I'm unaware of the tone of my post, right? Pot, meet kettle.
Because you're propagating the idea that you (or anyone asking questions) knows better what a person asking needs than the person asking does. Telling people you know what they need better than they do is pretty close to the definition of condescending.
People are emotional because nearly everyone who asks a question on the internet has to deal with people telling them "You don't actually want an answer to your question, you want an answer to this other question." By boosting the signal of the horrible XY problem idea, you're contributing to that problem.
I'm not saying this kind of miscommunication never happens, but the opposite is actually far more common.
Unfortunately I had no idea about the perverse incentives for question answering and the terrible moderator practices on SO, so I walked into a minefield giving an answer here that I thought was helpful based on my experience as a hands on technician working directly with people -- but it turned out to be a lightning rod for people's frustrations on these issues.
But apparently I can't comment as a new user so I guess the discussion will just be "because calculus classes use matrices in examples".
[0] https://matheducators.stackexchange.com/questions/26417/why-...
What's the name for the "I don't want to use a sledgehammer to solve a problem that should be solvable with a screwdriver" problem?
Or in this case, the "spinning up 300 lines of code to integrate an XML parser vs. a dozen lines of code based on regexes" problem. For reasons that are unclear to me, XML parser libraries tend to be painfully difficult to use (speaking from personal experience with 4 different XML parser libraries).
I don't think it's a surprise to anyone involved that an XML parser is going to solve the problem.
1. To do Q that way you would to <solution, or at least pointers to how to find the solution elsewhere> but you will likely it far more efficient/easy/whatever to do <something else> instead.
2. Q can be achieved far more efficient/easy/whatever by doing <alternative>, but if you are stuck with using Y then try <solution or pointers as above>.
Of course this relies on you correctly deriving that they are trying to achieve Q, or them explicitly stating the fact. Maybe instead they are trying to get to K.
It probably won't last forever without people generating new answers somewhere else, but it answers a lot of things correctly, and the things it gets wrong are easy enough to verify.
I really hope ChatGPT causes StackOverflow to change.
It already has, and not for the better. SO is currently awash with nonsensical answers that are clearly the result of feeding the question into ChatGPT. Not to mention questions like this: https://stackoverflow.com/questions/76748781/how-pythons-bui...
Yes, there are plenty of rude replies, but sometimes it helps to assume what somebody really means is they failed to do a context switch. Exchanging more details can help turn a 'madness' into a method. Even if they were outright rude, doing this can lead to an answer that might not otherwise be given (even though that answer may be provided by someone else).
The user asks a question that can be answered quite easily, and dozens of people post answers claiming that this is the wrong way to do it and that they should use some other tech to solve the problem.
Some people on Stack Overflow care more about showing off how smart they are rather than answering questions, and I think the point system attracts these people.
[1]: https://stackoverflow.com/questions/1732348/regex-match-open...
As someone who was a newbie at the time when it was posted, who was looking for a way to parse HTML, I took away that it's just really the wrong way to go about it. I didn't feel crapped on at all.
But the asker is very clearly a newbie. The question does not contain further context. The asker's suggestion is wrong (I think). And we've all worked with junior engineers who try to use the wrong tool.
The answer is a whimsical way of making an appropriate suggestion in this inferred context.
Also, to be fair, I think it's not mathematically impossible to use dark regex magic (with look-behinds and such) to parse HTML, but that's a discussion for another day...
If you scroll down long enough, you will see answers explaining that. But they arent upvoted as the answers suggesting the questioner is an idiot.
I and I think many other are sad that S.O. removes many serious work related questions (have lost count of how many times I saw the perfect question with the perfect answer, with a note that this isn't what Stack Overflow is made for and these questions only exist for historical reasons).
As mentioned elsewhere, this is an old question and both the kind of question and answer wouldn't be allowed these days.
However, I also fundamentally disagree that questioning the assumptions in a question is unhelpful. You want to solve a problem, find an approach and want help because you have problems with the approach? What if the approach you took _is_ wrong? Its very helpful especially for advanced beginners or at the intermediate level, to be given a different way of solving the problem even if that is not what you asked.
It depends on context if this is just pedantry or genuinely helpful. The best answers I found start with answering the question that was stated, but then proceed in showing how the problem behind the question can also or better be solved.
I'm fine with indirect, "question-the-premise" comments, but they should be posted as comments, not answers, because they are in fact not answers.
Stack Overflow isn't a site for beginners, it's for "professionals". At least, that's what all the Stack Overflow defenders tell me every time I criticize the snarkiness, rudeness and patronizing manner of many answers/comments you receive on Stack Overflow.
Jesus this is cringe
So the answer is actually on topic.
It may be a bit… stylistically unusual, but I think I came away with a pretty good idea of what the answerer thinks.
Yes, and they are factually correct in doing so. The correct answer to the question: "How do I use a hammer to tighten a screw" isn't a lengthy description of how to perform some magic with a hammer. The correct answer is: "You don't. Use a screwdriver."
HTML isn't parseable with regex. The various answers under the question explain in great detail why [1] that is the case.
SO isn't a help forum, it's a question archive. The purpose of an answer isn't to solve one guys specific question, but to provide an answer that is useful to all people who ever stumble upon this question.
My car broke down in the middle of the desert because of a screw that came loose and all I have is a hammer. You have just condemned me to death because you assume you know better.
Yes, and answers on that very page, with lots of upvotes, do exactly that. People looking for answers online, can reasonably be expected to scroll down a page with results.
Poster is not asking for this. He is asking how to parse a specific subset of HTML. And it is demonstrably parseable.
> The correct answer to the question: "How do I use a hammer to tighten a screw" isn't a lengthy description of how to perform some magic with a hammer. The correct answer is: "You don't. Use a screwdriver."
It is not the appropriate way to tighten a screw, but there likely is a correct way to do it with a hammer.
It is fine to point out that there are better ways to parse that HTML, but it is not wrong to do it with regexes.
Sorry to be blunt, but having coworkers like you make the job really annoying. I'm not a newbie, but a seasoned programmer. If I'm asking a question and am in a domain with a fair amount of experience, don't give me patronizing answers.
Poster is not the one answers are for. Answers are for everyone who stumbles upon this question in the future, and the general topic of the question is very much about parsing some HTML with regex.
Again: SO != Help FOrum
> but there likely is a correct way to do it with a hammer.
No, there isn't. Because the correct way is to use a screwdriver. There is certainly a way to do it with a hammer, same as there is a way to write a webserver in brainf__k. Doesn't mean that way is good or should be done.
> Sorry to be blunt, but having coworkers like you make the job really annoying.
Bluntness is fine. I will be blunt as well: Having to fix code full of hammers used to tighten screws is a lot more annoying than having colleagues who try to prevent that from happening in the first place.
So, no, the top 3 answers are all bullshit.
The questions isn’t about parsing, the question is about recognizing a token.
So here is the reason: the top voted answers are wrong.
"Some" is an understatement.
My favorite example, from "TeX stackexchange" :
https://tex.stackexchange.com/questions/100574/really-wide-h...
Quote from the actual answer (which is not the bogus accepted one):
The question wasn't "should it be done?" But, for the same reason men climb mountains, "could it be done?" The answer, [...] is yes. Thus, we introduce [...]
> How do I shoot myself in the foot? I’m pointing the gun at my foot and pulling the trigger, but nothing is happening.
Is it:
> A common reason for guns not firing is that they aren’t loaded. Try loading the gun and trying again.
…or is it:
> Woah, hang on a sec! What are you trying to achieve exactly? It seems like you are doing something very wrong here. I’m sure there’s a better way to do whatever it is you are trying to do.
There are many technical questions that give the very strong impression that somebody is asking how to shoot themselves in the foot. It’s not responsible to blindly answer the question regardless of the consequences. Yes, people sometimes overcorrect for this which can be annoying, but they are only trying to steer newbies away from shooting themselves in the foot.
But it's hard! On the one hand, you don't want to teach people to do the wrong thing (especially not on SO, where answers are often copied wholesale and pasted into production code), but also not answering the question as asked usually doesn't help the OP at all.
If it's not clear what they're trying to achieve I usually leave a comment asking for clarification rather than answering, though.
Sure, but some of the stuff I've looked up in the past is answered with helpful comments like "You won't need to do this, your CA will do this for you" or "this is handled by your certificate verification stack, you don't need to be involved in this stuff".
Well, thanks, but I'm actually implementing both of those things right now and I'm having an annoying issue with figuring out how the API for the (very popular but IMHO poorly documented) library I'm using for part of it hangs together.
> Yes, people sometimes overcorrect for this which can be annoying, but they are only trying to steer newbies away from shooting themselves in the foot.
I think sometimes its because comparatively the respondents are newbies, and are repeating received wisdom.
Thus, the first response is the correct one.
On preventing people from doing what they intend to do...I think the main issue is the world is a large place, people face many situations, and most advices given in good faith only have an extremely limited view of what people might need to do. And it's kinda awkward to ask for someone's whole life to decide if they are right in wanting to straight rename a table column on their live production DB.
Something could be a bad idea 99% of the time. But that leaves millions of people in the 1% for whom it's the best course of action.
When I find a straight and relevant answer that is great, I like browsing SO, but I wouldn't dream having a question just to find myself in a word duel with some very eager contributor steering me into his favourite domain. I want to get ahead with a task not being in the quest of finding The Ultimate Solution or having a social life over interesting and related topics.
This is one I ran into recently:
https://stackoverflow.com/questions/30196175/const-methods-i...
The question is very clearly formed. The accepted (and currently top) answer does a good job. But at one point the other answer which is badly worded and confusing was at the top. And I don't think it should ever get the top position of the answers.
It's ok, you deserve the hate. After all, you're asking the wrong questions.
They want questions that are "textbook-worthy" or possibly "encyclopedia worthy". They're on record as having said this officially. If programming and technology is just messier than that, if it's more complicated than that, and you still have questions that don't fit because of it... well, fuck you. They don't exist to answer your questions, they exist to answer great questions that they can use to build up this pretty little sight that now has some purpose other than whatever it was you thought you were using it for.
The Z guy, he's playing their game. He's awesome. You, you need to be punished until you comply.
I wanted some information on figuring out what texture serialisation was supported on a given client for a WebGL app. I needed to know this because I was optimising the client and had to deal with very large textures (it was an AR / augmented reality context).
Cue a barrage of comments along the lines of "you shouldn't need to do this" "the abstraction means you can simply assume the GPU has infinite texture memory" (!) "just provide all the formats and let the GPU bridge figure it out". Then the question had a downvote and that was that, cast to the bottom of the pile.
It seemed to me everyone responding to my question had this assumption "questioners are morons". A moron asking about texture serialisation is a paradox, ergo the question must have a faulty premise.
OP: “how can I accomplish X doing Y?”
top voted response: “I wouldnt do X by Y. Instead, I’d consider Z. It’ll do everything X by Y would do, plus these other things.”
buried sub comment to top voted response: “that’s not what he asked, to do X by Y (exact solution provided)”
then 10 comments blasting the guy who actually answered the question for not doing it the way the top voted answer did it.