The lack of a case against Python 3 - <AUTHOR> http://blog.lerner.co.il/case-python-3/ <comment><USER2> > But again, the population that will be affected is the 10% who deal with > Unicode.

I doubt that only 10% of people are dealing with unicode. Rough estimate 10% of the world speak English as a first language and almost all other languages are written with (at least some) non-ascii characters.

In my experience (I'm from the 90% part of the world), people new to programming and python stumble really early into some (to them) hard to debug (UnicodeDecodeError: ... can't decode byte) errors in python 2. Then it's time to explain the whole strings are not bytes, unicode, encoding and so on thing. In python 3 that's also needed, perhaps even earlier, but bugs are much easier to fix and programs fail on the first run, not when you finally enter some non-ascii characters.

In my mind, python 3 clearly is superior to python 2, and would be even if nothing but the unicode support changed.

<comment><USER3> > Rough estimate 10% of the world speak English as a first language

ASCII isn't even good enough for that 10% – British people need £, which isn't in ASCII – not to mention things like em dashes, en dashes, and curly quotation marks that word processors tend to add.

<comment><USER4> Kids these days also use emoji.

<comment><USER5> Also unicode.

[http://unicode.org/emoji/charts/full-emoji- list.html](http://unicode.org/emoji/charts/full-emoji-list.html)

</comment></comment></comment></comment><comment><USER6> This idea that some developers don't need to deal with unicode, really needs to die.

If you're creating a web app and don't support unicode input, you're doing it wrong. You probably can't accurately store the names of your customers, for starters.

<comment><USER7> OP here. I teach Python to Fortune 100 companies, more or less every day.

You're totally right that people who deal with outside-world data need Unicode. Anything that deals with users _MUST_ deal with Unicode.

But a huge proportion of the people I work with -- in Israel, China, and Europe -- couldn't care less about Unicode. That's because they're processing logfiles, dealing with test automation and system administration. For them, Unicode is important a very small proportion of the time.

So I stand by my assertion that a small proportion of developers need to worry about Unicode. But I also agree with you that Unicode is absolutely crucial in the modern world, and that a language lacking good Unicode support isn't going to get very far.

<comment><USER8> > That's because they're processing logfiles, dealing with test automation and > system administration ... So I stand by my assertion that a small proportion > of developers need to worry about Unicode.

You come to this conclusion based on your dealings with a small subset of developers within a small subset of companies?

I think many other developers in the fortune 500 companies outside of the subset you deal with would laugh at that conclusion, then go back to developing apps that deal with people/locales all over the world.

<comment><USER9> This also describes my entire team. And the team before that. There are at least as many developers out there who don't write user facing code as those who do.

When I do run across Unicode, it's just a matter of passing it through, which is usually pretty easy to do.

</comment></comment></comment></comment><comment><USER10> People still stuck in python2 and arguing that python2 is better than python3 is weird.

I get it, more features does not mean better and newer does not mean better but seriously, just do the jump to python3. It's not that much work and the language is much nicer to work with.

I've built a library with python2/3 support and do most of my work in python3. Maybe my web dev background biases me somehow, but I can't remember the last time I had problems with a major library not supporting python3.

To me this seems more like tradition/age/generation -related. Those who started back in python1/2 are the ones with problems moving to python3, while young people who started with python 3.x are already running 3.5/3.6.

ps. like the author said, there will always be large corporations stuck in very old techs - that doesn't mean the rest of the world too has to use Cobol or MUMPS.

<comment><USER11> > but seriously, just do the jump to python3.

Or jump to another language.

Here's my problem: I don't program unless I get paid, and I simply cannot sell this crazy idea: "hey, you know all that software you paid me to write? how about you pay me again so you can have it in python3?"

It seems like if I want my programs to run for more than ten years I shouldn't be using Python.

<comment><USER12> IMO that's the wrong approach. The correct one would be: "Hey, you know all the software you want to pay me to write? It will be in Python 3 now".

<comment><USER13> I consider Python 3 a huge benefit for a similar reason: I can avoid or charge $$$ for people still using 2.6 (e.g. on ancient RHEL). There's always somebody. 2.6 is pretty sucky, not to mention unsupported by the PSF.

If you support 2.7, some "clever" manager or client will say that 2.6 support surely isn't so unreasonable. It is. 2.7 is legacy only now IMO.

<comment><USER14> I'm happily using and deploying Python 3.6 on CentOS 6 using pyenv. You don't have to use the system Python unless there's a policy requiring you to do so.

<comment><USER13> I agree, and EPEL works fine on RHEL, too. But it wouldn't be _enterprise_ without some BS rules. Hence why compatibility "issues" are such a blessing for detecting enterprise BS early on.

<comment><USER14> You can get a more recent Python from Software Collections, too:

[https://www.softwarecollections.org/en/scls/?search=python](https://www.softwarecollections.org/en/scls/?search=python)

Up to Python 3.5 and 3.6 will probably follow shortly after release.

This is blessed and QA'd by Red Hat themselves, so it's as good as it gets.

"My distro only has Python 2" has to be one of the worst excuses not to use Python 3 :-)

Obvious exception are systems tools (did you know that Ansible modules have to compatible with Python 2.4 since that's what CentOS 5 uses?). But those are the absolute minority.

</comment></comment></comment></comment></comment></comment></comment><comment><USER15> The biggest problem with Unicode in Python2 was not the UnicodeDecodeError/UnicodeEncodeError, it was the _latent_ UnicodeDecodeError/UnicodeEncodeError. As in, you had some code which works perfectly fine, both in your machine and in production, until someone somewhere types a word with a ç character and your code blows up with one of those two exceptions.

With Python3, the same code will blow up early, even if there was no non-ASCII character for that string in your test set, and will get fixed before going into production.

<comment><USER16> That was the main reason I migrated: processing everything internally in Unicode and then encoding/decoding as needed for the outside world creates a well defined 'place-where-unicode-shit-might-bork' border in your project that allows you to not only detect unicode errors earlier, as you stated, but also keep tabs on this 'border'.... eventually you don't even have unicodeerrors in your codebase anymore, because in 3.x this pattern emerges in your head and imho it's a really good thing, it is making your think properly how your code interacts with other entities.

<comment><USER17> FTR I can't remember ever seeing a UnicodeError in Python 3 that was caused by an ill-formed program. I only saw it when someone put binary shit somewhere were only text should be (eg. that flat text file with the page title should contain text, not an .exe)

Also the distinction between binary and text is the _only_ sane way to handle it. Everything else is simply ill-formed.

</comment></comment></comment><comment><USER18> I find surreal how much people underestimate how big is the population that deals with those unicodeerrors. It's SO MANY FUCKING LANGUAGES AND SO MANY PEOPLE. The majority of the world population writes using non-ASCII characters!

It's a HUGE problem in Python 2. Python 3 was needed. If you don't think the Unicode change was needed and you actually work with texts in any form, you should also stop developing "for web scale" before fixing this. Because you're actually focusing on a small percentage of the world population on your software.

For me Zed's argument sounds like "This is America, speak English". Specially with his quotes around "international".

<comment><USER19> Üክጎርöዕቿ የዪöጌረቿጠነ ልዪቿ öሀቿዪዪäፕቿዕ.

<comment><USER20> Unicode problems are overrated

</comment></comment></comment><comment><USER21> Yea, use Python2, don't use Unicode, but please add information to a registration form like: _" due to our programmers' limitations please don't enter your first name or last name as your write it, use only ASCII characters, otherwise our servers may blow up"_.

PS) This is what I had to work on last year. Happy US programmers who know nothing except English. And suddenly the software blew up, just because a client wanted to enter his name.

</comment><comment><USER22> There's also this article [0], which sort of tears Zed's article apart bit by bit. It's honestly a fun read because of the aggressive tone (which I find deserved), and it's also informative.

edit: there was a HN discussion about it as well. [1]

[0] [https://eev.ee/blog/2016/11/23/a-rebuttal-for- python-3/](https://eev.ee/blog/2016/11/23/a-rebuttal-for-python-3/)

[1] [https://news.ycombinator.com/item?id=13027481](https://news.ycombinator.com/item?id=13027481)

</comment><comment><USER23> I don't have a problem with Python 3's unicode support, and I don't really understand why people do. I think it works fine, you just want to think of b'' as byte arrays instead of strings. If you're ever carrying a bytes around and passing it into string handling functions, you're Doing It Wrong. Honestly, I can't find anything wrong with Python 3's Unicode support. It's great.

<comment><USER24> Exactly. Its clear distinction between (unicode) strings and (binary) data is Python 3's biggest plus, imho. No more randomly popping up errors because something is trying to handle the binary data in your str as string; instead you'll get a nice type error. I don't understand how people do _not_ find that terribly annoying with Python 2. (seriously, tell me)

<comment><USER17> Gut feeling: there is a large intersection between the "Python 3 Unicode sucks" and "Every operating system ought to handle only bytes and never think of encoding, and file names and paths are just bytes". I have words for the latter attitude, but they're not HN-compatible.

</comment></comment></comment><comment><USER25> I have nothing against Python 3, but right now Python 2.7 is more than good enough for all my current requirements, and is used by every client I work with that uses Python.

At some point that might start applying to Python 3, in which case I will use Python 3. In the meantime I stay out of religious programming wars and use the best tool for the job. For me, right now, that is Python 2.7.

<comment><USER26> > Python 2.7 is more than good enough for all my current requirements

> use the best tool for the job. For me, right now, that is Python 2.7.

Sorry, but these two statements seem at odd with each other. I absolutely agree with the first principle, and I agree that in many cases 2.7 is more than good enough; however, in nearly all cases I have encountered (and I have, a lot!) Python 3 is notably better, which means that it is not "the best tool for the job".

<comment><USER27> Everyone has different needs. For your needs (for most people's needs), Py3 is better. For his needs, Py2.7 is better. It's not hard to understand.

If everything he encounters, for example, is in 2.7, then that's probably the best tool for the job. If I'm commuting to work in the morning, I want a nice sedan with an automatic transmission and fuel injection because it's nice and modern and easy to use. If I'm in rural Africa though, I probably want a truck with a manual transmission and a carburetor. Sure it's outdated, but if I need a mechanic to work on it or parts that will fit it, every other car on the road there is just as outdated as mine.

<comment><USER26> > If everything he encounters, for example, is in 2.7, then that's probably > the best tool for the job.

I disagree. Your example describes two completely different solutions to different scenarios; but Python 3 is not a different solution, it's a subset. It has everything that 2.7 has, only improved -- which means that for each case that Py 2.7 can handle, Py 3 can handle it just as easily, or better.

My comment was simply about the phrase "the best tool for the job" \-- Python 2.7 is in many cases good enough, and there is no point in switching an existing codebase if it means much more work than it brings benefits. However, when starting something new, with the goal of using "the best tool for the job", Python 3 is -- in my experience at least -- the clear winner.

</comment></comment></comment></comment><comment><USER28> serious question: why I see really almost no complains in other languages when they introduce breaking changes? is the migration handled differently or the communities are less vocal?

<comment><USER29> Serious answer (seriously): because Python 3 didn't break enough stuff.

For all the complaints, Python 3 was _incredibly conservative_ about making changes that would completely break existing code. String handling was basically _the_ big shift, and if you were writing good code to begin with wasn't super hard for most problem domains to adjust to. Clearing up some cruft in the way the standard library was organized wasn't hard to deal with either. And there wasn't a lot of new syntax in 3.0/3.1 and quite a bit of it was backported into 2.6/2.7 to make the transition easier.

And then there was a bit of a moratorium on language changes in 3.x to give people time to catch up from their 2.x codebases.

The result of which is a lot of people who didn't think Python 3 was a big enough deal to be worth putting in the effort to migrate, when the 3.x series started releasing. And now many of them are finally noticing all the cool stuff that's in 3.x now (3.6 is about to release), and noticing that their favorite tools and libraries have switched from "we support 2 and 3" to "we're dropping support for 2", and realizing they didn't take advantage of all the time they had to port stuff, and are angry and feeling left out and trying to find complaints to level at Python 3 in the hope that enough people will agree and just magically end it, port all the new features back to Python 2, and let them keep going as-is.

<comment><USER13> > Serious answer (seriously): because Python 3 didn't break enough stuff.

I could also be because there was another choice (which is what you also said). Ruby 1.8 -> 1.9 was annoying, but you weren't going to keep using 1.8 given e.g. the speed improvements of 1.9. (Also, who adds breaking changes in minor version numbers?)

There's a great talk about changing the culture around Python3 at Facebook[0], I highly recommend it. Technically, it isn't so hard. Culturally, it can be pretty hard. Calling Python2 "Legacy Python" helped at my $work. My boss agreed that continuing 2.x development wasn't a good investment for the future, given the minor technical challanges involved with moving over a few years.

[0] [https://www.youtube.com/watch?v=nRtp9NgtXiA](https://www.youtube.com/watch?v=nRtp9NgtXiA)

</comment></comment></comment><comment><USER30> The main reason that Python Unicode is hard is because of the disastrously confusingly named "encode" and "decode". It's a constant question which direction you are going - encoding or decoding, huh, what?

Python 3 Unicode would be MUCH easier if encoding/decoding was more intuitive, memorable and obvious.

Still an unfixed problem. Not even an acknowledged problem.

<comment><USER31> How would you design the API?

<comment><USER32> I'd copy directly from Rust.

<comment><USER31> Say I get a file and the name of the encoding it's in (like an XML file with a declaration), how I decode it in Rust?

</comment></comment></comment></comment><comment><USER16> I was a die-hard 2.x Pythonista, and as Python 3 started to reach 3.[4/5] releases, in my view it started to get really good in terms of new (and actually useful, not just bloated) features. I for instance love the way you can properly type everything, and that equates to proper interfacing, expectancy between object interactions and also (ofc!), better and smarter IDEs.

Also, at the 3.5 release, most "big" libraries and frameworks were already supporting Py3.x in a stable manner, so more and more the point about being at 2.x "because I have this huge library support" got fragile in my head, and I knew what that meant: "Someday, I will actually have to migrate!"

I started getting worried that the 2.x ways were too entrenched in me and that I'd never be able to migrate, that my Python (2.x) skills would become something as forgotten as my former self (childhood) Turbo Pascal antics and etc. Nonsense!

Here's what happened: I was asked to work on the backend of a new website that was aiming for a fully "portable" (desktop, mobile, and whatever comes next) experience. They wanted me to write an API for it, and I started studying what framework I could use that was simple enough for an API (flask!) and for sane backend storage definition (sqlalchemy!)

\- Flask on 3.x -> The more I searched about flask on 3.x, the more I found how it was really stable and production-ready. Also, using 3.x would be really nice on the whole Unicode thing, as I would not be able to make the same string/bytestring mixing assumptions I used to do so carelessly in 2.x (until something blew up...) I would actually have to enforce and handle proper Unicode throughout the api.

\- SQLAlchemy on 3.x -> Really, the same. Production-ready, used throughout.

These two convinced me to try to get the initial API study on 3.x, and oh boy, besides stumbling here and there with some changed syntax (mostly, simple print()'s during early stages), migrating to 3.x went real smooth!

As I advanced in my 3.x studies, I started to see benefits in typing everything properly, specially between layers/borders, and it meant less typing and more intelligent autocomplete for my pycharm.

Seriously, If you find yourself struggling or anxious about migrating to 3.x, just find yourself a new project and start doing it on 3.x in the most non- pretentious manner. You'll find yourself just as 'at home' as you felt in 2.x, but you'll still feel something changed for the better...you won't feel strange more than 3 days I promise you :DD

</comment><comment><USER33> I HATE python 2

        "hello how are you {}'.format(name)

UnicodeDecodeError ARRRRGGGGH

<comment><USER34> SyntaxError: EOL while scanning string literal

</comment></comment><comment><USER35> My biggest issue is that Python 3, from an outsiders perspective, does not look at all like it's about unicode. Python 3 could very well have been done in a way that just fixed the back end implementation of python 2 (implement a string as an extension of a list) and then most things would have probably worked fine. Just handle all the unicode stuff in the back end and treat them the same exact way as Python 2 treated strings.

That's not what happened and instead we had a huge change to one of the fundamental data structures of any programming language and a lot of changes that pretty much no one wanted.

Packages were moved, things were renamed, etc. These are not changes that should be made. Make a fix, don't make me rewrite my code because someone else said "Eh, I like this name better". It's useless to do so and helps no one. There are now swaths of community-written documentation that are useless because every package name in the post has changed for seemingly no reason.

The issue is simple: it could have been handled so much better.

</comment><comment><USER19> I would like to understand: what was the key mistake in the transistion to Python 3 that generated this huge divide and this ultra-annoying situation for the people that still have to use Python today?

What can be learned from that Python desaster to avoid such a catastrophy with some other programming language?

I really would like to read some analysis about what went wrong.

Thank you very much for your attention!

<comment><USER36> Personally I think one big mistake was that it took literally years between python 3.0 coming out and numpy and django having a release that supported python 3. I remember python 3 coming out, being interested, looking at it for just long enough to realize that numpy wasn't supported and then not looking at it any more. Then I kind of lost interest in the intervening years and just kept working with python 2 which ended up getting back ports of many python 3 features.

I think that if the teams had somehow managed to coordinate a more or less simultaneous release then much of that early momentum wouldn't have been lost.

</comment></comment><comment><USER37> The big thing is not so much the changes that you need to make for Python 3, but supporting both from the same code base. Combined with the fact that this is often very necessary and will continue to be necessary for quite a while (LTS distros on Python 2.6 or 2.7), people think "why not just use the minimum?". If you have good support from things like six and good testing then it's possible, but it certainly adds a development tax.

Python 3 has been adding more features (especially concurrency-related) that don't seem to be getting back-ports, or at least the libraries that support them in Python 2 lack the ergonomics of nice syntax sugar. Eventually there'll be a tipping point of all major LTS releases on 3.x and enough carrots in Python 3 that none of the little things will matter any more.

</comment><comment><USER38> Since we keep having these discussions every now and then, here's a link to one of them from a few weeks ago:

[https://news.ycombinator.com/item?id=12930082](https://news.ycombinator.com/item?id=12930082)

</comment><comment><USER39> To me, the essay misses Shaw's point. One way to divide out the invested positions of the Python community and see his position for what it is, is to look back at when Shaw similarly pissed off the Ruby community (as distinct from the time he pissed off the Ruby-on-Rails community).

This essay is among the most memorable pieces I have read on Hacker News: [https://web.archive.org/web/20120821234313/http://learncodet...](https://web.archive.org/web/20120821234313/http://learncodethehardway.org/blog/AUG_19_2012.html)

<comment><USER40> What do you think his point is, then?

<comment><USER39> Having read Shaw's recent essay [0]:

1\. Because the target audience of _Learn Python the Hardway_ is very new beginners and the pedagogy is _programmed learning_ [1][2], Python 3 is a poor choice for the target audience of _Learn Python the Hard Way_.

2\. Shaw is more concerned with the welfare of the book's intended audience than adherence to the dictates of Python's leading figures.

3\. More subtly, that sales figures indicate a disconnect between the dictates of Python's leading figures and the interests of his students.

From my outside position, it seems Shaw has a legitimate stake in his decision and people like this essay's author have a stake that boils down to creating drama.

[0]: [https://zedshaw.com/2016/11/24/the-end-of-coder- influence/](https://zedshaw.com/2016/11/24/the-end-of-coder-influence/)

[1]: [https://en.wikipedia.org/wiki/Programmed_learning](https://en.wikipedia.org/wiki/Programmed_learning)

[2]: [http://hanselminutes.com/407/learning-code-the-hard-way- with...](http://hanselminutes.com/407/learning-code-the-hard-way-with-zed- shaw)

<comment><USER40> A noble goal, but his Python 3 post is still nonsense [0].

[0]: [https://eev.ee/blog/2016/11/23/a-rebuttal-for- python-3/](https://eev.ee/blog/2016/11/23/a-rebuttal-for-python-3/)

</comment></comment></comment></comment><comment><USER41> I've built two (soon to be commercialized) web apps in Django over roughly a year. I don't bother to ensure Python 2 compatibility. I refuse to litter my code with unneeded imports and make my code my code uglier/harder to understand.

Maybe I have the luxury of not targeting enterprises with legacy codebases. I genuinely feel sorry for people who have to go out of their way to solve compatilibility problems rather than work on more interesting problems.

Edit: typo

</comment><comment><USER42> For new projects Python 3 has to compete not against Python 2 but also against other scripting languages, especially NodeJs.

<comment><USER43> No problem tho [https://magic.io/blog/asyncpg-1m-rows-from-postgres-to- pytho...](https://magic.io/blog/asyncpg-1m-rows-from-postgres-to-python/)

</comment></comment><comment><USER44> I'm unconvinced by the argument that big shops won't migrate by 2020. There is a statistic (which may be false and unproven, but I think is roughly correct) that says all code gets rewritten every 3 years. ie if you make Python 3 available to new code now, then by 2020, your code will be rewritten in Python 3 by natural attrition. That being said, its of course not that simple. However, the investment now in making core libraries compatible and deployed for both languages is likely to be much cheaper than a mass switch when Python 2 gives up the ghost.

<comment><USER7> One of the companies where I teach just (in 2016) upgraded one of their core systems to Python 2.7. That's after years in which it was written in Python 2.4. Yes, 2.4, the same version my great-grandparents ran back in the Old Country.

So yes, things are rewritten. And things are upgraded. But at a glacier's pace.

2020 is coming soon -- in about three years. There's no way that companies will upgrade some of these systems to Python 3 during that time. Some things, sure -- but there's a _lot_ of legacy code out there, and I don't see them spending the time and money to upgrade something that already works.

<comment><USER45> Python 2.4 was, until fairly recently, still supported in a RHEL LTS.

Enterprise being stuck with old versions isn't new. But it's a radically different world.

</comment></comment></comment><comment><USER46> > But again, the population that will be affected is the 10% who deal with > Unicode.

I bet a lot more than 10% of the user base uses emoji. And even more will.

</comment><comment><USER47> As I said in another Python 3 HN thread, developers from cultures whose languages can be fully satisfied with the Latin-1 charset (which is the absolute majority of the developed world) just don't get how important and essential it is to have a proper (pervasive and implicit) implementation of Unicode at the language level.

<comment><USER48> _> (which is the absolute majority of the developed world)_

I'm a German writing web apps using Django, and I constantly got UnicodeDecodeErrors when mingling with older browsers, uploads from Windows users, copy-pasted content from word processors etc.

The problem isn't (only) whether Latin-1 has all the characters, it's what encoding gets thrown at your software.

Python 3 was a blessing for handling user-provided input.

</comment></comment><comment><USER49> If you can't handle Unicode fairly well, you can't make an app that is international ... the world is a big place.

I run into unicode issues on almost every project.

</comment><comment><USER50> I can make a case against 3: it's even slower than 2.

<comment><USER51> Yeah, but if you're programming in Python then speed isn't exactly high on your language feature priority list is it?

<comment><USER17> Performance and choice of language has in most cases no correlation at all.</comment></comment></comment>


NSA Use of Facial Recognition Stays Within Legal Boundary - <AUTHOR> http://www.bloomberg.com/news/2014-06-03/nsa-use-of-facial-recognition-stays-within-legal-boundary.html <comment><USER2> The "Intelligence Community" needs to be careful throwing around concepts like "stays within legal boundaries". Since the NSA/CIA/FBI is doing things that would definitely upset a majority, they just might taint the idea of "legal boundaries". Sort of like how the Nazis gave racism a bad name.

</comment><comment><USER3> "The U.S. National Security Agency complies with legal restrictions when it comes to using facial-recognition technology on citizens, according to the agency's new director."

Oh good, the NSA director says what they're doing "complies with legal restrictions". I feel much better now.

</comment><comment><USER4> Source: NSA.</comment>


Avatar will get three sequels says James Cameron - <AUTHOR> http://www.bbc.co.uk/news/entertainment-arts-23546537

<comment><USER2> Can we get the original one redone first? The animated series was excellent imho but the movie was a travesty.</comment>


How to Unlock Foreign Languages: 11 Principles - <AUTHOR> http://www.andrewskotzko.com/how-to-unlock-foreign-languages/

<comment><USER2> (author here) A) Thanks for sharing this @mdsandler. B) I added a lot of resource links and downloads in the FAQ at the end. If I've missed something good, let me know and I'll add it.</comment>


Map Caps Lock to Escape on Windows, Linux, and Mac - <AUTHOR> https://github.com/susam/uncap <comment><USER2> While it was interesting to see how key remapping is done on different platforms, for me the specific mapping in question - ESC vs CAPSLOCK - is a lot of muscle memory to unlearn. I've been going top-left for ESC since the Amiga 500.

(Edited to add:) But I'm not a huge Vi user so clearly I'm not the target audience.</comment>


Government surveillance is as old as the telegraph - <AUTHOR> https://www.timeline.com/stories/the-us-government-has-been-monitoring-customers-since-the-telegraph <comment><USER2> Horrible title. Government surveillance existed long before telecommunications. US governments have been spying on mail/letters since literally day one. I take that back. They were spying on letters BEFORE day one, before the US was actually a thing.

The OP article equates government surveillance with the modern phenomena whereby governments must enlist corporate actors to aid in surveillance: the tapping at the switchboard rather than secreting some device inside the handset. Plenty of government surveillance is possible without any corporate cooperation whatsoever.

<comment><USER3> Yes I agree. Even in Ancient Rome, Livy [0] actually wrote about this in one of the his books [1].

This is a good read if anyone is interested:

[http://www.historynet.com/espionage-in-ancient- rome.htm](http://www.historynet.com/espionage-in-ancient-rome.htm)

\</comment></comment><comment>---

[0] [https://en.wikipedia.org/wiki/Livy](https://en.wikipedia.org/wiki/Livy)

[1] [https://en.wikipedia.org/wiki/Ab_Urbe_Condita_Libri_%28Livy%...](https://en.wikipedia.org/wiki/Ab_Urbe_Condita_Libri_%28Livy%29)

</comment><comment><USER4> Like, duh. Telecom has always been entwined with state security - they're essentially two halves of the same informational entity.

This is why the 90s were a watershed, when powerful encryption became accessible far and wide. Having state of the art defensive spycraft at the hands of anyone who casually cared is unprecedented throughout history.

But the tech community dropped the ball. In the rush to build our dream of what the Internet could enable, we failed to consider robustness in the face of hostile service providers, including ourselves.

Let us hope there isn't too much path dependence on this broken overcentralized architecture.

<comment> vezzy-fnord _Like, duh. Telecom has always been entwined with state security - they 're essentially two halves of the same informational entity._

It nominally should have been a "like, duh," but as it turns out, it was a great mystery to a many people, taking well until 2013 when Snowden finally made it stupidly obvious such that ignoring or denying it was simply rendered impossible.

I'm not sure how much of it was due to historical ignorance, faith in statism, or in the case of the United States - its history and culture generally being heavily enshrined in mythology.

<comment><USER4> Snowden wasn't the first whistleblower, so to me it's more of a sociological topic than anything else. While it's tough to get a man to understand something his salary depends on not understanding, that does not mean he should be free from judgment for doing so. So I still think "duh" is appropriate.

I see the same wishful denial as in eg second amendment "hopefuls" who think that having nerf guns is proof that the government is being kept at bay. The truth's implications are simply too difficult.

</comment></comment></comment><comment><USER5> Comparing intelligence operations of the past - with or without the help of business - to the current situation is a false equivalence.

To quote _Cybersecurity as Realpolitik_ [1] yet again:

        The central dynamic internal to government is, and always
        has been, that the only way for either the Executive or the Legislature
        to control the many sub-units of government is by way of how much
        money they can hand out. [...]

        Suppose, however, that surveillance becomes too cheap to meter,
        that is to say too cheap to limit through budgetary processes.  Does
        that lessen the power of the Legislature more, or the power of the
        Executive more?  I think that ever-cheaper surveillance substantially
        changes the balance of power in favor of the Executive and away
        from the Legislature.

In the past, there were always fundamental limitations of money or manpower or capability. It's expensive to run a stakeout, and it just wasn't technologically possible to build a database about _everybody_ ; even the relatively simple census took years of work before the invention of Hollerith's Tabulator[2].

Compare that to today, where XKEYSCORE can search most world communications in (approximately?) realtime. Compare the handful of bytes worth of personal information the Census Bureau was able to tabulate about everybody to the still-growing mountain of data (and metadata) that is gathered routinely that we call "analytics". Compare the difficulty of _searching_ for some particular piece of data - even with a fancy electromechanical tabulator - to the powerful and widely available analysis tools we have today.

It is simply dishonest to say the surveillance capabilities of even a generation or two ago is even remotely comparable to the surveillance currently being done by _both_ governments and private businesses.[3]

[1] [http://geer.tinho.net/geer.blackhat.6viii14.txt](http://geer.tinho.net/geer.blackhat.6viii14.txt) [https://www.youtube.com/watch?v=nT- TGvYOBpI](https://www.youtube.com/watch?v=nT-TGvYOBpI)

[2] [https://www.census.gov/history/www/innovations/technology/th...](https://www.census.gov/history/www/innovations/technology/the_hollerith_tabulator.html)

[3] "It ain't the same league. It ain't even the same fucking sport."

</comment><comment><USER6> There are some good descriptions of telegraph-era government surveillance arrangements in Bamford's _The Puzzle Palace_ (1983). Also Carlisle's _Encyclopedia of Intelligence and Counterintelligence_ (2015). And for fun, see Yardley's _The American Black Chamber_ (1931).

Edit: And see [http://www.theatlantic.com/politics/archive/2013/12/82-years...](http://www.theatlantic.com/politics/archive/2013/12/82-years- before-edward-snowden-there-was-herbert-o-yardley/282019/) for more about Yardley.

Edit: Corrected publication date for _The Puzzle Palace_.

</comment><comment><USER7> Along with his many other abuses of liberty, Lincoln monitored telegraph lines during the war, and jailed without trial many who criticized the war effort or argued in favor of the right of secession.

</comment><comment><USER8> The book _The Puzzle Palace_ by James Bamford, a history of the NSA and its precursors, describes in detail how the U.S. government set up shop in the early telegraph offices, copying everything. As this book came out in `83, I've been continuously amused at how Snowden's leaks have been greeted with so much surprise.

</comment><comment><USER9> The inventor of the one-time pad was a telegraph man: [http://www.nytimes.com/2011/07/26/science/26code.html?ref=sc...](http://www.nytimes.com/2011/07/26/science/26code.html?ref=science&_r=0)

</comment><comment><USER10> It's much older. But that doesn't make the public obligated to make it easy.</comment>


Ask HN: Any software to parse a PDF word by word? (maybe into SVG) - <AUTHOR> I'm looking for a library or software to convert a PDF into SVG where the SVG renders the text grouped word by word.
I've seen the software pdf2svg produces an SVG where everything in the PDF is rendered into individual shapes. Each letter becomes a shape! So that's too fine-grained.
Inkscape produces groups of words and can't break it down further.
Anything else out there that can actually figure out the individual words in my PDF?
Actually, I'd be okay with parsing the PDF and getting a list of words and their positions. No need for the SVG.
Any suggestions? <comment><USER2> I worked on a project for a client some time ago [1] where extraction of text from PDFs was a big part of it. Researched several products, tried them, settled on xpdf - the C library, used it from my C code. It worked well for many PDFs but not for some others [2].

[1] There could be better products by now. Also, had heard good things about PDFTextStream, which another comment here mentions.

[2] Some data would get corrupted, e.g. characters interchanged, missing characters, etc, in the extracted text.

There are technical reasons inherent in the nature of the PDF format, due to which 100% perfect text extraction, including correct character positions, is not always possible for all PDF files (only for some) - that's one thing I learned from working on that project. Some of that learning was from a key person at the company that sells and supports xpdf. His support and knowledge was very good. They even quickly fixed a bug or two that I found in the product.

But things do work for many cases. As an aside, I also developed a small program that used heuristics to identify cases in which the PDF extraction was incorrect. Was fun.

<comment><USER3> I endorse everything Vasudev has written here. In the abstract a couple of other libraries of interest are Java-coded PDFBox and Python-based PDFMiner.

</comment></comment><comment><USER4> Here are a couple of ideas, none of which do exactly what you want. However, they may give you some ideas...

PDFMiner[1] is a python toolkit for PDF. Among other things, it extracts text from PDF files. It also has a tool that lets you find objects and their coordinates in a PDF file. I have not looked at the latter functionality, but it may get you your words and locations.

I've used Tesseract[2] to convert scanned documents into searchable PDF files. Since a search of the PDF file will highlight matching words in the scanned document, it clearly knows where words are and the letters that comprise them. This might be another approach.

[1] [https://code.google.com/p/tesseract- ocr/wiki/ReadMe](https://code.google.com/p/tesseract-ocr/wiki/ReadMe) [2] [https://code.google.com/p/tesseract- ocr/wiki/ReadMe](https://code.google.com/p/tesseract-ocr/wiki/ReadMe)

</comment><comment><USER3> No.

Well, the correct answer to almost any such technical question is "yes and no". This one comes as close as any to a bare "no".

It's a good question. PDF->SVG conversions are quite powerful--when they work. They simply do NOT work, in the general case. I deal with a hundred-thousand PDFs at a time, and they demonstrably don't behave with enough regularity to allow for the kind of general transformation I suspect you have in mind.

As it happens, our little company does quite a bit of business extracting content from specific classes of PDFs [http://phaseit.net/claird/comp.text.pdf/PDF_content_extracti...](http://phaseit.net/claird/comp.text.pdf/PDF_content_extraction.html) Coincidentally, I also research and deliver advanced SVG effects [http://phaseit.net/claird/comp.text.xml/SVG_examples.html](http://phaseit.net/claird/comp.text.xml/SVG_examples.html) I certainly am sympathetic to your aim. To be successful, you need to specify your situation more precisely.

</comment><comment><USER5> May be with PDF.js:

[https://mozilla.github.io/pdf.js/api/draft/global.html#TextI...](https://mozilla.github.io/pdf.js/api/draft/global.html#TextItem)

Or WeasyPrint:

[http://weasyprint.org/](http://weasyprint.org/)

</comment><comment><USER6> Because PDF's can contain typesetting glyphs or even bitmap images, probably the only universal way to extract text from arbitrary PDF's is OCR. On the other hand, if you can make assumptions about the data and the data is clean enough that the assumptions hold, then other methods might work. But if the data is that clean then OCR probably will too. And OCR is as easy as a $79 all in one to get started with.

Good luck.

</comment><comment><USER7> PDFTextStream: [https://www.snowtide.com](https://www.snowtide.com)</comment>


Ask HN: Do you use FreshBooks? If so please review my new application  - <AUTHOR> https://www.invoicehelpers.com/

<comment><USER2> I have to be honest here, I hate signing up to test a product more so for invite on beta. Over the years of building online application I found out that is the case for a lot of people. You may want to consider providing a demo kinda open interface for your app.

<comment><AUTHOR> Yes thanks for the comment. Eventually I'm going to have a test account that people can use. The issue is that I'm 100% tied to another application so I have to be careful with the data / functionality I use. They do have a sample account though.

</comment></comment><comment><AUTHOR> Howdy friends,

I've just launched a beta of a new application that adds extensions to FreshBooks. Please take a look if you're a FreshBooks user! New modules coming out shortly for budgets, improved reporting, and some other goodies.

Thanks!</comment>


ES6 in Depth: Destructuring - <AUTHOR> https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/ <comment><USER3> I'm currently building a rather large isomorphic React/Flux application in ES6 and ES7.

With our Flux implementation that we're using[0], async actions to external services become amazingly simple.

      async sendRequest(payload) {
          try {
              let result = await this.api.sendRequest(payload);
              return await result;
          } catch (e) {
              if (e.name === 'ServerException') {
                  this.errorActions.serverError(e);
                  return null;
              }

              this.errorActions.genericError(e);
              return null;
          }
      }

Having a class system on top of prototype system, removing a lot of the boilerplate is great. Browserify/CommonJS and Babel make for a phenomenal build system, and being able to with few exceptions render everything on the server correctly is brilliant.

Javascript has come a long way. The best part of destructuring is simplifying `import` statements

      import { fooFunc } from './Bar';

I highly recommend checking it out, as the confluence of ES6/7, Babel, React and Flux (with one way data-flow) feels like the future but here today. That, and I'm stoked that functional programming concepts are taking off!

[0] [http://acdlite.github.io/flummox](http://acdlite.github.io/flummox)

<comment><USER4> Last time I checked, one problem with async (translated with regenerator by babel) was that transformed code is difficult to debug even with source maps. The stack traces are often useless and breakpoints map incorrectly. Also, since the async function is returning a Promise, you've to deal with Promise's own stack trace eating behavior.

To summarize, the code looks neat. But debugging a non-trivial app still has some way to go.

<comment><USER3> I don't disagree, but one nice thing with babel is a plugin called babel- plugin-rewire; its a clone, if you will, of rewire -- a proxy for require calls that allows you to overwrite them.

With it, I can unit test my actions and other async modules in complete isolation, so the debugging burden is lessened. Id love to be able to remove console.trace() calls in my async code in the error handling side, and I think we will get there soon, but things can be worked around and the control flow becomes far easier to understand than using generators by hand, or callbacks.

<comment><USER4> > control flow becomes far easier to understand than using generators by hand.

IMO, control flow has no advantages over generators. It is exactly the same thing, replace await with yield/yield-star. Btw, until aysnc debugging becomes better, replacing yield with delegating yield even gives you stack traces since the delegation is handled by the runtime (and control does not pass back to the function (like Q.async, co, spawn) that's driving generators).

      //From my current project
      static *getInitialProps(name) {
          var project = yield* Project.getByName(name);
          return { project };
      }

async is a better way to do things, I agree. In fact, I asked this silly question once on es-discuss and got educated. [https://mail.mozilla.org/pipermail/es- discuss/2014-September...](https://mail.mozilla.org/pipermail/es- discuss/2014-September/039276.html)

<comment><USER3> Hey, I read that thread just the other week! Fascinating discussion, though I still disagree that generators have the control-flow advantage: while I personally don't see much of a difference, the other developers whom are newer to JS and asyc execution in general have found async/await conceptually simpler, despite the fact it's still compiled down to generators anyway.

You're right, in that it makes little difference in terms of semantics per se, but having implemented both in the application we're working on (which is at just under 10k semicolons, currently) async/await along with how Flummox/Flux implements the dispatcher, it allows you to work with async methods without propgating async through the entire call stack, and lets you think of the runtime as being synchronous-ish. I'm looking forward to finishing this project, as there's a tonne of stuff I want to write up about it; I think the big issue with ES6/7 is that there isn't a lot of "in the trenches" writeups.

Thanks so much for the discussion on esdiscuss by the way, it really helped me understand async execution and control flow in ES6/7.

PS. This is a neat project, HTTP servers with ES7 async/await. Similar in concept to Koa, but using the newer syntax! [https://github.com/quinnjs/quinn](https://github.com/quinnjs/quinn)

</comment></comment></comment></comment></comment><comment><USER5> No offense meant to anyone, but I really do not like this constant stream of new features in JavaScript. There are some core issues with the language which, of course, cannot be just fixed, and no new features will make them go away. But there is also a beautiful simplicity and power in the way this (used to be) funny little language does classes, objects, scoping... I feel like these new features are bloating it, and for what? So that you can write an assignment in 1 instead of 3 lines? Wow. It's as if, whatever programming language is trendy, JavaScript must absorb as much of its features as it can...

Don't get me wrong, destructuring is a nifty feature, but it's not really necessary. Plus, things like that usually get thought through along with everything else, when the language is designed. Not only is this increasing the conceptual weight of the language (OK, maybe I exaggerate in this example ;) but there are many more features added all the time), but now you also have a new set of potential pitfalls when doing potentially type-inappropriate destructuring. (I see from the text that you sometimes get undefined, and sometimes a TypeError?) Does JS need more of that?

Why not keep it simple? It may have its flaws, but the JavaScript mental model, once you figure out some corner cases, is really simple and powerful. I find it sometimes very elegant. This feature bloat reduces that, IMO, and could hurt understandability of JS code.

<comment><USER4> I down voted you, I owe you an explanation.

> I really do not like this constant stream of new features in JavaScript

ES6/Ecmascript Harmony was announced seven years back, and has been actively discussed for the last four years. So the constant stream of new features you see are JS engines implementing parts of the standard, which is now in its final shape. ES-Discuss mailing lists* are open for community participation (like someone mentioned below) and is led by people with a lot of experience in their respective focus areas. Every new feature has had to pass through many levels of debates, and have (mostly) been borrowed after being found successful either in other languages or libraries.

> I feel like these new features are bloating it, and for what?

De-structuring is fairly easy to grasp, and is not even one of the main draws in ES6. Since the last changes to JS, the environment and therefore expectations have changed a lot: (a) JavaScript is now a server-side technology in a big way, (b) async has become increasingly important, (c) people are writing very complex apps in JS. Without the changes in ES6 (and ES7/8 going forward), developers would have hated working with JS and JavaScript could have slowly died.

If you have been following, you'd notice that JS has a very vibrant community around it. One big reason for that is that they see the language evolving with the technology that surrounds it. Finally, note that all the new enhancements have come without breaking backward compatibility.

* I lurk there, not a contributor. Have learnt a ton from just subscribing to it.

<comment><USER5> > I down voted you, I owe you an explanation.

I do think you might be breaking the guidelines of the site - downvote should not be used just for disagreement, or? - but who cares, you're certainly not the only one ;) In any case, thank you for the explanation! I appreciate it.

As for the rest, I partly agree. I am too late to voice any constructive feedback. It was just a general comment on the direction things seem to be going. And I'd rather not participate in the es-discuss, because JavaScript is not my professional focus any more, so I do not have the time or the required expertise. I understand that my comment seems kind of like taking a passing shit on someone's hard work, I'm sorry about that. I hope everyone takes it as nothing more than what it is - just an opinion ;)

All in all, I feel the language is getting overstretched and overcomplicated. And when I see destructuring, I wonder if it's really worth it. Too much complexity can be a problem.

<comment><USER6> > I do think you might be breaking the guidelines of the site - <USER2> > should not be used just for disagreement, or?

Well, it's not mentioned in the guidelines, and there's a bunch of people who do use downvote to disagree. There's a few posts from PG; one where he says that people upvote to agree so it's understandable that they downvote to disagree, and others where he sees it as a problem to be addressed.

It's probably a good idea for people to upvote any posts they think have been unfairly downvoted. This sometimes happens, but probably not often enough.

<comment><USER5> Maybe downvotes could be split in two.

1\. a downvote button, which is available to everyone, but affects only the ranking on the comment list (no graying out due to too many downvotes)

2\. a "flag" button, which is available to people with higher karma and serves for moderating.

...because, it seems perfectly human to want to express disagreement with a downvote. I can totally get it, and would/will probably have a hard time restraining myself ^^

</comment></comment></comment></comment></comment><comment><USER7> I'm not really into web/frontend stuff. I'm interested, but it's not part of my day job and so I dabble only, play a bit here and there.

My last experiments caused lots of browser based problems (string.prototype.contains doesn't exist in IE9 etc..) and ES6 features were a no-go for the same reason. How do you actually use things like the fat arrow etc. in applications today?

Is that limited to server-side code for now (and for quite some time..)? Do you decide to ignore a number of ~relevant~ browsers? Build tools to generate a 'lower' dialect/subset?

Any intro to this specific topic, i.e. 'making sure your ~modern~ code works in last years browsers'?

<comment><USER8> For runtime features like String.prototype.contains you can use a polyfill library like es6-shim[1]. For new syntax, you can use a compiler like Babel[2].

[1] [https://github.com/paulmillr/es6-shim/](https://github.com/paulmillr/es6-shim/) [2] [https://babeljs.io/](https://babeljs.io/)

<comment><USER9> Babel comes with Core.js [1] built in, which is (I believe) a better and more exhaustive shim library than es6-shim and the others.

[1] [https://github.com/zloirock/core-js](https://github.com/zloirock/core-js)

</comment></comment></comment><comment><USER10> I've been writing ES6 with Babel for a couple of months now, and I've fallen in love with destructuring - it's my second favorite part, besides arrow functions. My only complaint, having run into this a few times in real code, is that you can only use destructuring with _assignment_ , not with existing variables. So this works:

      let myThing = {a: 4};
      let {a} = myThing;

But this does not:

      let a = 5;
      let myThing = {a: 4};
      {a} = 5;

I understand there are some problems of ambiguity here, but it seems to me this could be made to work somehow?

<comment><USER11> Yeah, I wish that were handled better too. Since the parser is expecting a statements, it parses it like

        {
          a
        }

        = 5

As in, a block with just an "a" in it, followed by an assignment to nothing, which throws an syntax error.

You can however do

        ({a} = 5);

to make the parser switch to expecting a destructuring pattern instead of an block statement.

<comment><USER10> Whoops, my last line contains a major typo and should read `{a} = myThing;`. And you've dutifully carried over my typo to your example :D

But regardless, the corrected version of your example: `let a; ({a} = {a:5});` works like a charm and is very handy! Thanks for the tip!

</comment></comment></comment><comment><USER12> I recognize destructuring from Clojure. Did it origniate there? Or is this a specific case of pattern matching?

<comment><USER13> Other languages have this too, eg. Ruby:

      a, b = [1, 2]
      a, b = {:a => 1, :b => 2}

Similarly in Python, at least for the array example (there's probably some way of destructuring a dictionary in Python, but I don't know it myself).

PHP also has `list()`...

<comment><USER14> For arrays, yes, but that won't work for Ruby hashes (which aren't ordered):

        [1] pry ~ »  a, b = {a: 1, b: 2}
        {
            :a => 1,
            :b => 2
        }
        [2] pry ~ »  a
        {
            :a => 1,
            :b => 2
        }
        [3] pry ~ »  b
        nil

<comment><USER13> You're quite right, I meant to add `values_at` in the hash example! And the syntax is still not so nice:

      irb(main):005:0> a, b = {:a => 1, :b => 2}.values_at(:a, :b)
      => [1, 2]

Or:

      irb(main):006:0> a, b = (h = {:a => 1, :b => 2}).values_at(*h.keys)
      => [1, 2]

Edit: Ruby's hashes _are_ ordered since 1.9, incidentally.

<comment><USER14> a, b = {a: 1, b: 2}.values

</comment></comment></comment></comment></comment><comment><USER15> Adding to babel and traceur, Typescript is catching up with all ES6 features, so you can use destructors (discussed [here]([https://github.com/Microsoft/TypeScript/issues/240)](https://github.com/Microsoft/TypeScript/issues/240\))) in Typescript v1.5--beta

<comment><USER16> Does typeScript support generator syntax and a Promise shim yet? What about generators? These are pretty much required to get to async/await goodness.

I ask because I am genuinely interested, and haven't looked into it for a while, only passively in the context of Angular 2. The addition of attributes (@ tagging) is specifically interesting to me as I think it's a cleaner syntax visually than mounting methods onto a function after declaration.

With BabelJS, I can use flow to get type annotations, but not sure about meta annotations (like attribute declarations in .net)

<comment><USER17> Both async/await and generators are on the roadmap[0] for the next version.

[0] [https://github.com/Microsoft/TypeScript/wiki/Roadmap](https://github.com/Microsoft/TypeScript/wiki/Roadmap)

</comment></comment></comment><comment><USER18> I love it!

As someone else also mentioned in the comments, it is unapologetically dynamic. In many ways, this reminds me of Perl. The array destructuring assignment is such a common pattern in that language (eg. [http://perldoc.perl.org/functions/caller.html](http://perldoc.perl.org/functions/caller.html))

What's even more exciting/terrifying is that ES6 goes even beyond the patterns allowed in Perl!

<comment><USER19> No, it's worse. I'm talking about the part where you want to pull only parts off a compound:

ES6:

        let [,,,,,,,,, tenth_item] = somearray;

Perl:

        my (undef x 9, $tenth_item) = @somearray;

The ES language designers got that wrong. You carefully have to count the number of commas, and use an invisible nothing in between. Instead they should have made it so that you assign to undefined, or perhaps null, or make up a new special identifier named _ (like it is used in some other languages) and then the assignment operation is smart enough to discard the value.

This is not only better because now there is a visible thing to see and talk about, but also allows the comma operator to be much less restricted and frees the programmer to be more expressive. In Perl, multiple commas are collapsed similar like multiple whitespace collapses in HTML. The expression a,,,,,,b is identical to a,b – also it does not matter where in the expression the multiple commas are.

In ES5 and later multiple commas _at the end_ are collapsed into one, but otherwise multiple commas are kept. This is lame because inconsistent.

<comment><USER17> You could just write:

             let [tenth_item] = somearray.slice(9)

<comment><USER19> You're missing the point here. Slice works with only part of the compound about to be ripped apart. However, destructuring with commas is generic. Example that has no simple slice method call:

        let [,second,,fourth,,sixth]

</comment></comment></comment></comment><comment><USER20> I think this is a great language feature, using it a lot in OCaml and Clojure. I am not sure how much this will improve JS but I guess we can just wait and see.

<comment><USER21> Benefits are already known and experienced.

<comment><USER20> I mean how much the developers are picking up this. I see it as a pattern that developers sometimes reject new features on the basis that "they don't need it".

</comment></comment></comment><comment><USER22> var [wtf] = NaN; console.log(wtf); // undefined

I don't know about you, but this sensibly gives a TypeError when I did it in my console on Firefox 38. Please let this article be more dated than my firefox browser, because making NaN auto-coerce into an iterator sounds incredibly stupid.

<comment><USER23> I suspect it's just accessing NaN[0]. Either form of property access ([] or .) implied coercion to object (not iterable) in ES5. It makes sense that destructuring would build on that behavior.

<comment><USER24> Array destructuring doesn't use [0] access. It iterates the right-hand side. On the one hand, that means that trying to array-destructure NaN does in fact throw. On the other hand, it means you can array-destructure a generator, which is a very desirable thing to be able to do.

</comment></comment></comment><comment> Ono-Sendai Wow, that's some pretty complicated stuff. I can only imagine the monstrous code that could be written using this.

<comment><USER25> As with every language these can certainly be abused (perhaps more easily than other aspects) but I also see great usefulness in these.

</comment></comment><comment><USER26> that's awful syntax IMHO.

like php's list/map but with several levels.

those are just asking for bugs that are hard to spot even on code reviews.

<comment><USER27> Other languages have implemented this idea for decades now. It's a great feature.

The main thing that bothers me is that the default behaviour is too permissive.

        let a = [1,2,3,4,5];
        let [b] = a; // ok.  b receives 1

The equivalent Python will fail because there are "too many values to unpack."

<comment><USER4> I prefer the JS version. If you're a dynamic language, be unapologetically so.

      /* I can write code independent of getCheapestSellers() impl */
      var [bestPrice, secondBest] = getCheapestSellers("product_name");

<comment><USER28> That has nothing to do with being dynamic or not. Besides your example translates quite nicely to Python as well:

        [bestPrice, secondBest, _*] = getCheapestSellers('product_name')

<comment><USER4> My question is, why? If one wanted this type of guarantee consistently, they might as well use a statically typed language.

Add: To clarify, the error shows up at runtime in Python. So you're going to need tests anyway. Just as in JS.

Btw (unrelated), you can do the same thing in JS as well [a, b, ...rest] = [1, 2, 3, 4, 5]

</comment></comment></comment></comment></comment><comment><USER29> I fail to see this doing anything besides turning the syntax backwards!? Maybe it's useful for those of us who are used to write from right to left, like in Arabic, but I would still use var foo = bar[0] over var[foo] = bar any day. It gets even stupider with objects: var foo = bar.a, vs, var {a: foo} = bar.

JavaScript is a good language because it's so simple and easy to learn, adding stuff like destructor's just make it more confusing! Making a language more confusing just because of strong preference with syntactic sugars is a mistake. I would like to see a forking of the language before this goes mainstream. Maybe called CJS, where C stands for Clean or Classic JavaScript.

<comment><USER30> The point is apparent is you use actual use cases.

      let {title, content, email} = articles[0];
      let [all, ident, domain] = email.match(/[^@]*@.*/);
      return `<h1>${title} (${ident} at ${domain})</h1><p>${content}</p>`;

Secondly, there is no destructor in JS (because of dynamic memory management), and there will probably never be. Destructuring is nothing like destructors.

Thirdly, the language doesn't have to fork. You can still write ES5 code. But you should probably not because, believe it or not, ES2015 is a really good thing, full of improvements. And syntaxic sugars are part of what makes using it so much nicer than ES5.

<comment><USER29> Articles should already be an associative array in the first place.

I can understand why you think the email example looks better, but whoops, there's a bug, you now got two undefined variables!

<comment><USER31> So.... How would a lack of destructuring avoid this? You would still have two undefined variables, plus a bit more typing.

<comment><USER29> It would probably have looked like this:

      var email = article.email,
        at = email.indexOf("@"),
        ident = email.substr(0, at),
        domain = email.substring(at + 1, email.lengt);

</comment></comment></comment></comment></comment><comment><USER32> The part of this that is disengenuous and a little silly is that they are just slowly adding in features from CoffeeScript/IcedCoffeeScript and nobody mentions that.

And in order to do it you have to use something like Babel.

Why not just move to CoffeeScript, or IcedCoffeeScript, or ToffeeScript, or even LiveScript?

The only explanation I can see is that people just aren't capable of learning the full new languages and so the standards people are leading you by the hand like you just got off the short bus.

AND, the standards people don't want to admit that individuals did their jobs for them years ago, don't want to use someone else's design for implementing those features and so insist on slowly coming up with their own independent implementations for engines.

This is a microcosm that demonstrates the relationship between technology and society. There is just a huge lag between the newest and best ideas or systems and what the group or individuals or systems can grasp or absorb.

Take this existing many-year gap and multiply by 10X or 100X and you will start to perhaps understand the concept of the technological singularity.

<comment><USER33> The standards people very often are the same people, or represent the same organizations, that implemented the features in other places ahead of it being standardized as part of ES.</comment></comment>


NYU: Advanced Python for Data Science - <AUTHOR> https://nyu-cds.github.io/courses/syllabus/advanced-schedule/ <comment><AUTHOR> Just wanted to share this because it's one of the few resources that provides a great introduction to optimizing your models to scale and run faster. Each syllabus section has a great write up and set of exercises.</comment>


Converting Shopping Malls to Micro-Apartments - <AUTHOR> http://www.theatlanticcities.com/design/2013/02/one-americas-oldest-shopping-malls-converts-micro-apartments/4755/

<comment><AUTHOR> This seems like a really cool idea for a hacker space or even a YC funded area. Everybody lives and works under one roof but you still have some personal space to call your own.</comment>


Good Flash applications? - <AUTHOR>

After reading http://news.ycombinator.com/item?id=81594, I kind of realized that I'm missing this whole Flex/Actionscript/Flash world (do those even go together?)
My only exposures to Flash are with Youtube which sucks and Google Video which is awesome. Are there any real interactive apps that aren't just glorified databases or passive?
I've been thinking that the browser sucks for interactivity (no, Javascript abuse isn't acceptable), thick client applications are too much work but something in between could be golden.
Thanks
Update: I guess games could count but aren't what I am looking for. Anything else? <comment><USER2> I generally dislike Flash. It's a CPU pig and horrible for SEO. Also, none of the mobile devices support it. Apple hates it so much they asked YouTube to recode all of their videos so they don't have to put it on iPhone.

</comment><comment><USER3> splashup.com is photoshop online

</comment><comment><USER4> <http://box2dflash.sourceforge.net/>

</comment><comment><USER5> iminlikewithyou.com</comment>


Mozilla to bankroll Firefox with paid-for premium extras - <AUTHOR> https://www.theregister.co.uk/2019/06/11/mozilla_firefox_premium_services/ <comment><USER2> I'm not sure that this is necessarily a bad thing if they keep the browser itself free. They are not taking away any existing functionality but building strategic partnerships with third-party service providers to offer premium services. This could work, provided that they choose their partners wisely and don't shove the premium tier down everyone's throat. Firefox needs to find ways to remain relevant in a market increasingly dominated by Google-based technologies and offering privacy-focused services is a good start. They also need an independent revenue stream to ensure they survive the hard times ahead as even Microsoft's browser offering migrates to a Chromium-based stack.</comment>


The Landscape of Parallelism in C++ [video] - <AUTHOR> https://www.youtube.com/watch?v=rrolR1BdTok? <comment><USER2> In high level parallel programming, say for SIMD or GPU (which really is just a fancy name for a wide SIMD engine with a ton of hardware threads to hide memory latency and a 2D-oriented gather/scatter memory controller), I wish there was a way to still expose the situation when your data is in reality shared by multiple "cores", when they're actually just different lanes in a same SIMD/WARP/whatever unit. Right now you just pretend they're separate, even when they can't even branch individually.

Example: Think about image processing algorithm, say 3x3 kernel. If you have 16-wide SIMD, using 3 registers, you only need special handling for the first and last pixels, only they cross the processing boundary. 14 pixels in the middle already have all of the data. If you can plan your memory accesses, you can do even better by shifting a pixel in from each new 16 pixel fetch.

Through abstraction you need to gather the 9 (3x3 kernel) center+neighboring values and run clamping for each neighbor access, even if you're not at the boundary of the image data. Even when a good SIMD/GPU compiler notices the data is already loaded, you still end up with needless saturation arithmetic (clamp) and most likely extra memory loads, potentially many times as many.

Sure, swizzling for locality of reference and a good cache controller help, but extra ALU work and memory accesses still mean sub-optimal performance.

This is where I've gotten good gains (up to 2-5x) when manually writing SIMD asm or intrinsics.

That's a lot of performance to leave on the table, given that CPU and GPU performance hasn't improved much in last 3 years.

This year we will get HBM1/2 [1] + more ALUs to use up that bandwidth for GPUs.

Next year AVX-512 for x86 CPUs. I guess HBM comes to also CPUs in a few years.

My guess is after that next significant improvements come maybe 2020-2025, if the current performance improvement trend holds.

Next step is probably CPUs absorbing GPU duties. So far memory bandwidth has been an issue, but now you can stick HBM chips just as well in a CPU package as in a GPU package. Just need some lower clocked ultra-wide cores.

[1]: [https://en.wikipedia.org/wiki/High_Bandwidth_Memory](https://en.wikipedia.org/wiki/High_Bandwidth_Memory)

</comment><comment><USER3> <rant>

This talk was amazing, I was overwhelmed by the amount of work going into C++. The problem is that it is already an abysmally complex language (to me) and it doesn't look like anything is getting simpler. It's as if you had to be there from the start to have a full image of how the language grew and truly understand the interplay between all the "features", otherwise it's too late to become an expert, and in some cases even too late to become comfortable writing good maintainable code in C++.

Unfortunately nothing comes close to its level of "practical usefulness" in all dimensions (expressiveness, reasonable speed, ecosystem, etc...). I personally just stick to C because things are simple to understand and I just live with its shortcomings.

<comment><USER4> "If all you have is a hammer, everything looks like a nail". In C you have to build everything from scratch. If you need classes, hack some structs. If you need string concatenation, write some mallocs and strcpy, and so on. C is cool, but really, there's no way C is more "practical" than C++11, and C++14 will be even better.

<comment><USER5> > and C++14 will be even better.

Perhaps you mean C++17? Almost the entirety of C++14 is supported in the latest versions of all major compilers as of about the middle of last year. There are some pieces held back (particularly in GCC pre-5.0 and MSVC), however they are tiny parts of the standard which do not largely affect the majority of changes you'll make from C++98 to C++11/C++14.

<comment><USER4> You're right, C++14 is pretty much out there already - problem is I'm still not using latest compilers, lol.</comment></comment></comment></comment>


Desert Sunlight solar project opens in California - <AUTHOR> http://america.aljazeera.com/articles/2015/2/10/solar-renewable-california.html?utm_content=manual&utm_campaign=ajam&utm_source=facebook&utm_medium=SocialFlow <comment><USER2> I'm so glad this is happening. I remember reading an article[1] back in 2008 postulating that we could rid ourselves of foreign oil dependency by turning Death Valley into a solar farm (unfortunately the article is now blocked, but a later article was posted[2]). I thought it was genius. To finally see this come to fruition, even at a pretty small level (it looks from the article we will only see enough power for 100k homes or so), this should be a great experiment to validate the need for solar in America.

[1][http://www.scientificamerican.com/article/a-solar-grand- plan...](http://www.scientificamerican.com/article/a-solar-grand-plan/) [2][http://www.scientificamerican.com/article/challenges-for- des...](http://www.scientificamerican.com/article/challenges-for-desert-solar- power/)</comment>


Ask HN: Must do's and must know's when switching to Windows? - <AUTHOR> I am switching to Windows from Linux (and MacOS on my last work laptop). It used to be my main OS years ago, and I think the time has come for another try. I know I won't be especially happy with it, just like I am not especially happy with Mac and Linux, so I am looking for anything that can make the experience more pleasant. <comment><USER2> Tried this recently as an exercise in broadening my horizons.

\- Expect not to be able to SSH into your machine, for example when you really need to remotely make that git push you forgot before you left work.

\- Expect either a very slow unix emulation through Cygwin, or a very glitchy one through the new Ubuntu subsystem for Windows.

\- Expect installing software to be a royal PITA, and expect to start trusting binary blobs from random vendors because that's just how software is delivered on Windows. Expect every single piece of software to have its own update system, each of which will notify you separately when updates are available and have their own varying degrees of reliability in performing the update.

\- On Windows 10 you can not permanently install unsigned drivers even if you really, really want to. The closest you can get is booting up in a one time development mode which is disabled the next time you reboot, or enabling a test mode which _watermarks your screen_. Very annoying if you have esoteric or bespoke hardware, and I don't like being told what I can and can't do on my own system.

Other than that, my major issues - common to Windows and every linux DE I've tried - were with running on my MacBook with retina (high DPI) display. It's a 1/3 chance for a given piece of software whether it will gracefully support the higher pixel density, will display as a tiny window with unreadable text, or a combination of both. Lack of smooth zoom and scrolling with the trackpad was also annoying, though not a showstopper.

<comment><USER3> For SSH: [https://github.com/PowerShell/Win32-OpenSSH/wiki/Install- Win...](https://github.com/PowerShell/Win32-OpenSSH/wiki/Install- Win32-OpenSSH)

For "unix", you can actually run linux on windows now: [https://msdn.microsoft.com/en- us/commandline/wsl/install_gui...](https://msdn.microsoft.com/en- us/commandline/wsl/install_guide)

If you want to use windows store, it acts like any other walled garden store regarding "binary blobs", but personally I have never used this. The only software I have in windows is Steam which acts like an "app store" for games.

Now, I use Linux almost exclusively (there are one or two games I boot my gaming machine to windows to play), but it's actually gotten better over the years, not worse.

Just remember to block all the telemetry stuff in your firewall. [https://github.com/crazy-max/WindowsSpyBlocker](https://github.com/crazy- max/WindowsSpyBlocker)

<comment><USER2> > If you want to use windows store, it acts like any other walled garden store > regarding "binary blobs", but personally I have never used this. The only > software I have in windows is Steam which acts like an "app store" for > games.

Have you ever used an installer? Because _that 's_ a binary blob.

</comment></comment></comment><comment><USER4> \- If you miss Bash, lookup "Linux subsystem for Windows"

\- The command line is much improved. Look through the properties to see what new options are available (text wrap, copy/paste, etc)

\- If you're getting a laptop, pay a lot of attention to the trackpad. Windows laptops have a huge range from unusable to really good.

\- If you're a developer you owe it to yourself to checkout the development tools like C# and Visual Studio, if only to set the bar for good tooling in your head regardless of what environment you actually program in.

\- Check out the modern Windows 10 apps in the store. Mostly garbage but I regularly use and prefer a number of these to their web equivalents, e.g. Microsoft Groove, Netflix/Hulu, etc.

\- When I got a PC, despite not gaming for a really long time I've gotten back into it. It's amazing how many wonderful games there are that are up my alley now-a-days, e.g. Broken Age, Firewatch, N++, Obduction, etc. If you've ever been a gamer, give that world another go.

\- Get a great, high-dpi display. Windows support for it is fantastic and all those that say otherwise are crazy.

\- If you're sufficiently nerdy and end up having a house full of Windows machines, you can invest in a dedicated server to handle things like a central file server and backup. Windows Server Essentials can make for a fun, accessible-but-still-nerdy project.

\- If you're super concerned about privacy there's some reading to do to turn off all the new telemetry in Windows 10. I don't bother with this.

\- Microsoft Office is best on Windows, and cloud support is better than ever. I enjoy using OneDrive and OneNote everyday on both my PC and iPhone. Give them another go if you gave up on them while using other OSes (Outlook on Mac is particularly awful).

\- Windows is so fucking crazy keyboard accessible. Going back to using Windows involved me unlearning some of my bad habits from Mac.

\- Windows 10 can be a little buggy in surprising ways. I had to reinstall at some point because the start menu broke. Seriously. And I tried really hard to fix it without reinstalling. Just keep backups and it should be fine, it's not way buggier than macOS or Linux, just older versions of Windows.

\- Set "Developer mode" [http://www.hanselman.com/blog/Windows10DeveloperMode.aspx](http://www.hanselman.com/blog/Windows10DeveloperMode.aspx) (does a bunch of useful things like turning on file extensions in Explorer)

</comment><comment><USER5> I don't use Windows very much, so I don't have a lot of recommendations, but here are a few.

As another commenter said, Windows has its own way of doing things and expecting it to act like Linux or MacOS will just frustrate you.

My recommendation would be to, if you don't build the machine yourself, buy a Microsoft Signature PC. These don't come with all of the crapware that Windows machines tend to come with.

If you decide to install the OS on an existing machine, make sure you find the appropriate network driver and save it on a USB stick first. This is probably the only driver you will actually need - once Windows can connect to the network it can download the drivers for everything else from Windows Update.

Some Windows stuff doesn't work as well as the Mac and Linux equivalents, and vice-versa. The built-in MacOS VPN client and the NetworkManager StrongSwan CPN client are both a lot better (for me, anyway) than the one in Windows 10. On the flip side, accessing network files (through SMB, of course) is lightyears beyond the way Linux and Mac do it - UNC paths are at the top of my list of things I miss about Windows.

</comment><comment><USER6> I really recommend ninite.com as the first page you visit after installing Windows. Check all the programs you need, and you will get an installer for everything, without any bloat (toolbars, etc). You can re-run the file at any time and it will also update everything that has an update

</comment><comment><USER7> Break your habits. Windows 10 has a very specific workflow that is highly efficient, trying to shoehorn Linux, Mac or Windows 7 workflows into it will frustrate you.

Learning powershell is part of that.

<comment><USER8> And expect to re-learn powershell every time you need to use it. What's the less-than operator again?

<comment><USER9> -lt Which is short for..."less than"

Would you care to guess what "greater than" is?

</comment></comment></comment><comment><USER10> I'm using a MacBook Pro with Windows on it as my main development environment except for iOS native stuff obviously.

1\. install chocolatey [https://chocolatey.org/](https://chocolatey.org/), and install everything with it

2\. install conEmu for a decent command line

3\. install git for windows, which comes with a bash shell that brings you all the linux commands, inlcuding ssh.

This brings a Windows PC relatively far. You can even get ssh-agent working with an according .bashrc script (along the lines of [https://github.com/joaotavora/holy/blob/master/share/zsh/ssh...](https://github.com/joaotavora/holy/blob/master/share/zsh/ssh- agent-windows.sh))

This does it for me to do node / web-dev / java/ android centered development, I prefer it over macOS and Linux.

Things I do not use:

1) Cywgin. Quite the behemoth, and I get by with git bash just fine

2) The Ubuntu Subsystem. I tried it, had trouble with ssh stuff, seems not ready yet...

3) putty. the open-ssh that comes with git is better and closer to linux.

<comment><USER11>
      >> 3. install git for windows, which comes with a bash shell that brings you all the linux commands, including ssh.

Thank you!

I often wished that each HN user got one '10x upvote' a week. I would give it to you this week.

</comment></comment><comment><USER12> [https://chocolatey.org/](https://chocolatey.org/) [https://cmder.net/](https://cmder.net/)

</comment><comment><USER13> (Assuming Win 10)

\- If you have a HiDPI screen, you may run into problems with older programs looking blurry. The fix is to right click on the .exe, click 'Properties', go to the 'Compatibility' tab, and check the box next to "Disable display scaling on high DPI settings".

\- File extensions are hidden by default in the file manager. To turn them on, open File Explorer, go to the 'View' tab, and check the box next to "File name extensions".

\- Use a text editor like Notepad++ or Visual Studio Code which lets you switch back and forth with your line endings and encodings; Some editors _cough_ Notepad _cough_ add a BOM to the front of your unicode documents. (As an aside, I've been using the FTP plugin for Notepad++ lately, and it is just a pleasure to use.)

\- Between Powershell and WSL, there's rarely anything you can't do on the command line as long as you're willing to code switch a little. In particular, WSL works great for SSH. Cmder is a wrapper around ConEmu (mentioned elsewhere in the thread) and makes for a great terminal environment.

\- Chocolatey is the closest thing Windows has to a package manager. (I'm still hoping that OneGet becomes a thing.)

\- Other recommended programs: Everything search (life changing, bind it to a hotkey and never look back), Sumatra PDF, Glasswire, CCleaner, either Irfanview or Xnview, WinDirStat.

</comment><comment><USER14> \- Switch all your search settings to google, or something you deem reliable/less spammy. Most installs start with Bing or Yahoo which are way more ad oriented over what you want.

\- Install an anti-malware program for when you do get malware.

\- Install adblock plus, or other recognized ad blocker this will reduce your malware infections.

\- Be VERY VERY WARY when you download files and install software (especially if some web popup says you need some media player or driver update). Make sure you are getting any software from legit sites (which bing and yahoo don't necessarily put high on search results). When running installer be wary of the ride-along installs of additional malware (changing search settings, toolbars, dubious security shovelware, etc.) sometimes you have to check or un-check boxes cancel install dialog before the real program install dialog, etc.

\- Decide whether you like the pre-installed anti-virus, want to un-install and activate windows defender, or get another 3rd party anti-virus. Usually the co. who pays the PC manufacturer the most gets their AV installed - doesn't mean its good.

\- Check the installed browsers and remove pre-insalled unwanted plugins or extensions.

\- If you depend on PDFs just working make sure whatever PDF solution in your machine works for you, might want to switch to Acrobat Reader if it isn't Adobe.

\- Learn how to invoke the task manager (control-alt-delete) shut down tasks, restart the system in safe mode etc. Some malware will thwart progress without knowing these things. - A second computer and google will help get you out of a lot of these situations.

\- Any pop-up official looking message saying "you" are in trouble, your computer is infected - call this number, etc, are likely scams, be prepared to see that stuff too.

Think of it this way - now you will have stuff to talk about with all your friends who use Windows.

</comment><comment><USER15> If you are a programmer, then I will suggest a few do's:

\- Install git bash for command line.

\- Install ConEmu: a windows console emulator [0]. This takes console to next level on windows. I highly recommend it.

[0] [https://conemu.github.io/](https://conemu.github.io/)

<comment><USER16> Installing WSL and learning PowerShell properly are much better alternatives to the above.

</comment></comment><comment><USER17> This is just a very small change but imho a very important one. This setting has the wrong default:

[http://www.thewindowsclub.com/show-file-extensions-in- window...](http://www.thewindowsclub.com/show-file-extensions-in-windows)

<comment><AUTHOR> Oh, man - they are still doing this? I remember spending an hour searching for this setting back when I switched from 98 to XP.

</comment></comment><comment><USER18> You'll be glad to know Windows also has a "Greengrocer's Apostrophe" key

</comment><comment><USER19> Random advice:

\- You really want to be on windows 10, not 7. It's better in all ways but one to 7. The one is the forced updating. To avoid having updates forced on you in the middle of a day, give windows a chance to do updates by shutting down every once in a while.

\- Settings are spread across the settings app (start), the control panel and various control applets (right-click on start), the registry (windows+R, regedit <enter>) and files on disk (like the hosts file in windows/system32/drivers/etc). Honestly, it's a mess, and google is your friend. It bites you in the beginning, but once set up it really doesn't matter.

\- Secondary screens: windows+P switches modes (mirror, second-only, ...). Saves you from unplugging and replugging cables with your fingers crossed. Mixed dpi is a mess, still. You can configure the scaling of different screens separately from display settings, but apps which haven't been updated (properly) for compatibility with mixed dpi look blurry, tiny or huge on any screen that wasn't the primary screen when you signed in to windows, and sometimes look off even on that one. This is getting better, but still a pain.

\- People will advocate the linux subsystem for windows, and it's great, but it lives in its own walled garden. If you want access to linuxy tools from the regular cmd.exe consider installing something like msys2 to get the basics in your windows path. Or learn powershell.

\- Learn the shortcuts to manage your windows / virtual desktops. Windows is pretty good at managing windows. [https://www.thurrott.com/windows/windows-10/4915/windows-10-...](https://www.thurrott.com/windows/windows-10/4915/windows-10-tip- master-multitasking-keyboard-shortcuts) (props to Paul Thurrott for his many awesome tip articles.)

\- Be more careful where you get software from. If you were last a windows user in the era of download.com and the like, forget about those sites. They're all malware-ridden. Only get software directly from the vendor's site. Also, ninite is pretty good to get a basic set of software going. You don't need a third-party anti-virus, the baked in one is good enough.

</comment><comment><USER20> I have both Windows and Linux installed on this machine. I try to stay away from Windows for anything closely related to programming. It's a pain in the ass. Once you have to touch the terminal, things start to get messy, and it's hard to ignore the terminal when programming. Granted, I use the terminal more than the average coder, but I still would never touch it. That said, to answer your question, you probably want to install the Bash on Ubuntu on Windows thing, which should allow you to run git, bash, etc. on Windows without having to use cygwin.

</comment><comment><USER21> So, whats the best windows ssh client these days? Still putty ? bitwise? other new hotness?

I've been getting pretty frustrated with my new mac and im supe r tempted to try out a Razer Blade.

<comment><AUTHOR> I belive you can ssh without any troubles using Bash on Ubuntu. If I really have to start using PuTTy for my ssh needs, I am going back to linux immediately..

<comment><USER13> Yep, ssh works out of the box with WSL.

</comment></comment></comment><comment><USER22> Curious if anyone has used this at Github alirobe/reclaimWindows10.ps1 And what they think. I wish Redmond would give older laptop users an option to turn this off so it wouldn't spin up my hard drive. If I move to Linux this will be the reason ! [https://gist.github.com/alirobe/7f3b34ad89a159e6daa1](https://gist.github.com/alirobe/7f3b34ad89a159e6daa1)

</comment><comment><USER23> A lifelong Windows user, I wrote an article about nitpicky differences (UI and otherwise) between Windows and macOS after being issued a Macbook at work. You may find useful information in it - [https://hellojason.net/blog/nitpicky- differences-between-win...](https://hellojason.net/blog/nitpicky-differences- between-windows-and-os-x/)

</comment><comment><USER24> Maybe you'll find something useful in this post: [http://f5n.org/blog/2016/tools-windows-2016/](http://f5n.org/blog/2016/tools- windows-2016/) \- it's the stuff I use to not tear my hair out when I need to get something other than gaming done. I think it's missing VS Code, which was a pleasant surprise.

</comment><comment><USER25> I am very happy that I am the first one to comment here about [https://www.listary.com/](https://www.listary.com/) which is the best suggestion which again, I got here. Install it.

<comment><USER26> Yes. Listary is the one thing I miss from Windows after I switched to Linux Mint. (well, that and running Foobar2000 natively)

Also I wanted to mention 7+ Taskbar Tweaker ([http://rammichael.com/7-taskbar- tweaker](http://rammichael.com/7-taskbar-tweaker)), which is a fantastic little util that helps you make your taskbar just the way you want it. Mousewheel over taskbar for volume control, middle click closes programs, etc...

<comment><USER25> Thanks! these things make me feel like God!

</comment></comment></comment><comment><USER27> Windows is case INsensitive. Just merged two repositories accidentally because of that.

<comment><USER28> so is OS X by default:

         $ cd /tmp
         $ mkdir Abc
         $ mkdir abC
         mkdir: abC: File exists

</comment></comment><comment><USER29> If managing multiple ssh/vnc/rdp sessions RoyalTS is a must have.

[https://www.royalapplications.com](https://www.royalapplications.com)

</comment><comment><USER30> A few of my must-have apps:

Classic Shell (simpler start menu)

7-zip (lzma, etc.)

SyncBack Pro (local/s3/on-insert backups)

JetAudio Plus (BBE harmonic extrapolation mp3 HF restoration)

USBDLM (external hdd serial # based drive letter assignment)

</comment><comment><USER31> Do not use or even rely on windows file-history for backups!

It can and does fail silently. (e.g. with too long path names or simply no backup drive attached in a long time)

</comment><comment><USER32> The file system limitations...

</comment><comment><USER33> I'll pitch in since some of the things I recommend are not on this page yet:

\- Generally Windows 10 is better than 7 other than the privacy and forced update issues. (Windows has a tick-tock of good and bad releases so forget about 8.x)

Management:

\- As others said, the typical way to remotely manage Windows is not to SSH into the machine you want to manage. Instead, you do one of 2 things:

\- - Use RDP/Remote Desktop Connection/Terminal Services to connect. RoyalTS from www.royalapplications.com makes it even better

\- - For anything that used the MMC (Microsoft Management Console) you can just open it locally and connect to the target computer. The MMC is one of the things I miss on Linux. A single coherent graphical interface to control so many parts of the system and you can even use it remotely. YaST is the maybe the closest thing I know on Linux.

Apps:

\- Use portable apps from PortableApps.com and maybe a few other sources. Most of the essential apps I use have portable versions. Portable apps is another thing I miss on Linux. They are apps that have everything contained in a single folder. The intent is to carry them on a flash drive but you can also keep them on the computer. The effect is that, if for whatever reason you can no longer boot/need to reinstall/need to move to a different computer/etc., you can just open the case of the PC, connect the HDD/SDD to a working windows PC (optionally copy the folder with all your portable apps) and just use those apps with all the settings you had before. There have been attempts to bring this to Linux but without success.

\- Use chocolatey.org This is the Linux package management concept brought to Windows

\- If you need the tools you are used to on Linux look into either Cygwin (both Win7 and Win10) or the Ubuntu subsystem for Windows (Win10 only, also there are ways to change it to Arch or OpenSuse)

\- Win10 only: right now there are rather few non-Microsoft apps on the Store that are actually great. The Microsoft apps however are quite cool.

\- Win10 only: don't bother with the Edge browser YET. It is not ready. Sure rendering is fast and battery efficient but we expect much more from a browser. Right now it is still very limited and there are very few extensions available.

\- Some other apps I use: RamBox, F.lux, Visual Studio Code, Shazam, QTTabBar

\- Use Alternativeto.net to find alternatives to the apps you use.

Security:

\- No.1 rule: be very careful where you download stuff from and what you install.

\- Some may say otherwise but I no longer see the need to have third party anti-virus software for On-Access scanning . Some third party AV products may even make your computer less secure. Win10 comes with AV by default, and on Win7 there is Microsoft Security Essentials available.

\- Use the VirusTotal Uploader for On-Demand Scanning. You upload the file and it is scanned with most antivirus products (69 of them at the moment).

Development:

\- The Microsoft tools are great and may may be free for your use case:

\- - Visual Studio is top notch (Community edition is free)

\- - SQL Server is also great (Developer edition is free for development, Express edition is more limited but free for any use)

\- - Learn PowerShell

\- - Use the Tortoises (Tortoise Hg/Tortoise Git/Tortoise SVN) for version control. They integrate great with Windows Explorer.

Other:

\- - Enable showing the file extensions in Windows Explorer. This is a stupid default.

</comment><comment><USER34> Install cygwin.</comment>