Python 3 makes it easier to develop high-quality software - <AUTHOR> http://migrateup.com/main-difference-python-3/ <comment><USER2> This is sad and frustrating. The article is trying to convince people to upgrade _to_ a 7-year-old version of Python! And everyone is still skeptical about it, thinking it's too new, too risky, unproven, and libraries aren't ready _yet_.

Python 3 adoption takes longer than entire NodeJS lifetime. In the same timeframe PHP introduced _and_ EOLed 5.3 (edit: and there were 4 years between release of 5.0 and EOL of 4.x, which involved backwards-incompatible refactoring of OO semantics).

<comment><USER3> > And everyone is still skeptical about it,

They are not skeptical. Nobody thinks "yeah if I just wait long enough, Python 3 will go away and 2.8 will come out".

They just don't see an incentive to update. Simple as that. It is basic economics of time and money.

Python 2 wasn't terrible and Python 3 isn't dramatically better. Unicode and other stuff in Python 3 is nice. Is it nice enough to start digging into stable, working, money making code just to say "Yay, Python 3"? I think the development community has spoken by how it was handled. It's gonna happen but it will happen at a very slow pace.

Imagine this alternative scenario -- "Python 3 brings 3x speed improvement + removed GIL". Ok, I bet you, there would have been a much faster adoption because now there is a greater incentive to justify it. People would think "Yeah, I'll destabilize my code a bit but I gain performance, I can do that".

Someone in a sibling comment suggested "They should have just stopped updating security patches for 2.7, that would have forced them to use 3.0". That's ok if Python holds a monopoly on development languages. But it doesn't. As soon as that happens developers will not just look at updating to Python 3, they'll start looking at other ecosystems: Go, Elixir, Java, Clojure, Scala, NodeJS etc.

<comment><USER4> I could not agree more.

To add to this; if it included even a 2x speed up / memory reduction, I think 90% of everyone would have switched by now, and you know what else? Go probably wouldn't exist.

<comment><USER5> This is a good point. Go is a direct response to Google's experience with Python.

</comment></comment></comment></comment><comment><USER6> I've said it before, I'll say it again. When all of the major Linux platforms provide the same pre-built Python 3 packages for the packages I use, I'll make the migration. Until then, it's just easier to stay on Python 2.

Yes, I could build the packages/wheels myself. Yes, I could install a compiler on the target machine and let the binaries build from scratch. I won't, however, since it's a lot of time for remarkably little benefit. Python 2 is still well supported, and is a great language to program in.

Yes, Python 3 has cleaned up some of the rough edges of Python 2; but the improvements are still not significant enough to offset the cost of porting libraries and building packages.

<comment><USER7> but for node we expect everyone to install/build from source an not use the supplied packages because they are ancient, in comparison.

Which distribution doesn't ship python3.3?

<comment><USER6> Most ship python 3.3, but most of the libraries which the distro provides pre- compiled are not Python 3.

e.g.

python-mysql python-django python-keyczar python-pyhsm

> but for node we expect everyone to install/build from source an not use the > supplied packages

This is not necessarily an improvement in the state of packaging. Verifying that unsigned source code has not been changed is a hard problem (which NPM has not yet solved). Installing compilation tools and extensive header files on a production machine opens up a new class of security vulnerabilities on that machine (whether a VM, container, or bare metal).

<comment><USER8> There's Anaconda too: [https://www.continuum.io/why- anaconda](https://www.continuum.io/why-anaconda)

Many companies use it to run a recent Python stack on any Linux distro they like.

<comment><USER9> Anaconda was the easiest way for me to get Python 3 running on my Slackware instance. I am very pleased with it.

</comment></comment></comment></comment></comment><comment><USER10> When I went to learn Python I was immediately faced with a choice that would have profound effects on my future success: Python 2 or Python 3.

Both sides are extremely persuasive and thus I felt that _no matter what choice I made it was the wrong one_ and would haunt me down the line.

So I just stuck with a different modern language that has wide acceptance and isn't battling with itself.

<comment><USER11> The same thing hapenned to me in 2011, so I ended learning Ruby, no regrets.

<comment><USER12> Which is quite ironic, because (at least from my experience) Ruby constantly breaks backward compatibility.

<comment><USER13> It's not necessarily about breaking or maintaining backward compatibility that matters here. It's about how supporting two similar looking yet ultimately incompatible versions creates confusion for new users, driving them away.

This is the same issue facing Perl (although the Perl situation seems more dire) WRT Perl 5 vs Perl 6. For Python maybe the benefits of keeping Python 2 alive for large users offsets the harm of any confusion, I have small projects (all in Python 3) so it's a rare annoyance rather than a deal breaker.

<comment><USER14> > This is the same issue facing Perl (although the Perl situation seems more > dire) WRT Perl 5 vs Perl 6.

The situation with Perl is neither more dire nor really the same issue as with Python. Perl 5 is not going away. Perl 6 maintainers are not the same people as Perl 5 Porters -- both will be maintained for the foreseeable future.

Second, Perl 6 is a significant change to Perl, with far more features and somewhat different syntax. People will want to change for the features. Running Perl 5 code from inside Perl 6 works by calling out to libperl, which runs a real version of Perl 5. Perl 5 will still be popular due to ubiquity, access to CPAN modules, and things like CPAN Testers.

So it's a choice for the developer, to develop in a new language that just happens to be Perl-flavored, or to go with any other language. Not really a crisis.

</comment></comment></comment></comment></comment><comment><USER15> My problem with this post is not its factual accuracy. It's factually accurate, downright impressive.

My problem is with its premise. That premise is that Python 2.7 people need to be somehow educated. To be shown some kind of light. It's the same premise that the project leaders have been going on about for 7 years. "Can't you see how much better this is?". Worse: "are you 2.7 people stupid, or what?".

It hasn't worked.

Why hasn't it worked? Not because 2.x people are slow or uninformed. They're very well informed. They assess the merits and downsides. They've had 7 years!

The reason is a combination of inertia, but also, many people actually think that in many ways, 3.x is a _regression_. If you don't need Unicode, Unicode is a huge pain in the xxxx. I was just having to mess with "b"s everywhere _today_ on strings over msgpack to a non-pythonic endpoint. Lazy ranges (can also be) a huge pain in the b __t. So I must move to 3.5. For what? Type annotations? Asyncio? I 've been using (the highly impressive) Tornado for 3 years on 2.7.

Now google brings out the brand new TensorFlow. On 2.7. "But porting to 3 is their #1 priority" I'm told. Okay cool. You wait. I won't.

So the advances of 3 meet the regressions of 3. Even if you believe the net is positive in 3's favour, that net is not nearly enough to persuade people with actual lives outside of computer science, to port years of code, and more importantly, to port their brains to work with the new dispensation. Python is a language for people who want to get things done. 2.7 gets things done. Zero problems. For many people, that's the killer feature.

</comment><comment><USER16> Every programming language, programming language update, and programming tool since the dawn of time claims to make it easier to produce high-quality software.

<comment><USER17> >Brainfuck

Seriously though, the point is well taken. The right tool for the right job will always apply, and I like to think most developers and programmers acknowledge that there are very few tools that should be used in every opportunity and by every person.

<comment><USER18> Interestingly Brainfuck has a use, though it is an obscure one. It's proven to be turing complete, and has a rather trivial set of instructions and rules. If you can write an interpreter for it in another language, you prove that language to be turing complete as well.

</comment></comment></comment><comment><USER19> Python 3 is so far ahead now as a language that it surprises me anyone would even consider it for a new project. Among other things, Python 3.4 and 3.5 have added support for coroutines that provide a whole new level of utility to the language. Meanwhile, Python 2.7 is a study in limitations to anyone who has followed up on Python 3.x developments.

</comment><comment><USER20> I still don't understand what happened here historically, was there ever an upgrade path or way to make this a smooth transition? I can't think (surely there is) of another language that had such a hard-breaking version change that still persists 10 years later as a fracture across the community.

<comment><USER21> It hasn't been 10 years. There were known IO performance regressions at the time 3.0 was released, nobody involved in releasing it would have said to use it in production right away. 3.1 was released ~6 years ago:

[https://www.python.org/download/releases/3.1/](https://www.python.org/download/releases/3.1/)

(Even if the above is deemed BS, the release of 3.0 was 7 years ago)

Many of the 3.0 features can be switched on in 2.7 and there were some attempts to automate as much of the code change as possible (but people ended up preferring to write code that runs on both 2.7 and 3.x, but I suppose that then is not really evidence of a fracture).

<comment><USER22> I remember quite distinctly when the Python 3000 manifesto was released just under ten years ago, in April of 2006. That is when the line in the sand was drawn and the key mistakes were made that caused the "schism" in the community. What the Python community was screaming for was a fix for the GIL and the other performance issues in Python, not minor changes to Unicode handling that were maybe awkward but perfectly possible to get right in Python 2.6.

Google seriously spent tons of effort at the time trying to remove that GIL. They were one of the biggest proponents of Python at the time, and frankly they were part of what made it so successful. With their work on Unladen Swallow not making meaningful progress and the Python core developers concentrating on Python 3000, making it clear that they don't even care, it isn't a wonder that Google was hedging their bets by hiring Rob Pike to work on Go, which many now see as most directly being a competitor to Python, and which has sapped a lot of people who would potentially be Python users.

Meanwhile, the broken release of 3.0 needs to be blamed for part of the problem, not used as a reason to delay the historical date of fracture: a lot of things were broken in 3.0, including some basic things that Python got wrong in Unicode. The performance regressions were not quickly fixed, making people hesitant of the benefits of Python 3, and the Unicode issues (which were not fixed until years later, when they added the round-trip-safe Unicode conversions; but even this is a workaround, as filenames are defined to be strings of bytes by the filesystem) were ironic as the whole point of Python 3 was to somehow be better at dealing with Unicode :/.

And you seem to be forgetting that the real problem was not the features added in 3.0 but the features _taken away at the same time_ that made it impossible to write reasonable code that ran on both 2.7 and 3.0 even for extremely simple cases like "catches an exception". They only just a year or so ago have started to crack their party line of "shut up and upgrade to 3: it is better and you are wrong" and add some backwards compatibility features to 3.x, such as supporting the u prefix (which was the absolute dumbest thing they could have removed).

</comment></comment></comment><comment><USER23> On a tangential note, no pun intended, I am a little confused. Why would you ever want compare in the manner of "TrickyAngle(6) < TrickyAngle(5)"? I can understand something like "trickyAngle_A.degrees < trickAngle_b.degrees" but when comparing instances of a class like that, when would one ever be...greater than the other?

<comment><USER24> Often, an instance of a class represents a mathematical entity (vector, matrix, imaginary number, mathematical set, et al) where less than might be a fundamentally reasonable operation, especially in some specific context.

His example is using it as an angle, where comparing two of them is conceptually pretty sensible.

If you pretend it's a structure, sure, you'll need to extract primitive data types out of it before doing anything with it. But if you want it to behave as a higher-level abstraction, reimplementing less-than (say, for comparing the vector magnitude) at every call site isn't great.

<comment><USER25> (This is completely beside the point.)

> comparing two of them is conceptually pretty sensible.

Well, there are a bunch of sensible ways to do it, depending what the angle represents. You might not want to privilege any of them over the others directly in the class.

Is it a point on the unit circle? It doesn't make much sense to compare (sqrt(2), sqrt(2)) to (-1, 0).

Is it an angular distance to travel from point A to point B? Then you want 355 and -5 to both be less than 10.

Is it an amount that a screw has to be rotated? Then you can't take mods, so 720 > 360 > 0.

Do you have a robot that can only turn anticlockwise? Then maybe 5 < -10 < 355\. This is the comparison implied by the implementation in TFA (self.degrees = degrees % 360), but it's pretty obscure.

</comment></comment></comment><comment><USER26> Given that even a relatively inexperienced developer can easily port 2,500+ lines of Python 2 to Python 3 per day, there's really very little reason for anyone to still be on Python 2 regardless of the benefits or lack thereof of Python 3. This is especially true if you're not trying to take advantage of all the performance benefits of Python 3 right away, and are content just to wrap iterators in list() or whatever just to get the functionality working the same without much effort.

<comment><USER27> It's libraries rather than porting.

Funnily, though, I just thought 'yeah there's that library I use, they never ported that', for one of my codebases. Just looked it up and they now have ported it. So I guess it's time for me to do the same. I wonder what proportion of (actually used) libs are Py 2 only still.

<comment><USER28> At this point very few 'actually used' (meaning, used by more than a handful of organizations at most) are Py2 only. There are a few still in the process of porting, and a few that will never be ported due to being replaced (but are still somewhat popular for one reason or another.)

For those who don't know: [http://python3wos.appspot.com/](http://python3wos.appspot.com/)

<comment><USER5> People are still releasing brand-new Py2-only libraries to this very day. This is especially true in science, math, nlp, ml, etc.

<comment><USER28> Yes, and I kinda think it is silly, but whatever. Care to share any examples of recent releases? I know Google's TensorFlow was/is Py2 only, but a Py3 release is imminent. Google has an unfortunate habit of using Py2... I can understand they have their reasons... it is a bit irritating though :)

(Edit: Not that I care what they use internally... but sometimes they release a really cool open source library and it is Py2 only... arr! But at least they are sharing, so I can't really be too upset :)

<comment><USER29> snap-python. Development started in 2013, and yet they refuse to support Python 3: [https://github.com/snap-stanford/snap- python/issues/52](https://github.com/snap-stanford/snap-python/issues/52)

<comment><USER8> So you'll have to convince them. Maybe they did not realize that SWIG supports Python 3 nowadays?

There's really no good reason not to support Python 3, and projects which refuse will at some point be forked.

<comment><USER30> Nah, just do the smart thing and stick with python 2.7.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER31> Majority of people dont care about new shiny, they care about things that broke or changed. Probably 90% of them started complaining because print statement is a function :).

Python 3 insistence on unicode hurts my brain. I had a 'pleasure' of writing Python 3 script manipulating data produced by Python 2 (custom pickle). Ended up reimplementing whole Python 2 pickle library by hand, because apparently no one imagined a use case involving reading raw bytes into a buffer.

<comment><USER32> The problem is really that Python 3 isn't new and shiny. It's an attempt to improve some downsides of Python 2 and some parts did actually get better but many parts didn't although they easily could have been improved, some parts even got worse.

Python 3 provides no real benefit to an experienced Python developer. So considering all the things you could possibly do, switching to Python 3 is not switchting to a new and shiny thing, it's just a bad decision.

If you really want to switch to something new and shiny, there are now many more interesting language options. Modern Javascript has copied so much from Python, you can feel very much at home there. If you care about concurrency, you have Go. If you care about concurrency and care about using a language that's well designed or just want performance, there is Rust.

<comment><USER33> async lib is really really nice. You can easily issue async requests now. Also, a bunch of useful utilities were improved like shutil.

<comment><USER32> The idea behind asyncio is nice. The API is mostly nice. The new async/await syntax that has been added mostly with asyncio is great. The documentation however is a horrible mess and the implementation could almost certainly be a lot better. Now it's in the standard library though...

David Beazley recently held a great talk on this very topic, in which he goes into these issues in more detail: [https://www.youtube.com/watch?v=lYe8W04ERnY](https://www.youtube.com/watch?v=lYe8W04ERnY)

</comment></comment></comment></comment><comment><USER34> Complaints about a language translate automatically to low-quality software the same way micro-optimizations automatically translate to fast software.

In the real world, software depends significantly more on the properties of a developer or a team. Building software is about people more than it's about tools.

</comment><comment><USER35> Dealing with Unicode in Python 2.x is a _nightmare_. So if you need to go beyond ASCII, Python 3 is a huge improvement. On the downside, if you want to use tools like App Engine, you're still stuck with 2.7 for now, but hopefully that will change.

<comment><USER36> Python 2's handling of Unicode basically isn't. That's as much the fault of third party libraries as the core language, but it is a real and constant time suck.

I'm sure I hit Unicode problems in Python 3 a few years ago as well, but if current versions are better that would be a sufficient reason for switching.

</comment></comment><comment><USER37> This is excellent. The first one is totally unknown to me. I wish there is a comprehensive changes between 2.7 and 3.X with code, release notes is okay but falls under different version and hard to grasp at once.

It's really hard to keep up with language changes and implementation changes.

EDIT: I am so surprise at the number of downvotes in this HN thread. I bet there is some haters out there today :-)

<comment><USER21> The first one was a headline change in the Python 3000 release notes:

[https://docs.python.org/3.0/whatsnew/3.0.html](https://docs.python.org/3.0/whatsnew/3.0.html)

The other items in the article are also mentioned there, but not as headline items. The great majority of behavioral changes from 2.7 to 3.x should be listed in that one document, there was a freeze on language changes for several of the 3.x releases.

<comment><USER37> That level of code demonstration from the author is more comprehensive than the documentation in what's news.

A lot of the PEPs are way too verbose for a quick bite. PEP are great for a weekend read, but for a quick summary, OP does a better job.

<comment><USER21> I wasn't saying that you should be satisfied with just the release notes, I was pointing out that you were overstating the difficulty in finding an overview of the changes that went into Python 3.

There are lots of other changes since then, but most of them are additions (that don't directly impact old code) or to libraries or whatever.

</comment></comment></comment></comment><comment><USER38> The whole 2 vs. 3 debate would simply have not existed if the Python core devs would have simply _refused_ to backport tweaks and fixes from 3 to 2 and would have _forcefully deprecated_ 2.x immediately after releasing 3.0, even if it was inferior to 2.x at first release.

Guido should have used his power to force the move forward down people's throats, because that's the _responsibility of a BDFL._ The _D_ is there for a reason, and its exactly in this cases that the power of the Dictator role should have been used.

Communities rarely move forward on their own if left to decide democratically: they need o be _forced_ or _tricked_ into moving forward by _individuals with vision!_

...heck, I'm even starting to like the nodejs folks for their "shove the future down people's throats" attitude :)

<comment><USER39> I think it would have been more prudent to have implemented an iterative approach:

Python 2.8: \- boring easy to fix changes like division, print function, exception handling syntax, removal of iteritems() / etc

Python 2.9 \- library reorganization (urllib2 & urllib, etc)

Python 3.0 \- unicode stuff

Most organizations that have been lingering at 2.7 for 5+yrs would have long since migrated to 2.9, and would thus be half way to 3.x in terms of backwards compatibility.

Now instead, everyone has to introduce the better part of a decade's worth of backwards compatibility changes at once, or be left in the dust. Hardly a fair choice.

<comment><USER21> Some of your Python 2.8 exists as from __future__ imports added to various 2.x releases.

[https://docs.python.org/2/library/__future__.html](https://docs.python.org/2/library/__future__.html)

(in versions where the new behavior is the default, the import does nothing and is not an error)

</comment></comment></comment><comment><USER40> I'm sorry, but given how much high quality software is written in Python 2, examples of high quality software written in Python 3 more easily would do a better job proving the central thesis of the article than pointing out design defects of Python 2 fixed in Python 3. Because at the end of the day, there are still plenty of design defects in Python 3 (or any other language) that a coder might trip over. I mean who is to say that new yield functionality of Python 3 wouldn't lead to hard to understand spaghetti code? Or the new way of handling Unicode isn't worse than the old way? Listing concrete projects that benefitted from being written in Python 3 rather than 2 would be much more convincing.

<comment><USER41> > _I 'm sorry, but given how much high quality software is written in Python > 2_

The reason for that isn't "Python 2 is intrinsically better than Python 3," though. It's the sheer inertia of a language whose last minor version (2.7) was released _five years ago_ and the persistent meme that Python 3 is buggy and unusable, despite clear advantages as noted in the article and the added compatibility of popular Python 2 packages in recent years.

As with hardware, Python 2 will only die when the top packages _completely drop support_ for it, and it wouldn't surprise me if that happens sooner than later. (Django, for example, will be dropping Python 2 support in 2017: [https://www.djangoproject.com/weblog/2015/jun/25/roadmap/](https://www.djangoproject.com/weblog/2015/jun/25/roadmap/) )

<comment><USER42> Why refer to these as two separate languages? Right now, the vast majority of Python's most popular libraries and packages support both 2.7 and 3.4+ with a single code base. We are a Python shop, and we are doing the same with all our new projects as well. There's a little bit of extra awareness you have to have to do certain things (metaclasses, for instance), but the overhead is no more onerous than, say, following well-defined coding conventions.

</comment></comment></comment><comment><USER43> It doesn't help that Mac books come with 2.7 installed. For someone starting out (Python is often used as a teaching language in CS101-esque classes), figuring out how to get one's machine to use 3 might seem really difficult/impossible.

<comment><USER44> Almost everyone will say "Use homebrew". I don't think it will that difficult.

<comment><USER45> Yeah brew install python3 seems to work. You then just type python to run 2 and python3 to run 3. The compsci course I did was in Python 2.

</comment></comment></comment><comment><USER46> > Python 3 makes it easier to develop high quality software

That is, unless said software needs to include a popular library that has not been ported.

<comment><USER8> There aren't many unported popular libraries left. Actually, the only one I remember off-hand is Twisted, and they're working on it.

</comment></comment><comment><USER47> Library compatibility is definitely an issue. You still have some very influential libraries that are not Python 3.x compatible. But an oft underestimated issue is the number of Py3 improvements that have been backported to Py2. For example absolute imports. That has made the case for moving to Py3 harder.

<comment><USER12> Argh, I don't like this argument.

There's really barely anything that is python2 specific, most of the things that weren't ported is no longer being maintained.

I think the main reason you should start moving to python3 is that it will be discontinued. Python 2.6 was EOL in 2013, 2.7 they've been more generous and you have 4 more years, originally it supposed to be 2015.

There's no good reason to stick with 2.7, if you have some legacy apps there's nothing preventing you from having Py2 and Py3 installed side by side.

If you need to write libraries that share code, it's much easier to write the code in Py3 and then make it backwards compatible with use of from __future__ ... imports and six module.

I feel like people who still complaining about the difficulties did not actually tried Python 3. Py3 is much more enjoyable language to write in.

<comment><USER47> TensorFlow is just the latest library that is Py2 only. App Engine is Py2 only. The bigger issue is the 2 biggest weakness with Py2 that were not addressed in Py3 (CPython version at least) - GIL & JIT. JIT is addressed more or less by PyPy but it is Py2.7-compatible, not Py3 compatible. Addressing this in the standard CPython implementation can make for a very compelling case for move to Py3. Otherwise, it does not buy you much.

<comment><USER12> TensorFlow and App Engine are both released by Google which prefers Py2 because of the FUD, although regarding TF hopefully it won't be for too long. The first issue created on GitHub[1] is basically about adding Py3 support.

Regarding GIL and JIT. Those problems are mostly performance related and not easy. As you mentioned GIL is available everywhere so it's not a good argument regarding py2 vs py3.

As for JIT you get it with PyPy which by itself is not 100% compatible with CPython (for example as of now majority of python modules written in C simply won't work).

Although they do have PyPy compatible with Python 3 although it is not as stable, but since Py3 is picking up hopefully it will be becoming more popular.

For me, it's the other way around, I have not used PyPy primarily because it's compatible 2.7 and I don't use Python for performance, but if I could get performant Py3 implementation then why wouldn't I want to use it?

[1] [https://github.com/tensorflow/tensorflow/issues/1](https://github.com/tensorflow/tensorflow/issues/1)

</comment></comment></comment></comment><comment><USER48> Python 3 is great, but that doesn't matter.

The ecosystem is rotting for 2 reasons.

First, there's no easy way for library developers to maintain a codebase that supports both 2/3 development in parallel. Yes, it's easy to use a 2to3/3to2 tool but unlike transpilers in Javascript the output code may still require fine-tuning after the tranform.

This could be solved by adding preprocessor support to python (ie for conditional loading of code) but GvR is adamantly against this approach use to the way many devs write unmaintainable code in c via the preprocessor.

I actually published an OSS project called pypreprocessor that was supposed to solve this issue. It works to add preprocessor conditionals to code but won't work with both 2/3 code in the same file because there's no hook to inline code before lexer runs and throws syntax errors.

Second, package management in python still sucks. Do you use distutils, distutils2, setup.py, etc? There's no single standardized approach that everybody agrees on and each tool follows a unique approach or needs to be supported because of legacy code.

Unlike the Ruby, Javascript ecosystem where package management and publishing is relatively straightforward/easy, it's an absolute PITA to publish packages to PYPI.

Back in 2011, the answer was. Just wait 5 years for everybody to adapt their libraries to support Python 3. 5 years later, nothing has changed. The existing libraries don't want to piss off users by dropping Python2 support and maintaining two separate branches of the code in parallel sucks. So, since most everybody that uses python in production still relies on Python2, Python2 is still the default.

The library ecosystem makes the platform. The tooling sucks so library devs don't want to make the switch.

Until there is a major cultural shift python devs have 2 options. Use a better version of the language without the support of a mature library ecosystem, or use an outdated version of the language with a rich ecosystem.

</comment><comment><USER49> And how many subtle bugs will be introduced during porting software for Python 2 to Python 3?

<comment><USER50> We ported a major production site from python 2 to 3 a year ago. Exactly one bug has come up - something to do with unicode encoding on a relatively minor part of the site. Thanks to 2to3, the concerns for bugs coming up in porting are way overblown.

<comment><USER51> The only insidious issues I've encountered with porting apps have been related to Unicode as well. A lot of old Python 2 code is (what appears to me) very hackish compared to the elegance that is Python 3.

<comment><USER52> I've seen quite a bit when porting a statistical library that used Python 2's default floor/int division behavior for quite a few operations.

Sometimes, though, the _2_ version had bugs because of this behavior. So, the bugs were both subtle and bi-directional. I definitely fault Python 2 for allowing that practice, and am glad we're now using Python 3.

</comment></comment></comment></comment><comment><USER53> For me it was these two...

1\. Calling the next( ) builtin instead of .next( ) method on an interator or generator.

2\. .items( ) on a map in 3 is like .iteritems( ) in 2. Which means that nasty short cuts like map.keys( )[0] no longer work.

Oh yeah, and print( ) is a function :)

<comment><USER33> I think a bigger issue with keys() is that now the order is non-deterministic. So people may have relied on it not being in any particular order but being the same order. These are the kinds of bugs that are difficult to detect.

<comment><USER54> I don't understand this comment. The hash method changed under different releases of Python 2.x, enough that was had to change our doctests to ensure a consistent order. So as far as I'm aware, the only guarantee is that calling .keys() and calling .values() will give you the terms in the same order, so long as there hasn't been a modification in the middle.

<comment><USER33> Ok, try running this in a program like so:

        d = {chr(i):i for i in range(65,91)}
        print(d)

Do it with python2 and python3. You'll see that the output in python3 changes every time.

If someone was relying on consistent ordering, they're going to have a bug.

Python2's ordering is deterministic[0]

[0][https://docs.python.org/2/library/stdtypes.html#dict.items](https://docs.python.org/2/library/stdtypes.html#dict.items)

<comment><USER54> Okay, we're talking about the same thing. As the documentation points out:

> If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() are > called with no intervening modifications to the dictionary, the lists will > directly correspond.

If you restart Python, you have broken the correspondence.

You'll note that either the documentation is incomplete or your interpretation is incorrect, as the most recent versions of 2.6 and 2.7 will use a randomized hash table when the -R flag is enabled:

        % ~/Python-2.7.10/python.exe -R x.py
        {'M': 77, 'L': 76, 'O': 79, 'N': 78, 'I': 73, 'H': 72,
         'K': 75, 'J': 74, 'E': 69, 'D': 68, 'G': 71, 'F': 70,
         'A': 65, 'C': 67, 'B': 66, 'Y': 89, 'X': 88, 'Z': 90,
         'U': 85, 'T': 84, 'W': 87, 'V': 86, 'Q': 81, 'P': 80,
         'S': 83, 'R': 82}
        % ~/Python-2.7.10/python.exe -R x.py
        {'Z': 90, 'Y': 89, 'X': 88, 'W': 87, 'V': 86, 'U': 85,
         'T': 84, 'S': 83, 'R': 82, 'Q': 81, 'P': 80, 'O': 79,
         'N': 78, 'M': 77, 'L': 76, 'K': 75, 'J': 74, 'I': 73,
         'H': 72, 'G': 71, 'F': 70, 'E': 69, 'D': 68, 'C': 67,
         'B': 66, 'A': 65}

I can totally understand how people expect an invariant order. As I pointed out, our regression code broke in the 2.x series because we relied on consistent ordering, and CPython never made that promise. But what I quoted above is the only guarantee about dictionary order. Everything else is an implementation accident.

Nor is it the only such implementation-specific behavior that people sometimes depend on.

      >>> for c in "This is a test":
      ...   if c is "i": print "Got one!"
      ...
      Got one!
      Got one!

That's under CPython, where single character strings with chr(c)<256 use an intern table. Pypy doesn't print anything because it doesn't use that mechanism.

Note that 'is' testing is also faster:

        % python -mtimeit -s 's="testing 1, 2, 3."*1000' 'sum(1 for c in s if c is "t")'
        1000 loops, best of 3: 893 usec per loop
        % python -mtimeit -s 's="testing 1, 2, 3."*1000' 'sum(1 for c in s if c == "t")'
        1000 loops, best of 3: 1.01 msec per loop

This extra 10% is sometimes attractive.

<comment><USER33> Sure, but why did you enable the -R flag?

We are talking about the default way of doing things in the most commonly by far used implementation.

I'm not saying someone should have relied on the specific ordering or that the code that does rely on it is a great way of doing things.

CPython2 did make that promise -

        CPython implementation detail: Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary's history of insertions and deletions.

In other words, the order should be the same no matter how many times you restart the application.

It is a subtle source of bugs since it always worked in each specific version of CPython2 without the -R flag.

<comment><USER54> "why did you enable the -R flag?"

Because either the documentation means to include -R in the description, in which case your interpretation of the documentation is incorrect, or the documentation is incomplete because it doesn't describe a valid CPython 2.x run-time. Either way, it indicates that the difference isn't, strictly speaking, a Python2/3 issue.

"an arbitrary order"

Where does it say that the arbitrary order must be consistent across multiple invocations? Quoting from [https://docs.python.org/2/using/cmdline.html#cmdoption-R](https://docs.python.org/2/using/cmdline.html#cmdoption-R) :

> Changing hash values affects the order in which keys are retrieved from a > dict. Although Python has never made guarantees about this ordering (and it > typically varies between 32-bit and 64-bit builds), enough real-world code > implicitly relies on this non-guaranteed behavior that the randomization is > disabled by default.

I totally understand your point. I remember the debates about how this would break code. But it's there to mitigate algorithmic complexity attacks against an every increasing attack surface. This was the best solution they come up with, along with a migration path to the new default.

</comment></comment></comment></comment></comment></comment></comment><comment><USER55> > It's the kind that easily sneaks its way past the most vigilant unit tests

If your unit tests are the most vigilant, you'll test the output of that function for just such a comparison.

</comment><comment><USER56> Nothing about unicode handling?

<comment><USER57> Unicode works just fine in 2.x for people that give a shit :)

<comment><USER58> It's a lot easier to work with in 3.0, though.

For example, xmlrpclib in 2.x will return either _str_ or _unicode_ depending on whether the particular piece of data it's returning happens to contain non- ASCII characters. In 3.x it always returns a unicode string.

<comment><USER32> The problem is that in Python 3 some cases aren't easier, they've become impossible to do properly. Dealing with paths is a good example where Python 3 has created a huge mess. IO specifically stdin/-out/-err is another area in which Python 3 has created massive problems.

<comment><USER58> I believe they fixed that in 3.1, so it's no longer impossible: [https://www.python.org/dev/peps/pep-0383/](https://www.python.org/dev/peps/pep-0383/)

Regarding the huge mess, that exists with or without Python 3 if filenames use unknown, incorrect or inconsistent encodings. To treat a path as as text, e.g. to show it to a human or send to another system, you have to know its encoding. Python 3 and GTK (with its G_FILENAME_ENCODING and G_BROKEN_FILENAMES) make this clear - some other software (like Python 2) just silently uses and propagates the broken data.

</comment></comment></comment></comment></comment><comment><USER59> Question is: could they have fixed these problems without breaking everything else?

<comment><USER60> TL/DR: No. Many, _many_ of the changes are backward incompatible with the existing Python 2 syntax and APIs.

Any changes that _could_ be made in some compatible way have largely been backported to the Python 2.x versions (the latest stable version of which is Python 2.7.10) that have been released more-or-less in parallel with the 3.x line (search for 'backport'): [https://hg.python.org/cpython/raw- file/15c95b7d81dc/Misc/NEW...](https://hg.python.org/cpython/raw- file/15c95b7d81dc/Misc/NEWS)

Enough such has been done that you _can_ write Python code that runs in recent versions of _both_ Python 2 and Python 3 (which is very important for 3rd- party library maintainers that want/need to support both it in a single codebase), but to do that you will be forgoing most of the productivity and 'niceness' benefits of the sort that are described in the OP.

</comment></comment><comment><USER36> Is it "people use Python 2"?

</comment><comment><USER61> Slightly tangential, but I wish this blog would date its posts.

Reading "If you're starting a brand-new application today, there are plenty of valid reasons to write it in 2 instead of 3. There will be for a long time." on the same day it was written is not the same as 6 months or a few years down the lines.

I don't actually know when this was written except for the copyright: 2014-2015, so it can't be more than a bit short of 2 years ago.

<comment><USER62> I remember seeing a retweet in my stream a couple months ago where somebody made the suggestion of not dating blog posts so as to make them seem less ephemeral. I think the logic went that if the writing isn't tied to a single moment in time, then it'll become timeless.

It's one of the more irrational and idiotic suggestions I've ever come across. One of, if not _the_ most important piece of metadata for anything that has or will ever exist is its creation date. In particular for writing, putting it in a historical context usually makes the piece more powerful and increases your understanding of the subject. If it's bad writing then it's not going to have a chance anyway. Sorry to say but that may be true of the post in question. I was under the impression that due to poor Python 3 adoption, Python 2.7 would continue to be supported.

I second OP, please date your blog posts.

</comment></comment><comment><USER63> Your title is a little misleading, since you actually discuss three differences.

<comment><USER64> I think the OP means the single main difference is "Python 3 makes it easier to develop high quality software." and gives three examples of this.

<comment><USER65> Which still doesn't make much sense. One thesis, "better software", three supporting arguments.

It's ok to be pedantic, but only if you're correct about the thing you're being pedantic about.

</comment></comment></comment><comment><USER5> Py3 is a completely different language that happens to share the same name as Py2. If you want to talk about typed comparisons you might as well mention C++ and Java and Go and Rust, because you might just as easily move from Py2 to any of them, as from Py2 to Py3.

<comment><USER8> Not true. Not only can most of the code be used verbatim, but the libraries and APIs are still the same - which would constitute most of the porting effort to another language.

A Python 2 dev can learn Python 3 in a day.</comment></comment>


Why does Apple continue killing bitcoin apps? - <AUTHOR> http://blog.sfgate.com/techchron/2014/02/06/apple-bitcoin/ <comment><USER2> _Blockchain.info_ 's app undeniably broke the rules and intentionally manipulated the reviewers to get it on the store in the first place. They presented it to the reviewers with only monitoring features, and changed the server it was talking to in order to enable sending features. Anything Bitcoin aside, they needed to be removed just for this one fact.

This is how the app appeared to the reviewers — [http://i.imgur.com/pMYRCPL.png](http://i.imgur.com/pMYRCPL.png)

This is how it looked post review — [http://i.imgur.com/EsoY4sU.png](http://i.imgur.com/EsoY4sU.png)

The CoinJar app is still around anyway, so it's not exactly a "crackdown".

[https://itunes.apple.com/au/app/coinjar-for- iphone/id7252098...](https://itunes.apple.com/au/app/coinjar-for- iphone/id725209873?mt=8)

<comment><USER3> I agree with you - they fully deserve what happened to them.

However, I have to say that I think their little trick is quite cool. I wonder how many apps on the apps store do a similar thing but went unnoticed by the powers that be because of a lack of popularity.

<comment><USER4> I'll also agree it was bad for them to be deceptive. But it goes to show how stupid the app review process is. If you can alter your app enough that it wouldn't have passed review, by merely changing an external server that doesn't fall under App Store code signing policies, what is the point of the review? Did they even represent that the server would never change? Is that part of the agreement?

I'm open to being corrected on this, as I know very little. It's just a bit ironic that Hacker News so gleefully condemns someone for, well, hacking the app review process (and not in the "cracker" sense.)

<comment><USER2> It's basically just a web view, they can't do much about it. I have an issue with it because they're making out that they did nothing wrong, where as really they knew they were breaking the rules this whole time.

<comment><USER4> Why should changing the site a webview points at, be breaking any rules? The whole point of a web page is that it can change and is outside the client. (See below; if there is a rule, I'd be curious to know what it is.) Maybe if Apple didn't want that to change, they shouldn't allow web views.

I'd guess the app was basically a Blockchain.info-only browser with some glue to scan QR codes and other system-integration stuff. If anything, people are even more justified in being pissed with Apple for what amounts to, "OMG, you changed a webpage that our customers use on their devices, without our consent! BAN!"

Again, I acknowledge I don't have all the facts, and that BCI did this with intent to deceive. But it doesn't seem to be actually against any rules; or if it is, they're draconian or nonsensical rules that people are right to be angry with Apple about. One can still be angry with Apple that deception was the only way to get an app a lot of people want, that has no legal reason it can't be in the App Store.

Many Bitcoiners are mad at Apple; a few here think BCI is at fault. I see blame on both sides, but am more upset with Apple. (I do understand Apple can legally do whatever they want with their own store.)

I would be interested to know if there is actually a rule about changes to a backend server after review, and how it is worded. Or any rule that describes exactly what Blockchain.info did wrong. I think such a rule would be written here[0], but I can't read it without an Apple Developer ID.

[0] [https://developer.apple.com/appstore/guidelines.html](https://developer.apple.com/appstore/guidelines.html)

</comment></comment></comment></comment></comment><comment><USER5> Because it's unregulated and any problems then lands at Apple's door to adjudicate so they don't want these headaches because to do so requires setting up channels and systems and policies for the local, state, federal, and international areas of contention but the lack of profit incentives makes this a simple decision.

Do I get a MBA now?

<comment><USER6> Alternatively: Apple is poised to take on mobile payments (with over half a billion accounts with credit cards on file) and doesn't want anything to disrupt their plans.

Anyway, why is it Apple's responsibility to ensure every app developer and user complies with the law?

<comment><USER7> It's not. However, all those customers that will get screwed will knock on Apple's door, even if they have been warned with huge blinking-red letters that it is not Apple's responsibility to provide insurance for bitcoin transactions. Apple doesn't need the headache for what will probably be 0.00001% of their revenue.

<comment><USER8> Just like everyone who gets shafted by a Windows app goes and complains to Microsoft?

<comment><USER9> Yes, all six of the people who use the Windows Store.

</comment></comment></comment></comment></comment><comment><USER10> Like it or not, Bitcoin, like Tor, and this will continue to increase over time, is associated closely by the public with drugs, money laundering, gun running and so forth. The US government may take a more aggressive stance against it like the Chinese. There's not much in it for Apple to not distance itself from the liabilities Bitcoin presents.

<comment><USER11> Parsing error: line 1, sentence 1.

<comment><USER12> I parsed it as follows:

Like it or not, Bitcoin - like Tor - (and this will continue to increase over time) is associated closely by the public with drugs, money laundering, gun running and so forth.

<comment><USER13> So four (to be charitable, two) syntactically incorrect tokens will cause a parsing error? Good to know!

</comment></comment></comment></comment><comment><USER14> Image. They want to be seen as safe and mainstream. They build devices to suit a soccer mom's sensibilities.

<comment><USER15> I don't see how having a Bitcoin wallet app makes them unsafe. There are plenty of non-mainstream apps in the store as well.

<comment><USER16> A lot of mainstream media reports paint Bitcoin as essentially a currency for buying drugs.

<comment><USER17> So what? Anyone with a brain knows the media does this thing called "sensationalism" and does not accurately reflect reality.

</comment></comment></comment></comment><comment><USER18> I guess one reason is that Apple doesn't want iPhones targeted by hackers, or they know that the platform isn't secure enough, so they don't want to take the responsibility. After all, someone could store million dollars on their iPhone. You can say that that's user's mistake if they get hacked, but this could open variety of liability issues for Apple. So they want to protect users and themselves.

Edit: The thing with Bitcoin is that it's impossible to know who steals your money. It could be Apple, NSA, russian hacker or your mom. Apple doesn't want to deal with that kind of uncertainty.

<comment><USER19> That makes absolutely no sense.

<comment><USER20> It makes some sense. If there are bitcoin wallet apps, there will be attacks that try to steal the bitcoins in the wallet. It increases the incentive to find ways to do this.

<comment><USER19> There _were_ bitcoin apps on iOS. For two years. There were no attacks.

<comment><USER18> Remote wallets only. This means(?) that they don't want to store bitcoin keys.

</comment></comment></comment></comment></comment><comment><USER21> Unfortunately for Blockchain, Apple taken over all legal responsibility, under all applicable laws, in all jurisdictions, on matters criminal and civil, including allegations of patent infringement, and fully identified all developers for their platform.

So you can understand why they'd be conservative about this sort of thing.</sarcasm>

Really as a matter of public policy we shouldn't allow them to have it both ways. If Apple wants to behave as some kind of common carrier and have no liability for the applications they chose to include or exclude they should be held to some kind of reasonable standard of fairness.

</comment><comment><USER22> If anyone develops apps on closed platforms (iOS, Windows, OSX, etc) you will always be at the whim of said company's right to cull their platform.

The solution? Stop sharecropping. Build on platforms that are open.

<comment><USER23> The problem is not building a plattform, the problem is marketing one ($$$). You can't make money on a plattform without users willing to pay.

<comment><USER22> You mean like virtually every subscription web app out there? (eg: Basecamp, etc)

</comment></comment></comment><comment><USER19> I'm going to go with "because they're a terrible, monopolistic company that doesn't really care at all about their users." This wasn't always the case.

<comment><USER24> I'm going to go with they've got nothing to gain, and if they do bring bitcoin to the iOS they will do it there way.

<comment><USER19> My point.

<comment><USER25> No, it wasn't. That's not what you said.

<comment><USER26> Try reading what was said without the apple dicks in your ears.

</comment></comment></comment></comment></comment><comment><USER27> Google has been cracking down on PayPal use in apps lately. Any crackdown on potential in app payment currencies not tied to the market's primary payment processor doesn't surprise me. Apple and Google are both businesses after all, and they decide what goes on in their stores.

</comment><comment><USER28> Apple has always been hostile to hackers trying to develop for their platform [1] [2]. The iPhone app store has always involved a crapshoot about whether your app will get accepted or stay accepted.

I stay far, far away from the Apple ecosystem because it seems like starting out with underpowered hardware, jacking up the price and crippling it with a ton of lockdowns would be shooting yourself in the foot in a competitive market -- and it would be, for any company that doesn't have Apple's marketing genius.

I personally don't care about marketing at all, so it doesn't work on me.

[1] IMHO, if you're working on any commercial project -- hardware, software, website, whatever -- you want to encourage user-generated innovation as much as possible. Convincing people to build on your product means there are people working to make your product better without you paying them. So it's in your interest to make life as easy as possible for innovators. Maybe this doesn't justify a huge engineering expenditure on features targeted to developers, but it certainly means you shouldn't go out of your way to make life difficult for developers, like Apple's app store approval with its bizarre restrictions and opaque decision process does.

[2] That people put up with Apple's crap and develop for their platform anyway is a testament to the hacker spirit. Or maybe to the number of gullible people in this world willing to pay top dollar for Apple phones that create a market. Or perhaps because the first iPhone was in the right place at the right time, disrupted a market that was ripe for disruption, and then network effects make its dominance stable (especially over the short-to-medium term).

</comment><comment><USER29> Imagine if you couldnt install apps on your macbook, I get really angry at Apple for their appstore bull, at least on android and msft phone you can side load apps.

<comment><USER30> You can install home screen apps freely.

<comment><USER29> When did a bookmark become an app.

</comment></comment></comment><comment><USER31> Because they want to be able to take their 30% slice. Not so mysterious.

<comment><USER32> Someone brought up in another thread that you can still use banking applications. When you transfer money on something like BoA or even Venmo, Apple doesn't get a cut.

<comment><USER33> That's true. Do you think it means that the in-app purchase rule doesn't exist, or are you just very intrigued that banking is treated differently from other transactions?

<comment><USER34> The in-app purchase rule applies to purchased content that is delivered _in the app_.

</comment></comment></comment></comment><comment><USER35> [1] Blockchain CEO Nicholas Cary:"Bitcoin's use for international payments from family members sending money home to support entire communities in the developing world and for charity fundraising and fund distribution will be severely affected by this decision"

... I don't think an immigrant worker using a $600+ smart phone to send home money via Bitcoin is a very common use case. Pushing such a message makes Cary and Blockchain come off as deceptive or naive or both.

[1] [http://www.equities.com/editors-desk/currencies-forex/why- ap...](http://www.equities.com/editors-desk/currencies-forex/why-apple- ditched-blockchain-not-worth-the-trouble)

</comment><comment><USER36> I've developed a basic ticker app to quickly see the value of 1BTC in various currencies. Underneath is a graph that updates in realtime to show you the historical value.

Apple have denied my app on the grounds that it's too simple. The whole point is it's simple. My counting app is simple, this is much more complicated that managing 1 number, but they won't allow it.

Interesting...

</comment><comment><USER37> That graph which is supposed to be showing the "volatility" of bitcoin has a base in the hundreds and a tip around the hundreds, I think it would've been a bit more honest to start with zero in this case, given that volatility only matters for its relative impact on your holdings.

</comment><comment> SG- Can these app makers put their source up so we can build and install it on our own phones? it seems like a bitcoin wallet app should likely be open source anyways to make sure it's secured.

</comment><comment><USER38> Bitcoin apps hold private keys that can result in financial loss for the owner. What happens if a bug in Apple code results in phone compromise and millions of users losing their Bitcoins?

</comment><comment><USER17> I hope I don't have to worry about Apple remotely deleting my wallet app. I swear, the control freak approach of Apple pisses me off more than anything.

</comment><comment><USER39> Why does Apple continue killing apps which violate terms of service or defraud the app review process? Dunno...

</comment><comment><USER40> Apple is keeping the entire space pure for Dogecoin apps.</comment>


Bell's Theorem: The Quantum Venn Diagram Paradox [video] - <AUTHOR> https://www.youtube.com/watch?v=zcqZHYo7ONs <comment><USER2> Amazing educational video, and really well executed.</comment>


The Terrifying Truth About Working in Tech - <AUTHOR> https://medium.com/conquering-corporate-america/the-real-horrors-of-working-at-a-large-tech-company-c9a29d61be2 <comment><USER2> Gosh I can only imagine how hard this is. I work in a basement and can't even hear the tornado siren when they test it each month. It can be raining, snowing, hot as hell and I would have no idea.

Thank God I work with really good people that are fun to be around.</comment>


How Hackers and Scammers Break into iCloud-Locked iPhones - <AUTHOR> https://www.vice.com/en_us/article/8xyq8v/how-to-unlock-icloud-stolen-iphone <comment><USER2> It seems that most of these problems would be solved by a time delay, like on safes at gas stations. You can disable the "Find my iPhone" service, and it will show as disabled, but it will actually stop working 48h or 72h later, so that there is a time window in which to catch criminals.

As always, the important thing here is for criminals to know this: even if they force you to unlock the phone, they are not off the hook.

<comment><USER3> Wouldn't they just turn off the device for 72h?

<comment><USER4> The 72h window should notify the owner and allow them to go in and flag the device as stolen. Once the device is stolen, it should essentially brick itself as soon as it connects to a network and reaches Apple's servers. The device could only be unbricked by bringing it to an Apple store and showing ID to prove ownership.

<comment><USER5> In the paranoid scenario this turns the mugging into a hostage situation (unlikely, since that requires a much more complicated logistics)...

Maybe Apple can also provide a duress password.

</comment></comment></comment></comment><comment><USER6> Interestingly enough I was in Vietnam last week and had my iPhone XR snatched out of my hands by a guy on a motorbike. I locked it immediately from my partner's phone and noted that it had been immediately switched off. I figured it was surely gone forever and pretty much straight away went and bought a new iPhone.

When I was setting up my new phone I restored my latest backup from iCloud and upon doing so, my old stolen phone was no longer trackable since iCloud recognises the new one _as being the old one_.

Although I am far from an Apple fanboy, I feel that their phones are the least-bad choice at the moment but I am really starting to question that after this experience. Not very happy about that, Apple. I am interested to know if by doing that the phone is now unlocked, or what the deal is, but I can't, since it's no longer trackable.

<comment><USER7> Don't think this is correct. My list of devices is littered with the old devices I restored backups from onto new devices. I have to do extra steps to wipe and remove a device to be able to be adopted by new homes.

That said, it is a pet peeve of mine that the new phone from old backup workflow doesn't prompt for a new device name or to rename the old device. Reusing the name can be confusing if/when you still have both devices.

<comment><USER8> Yeah, I just checked my account and the phones that I didn't sell or send back to Apple are all still in my account, despite all being on the same backup chain.

I suspect that the user above fell victim to something similar to what was mentioned in the article and had the device removed from their account that way.

</comment></comment></comment><comment><USER9> Brian Krebs wrote two posts on the Phishing part.

[https://krebsonsecurity.com/2017/02/iphone-robbers-try-to- ip...](https://krebsonsecurity.com/2017/02/iphone-robbers-try-to-iphish- victims/)

[https://krebsonsecurity.com/2017/03/if-your-iphone-is- stolen...](https://krebsonsecurity.com/2017/03/if-your-iphone-is-stolen-these- guys-may-try-to-iphish-you/)

Personally, i lost my iPhone 3 yrs ago, since then I have got many phishing emails, which leads to an Apple-like website. I always type something like, "betterlucknexttime" for password, just for fun.

<comment><USER10> I'm always tempted to answer to clear phishing or scam e-mails telling the sender to FO, or folllow the link to the predictably broken website for a laugh, but then I think that it makes more sense to just move the email to the spam folder and move on.

Why give further information to the scammer, even if it's just my IP address?

</comment></comment><comment><USER11> Had my iphone pickpocketed in Indio, CA and was relentlessly texted icloud looking links. I spent the time to report a few of the fake icloud websites to their hosting provider, hetzner. They took them down and that made me feel slightly better. The phone did eventually call home, GPS said it was in china.

<comment><USER12> My wife's got swiped in Rome. Thanks to Find My iPhone we were able to watch it end up in North Africa.

<comment><USER13> My spiteful side sorely wishes for a remote-meltdown feature that shorts the battery or otherwise catastrophically destroys the phone.

</comment></comment></comment><comment><USER14> To make it "new" or virgin they need to replace the CPU an the baseband, I'm not sure how they manage the secure enclave problem as the touch id is tied to the CPU.

<comment><USER15> The article linked to a 34 minute YouTube video which demonstrated one unlock method: they replaced a locked iPhone's CPU, baseband CPU, baseband EPROM, NAND Flash (reprogrammed), and touch ID sensor with ones from a donor iPhone and were able to restore iOS.

<comment><USER16> except its cheaper to just fix donor iphone that already has all the listed components working

<comment><USER17> Labour is cheap in Vietnam...

<comment><USER8> But the parts aren't. It simply does not make sense to go that route.

<comment><USER17> The parts are if you buy water damaged devices.

Water tends to kill the PCB (due to corrosion), but all the individual chips will usually survive.

</comment></comment></comment></comment></comment></comment><comment><USER18> Apple should have an under-duress alternative iCloud password which behaves identically to the real password, but with all the changes totally reversible using the real password, as well as silently alerting the authorities with location tracking etc.

</comment><comment><USER19> So basically; don't get mugged, don't click on weird links. Got it.

<comment><USER20> Oh, I see. I'll just yell "No one can mug me without my consent! It's illegal!"

</comment></comment><comment><USER21> TLDR; The article says many people are being mugged to give away their iPhone at gun point and then scammers somehow reset the device for resell. They describe 3 techniques to do reset the device (1) phis victim (2) fool Apple store manager (3) reprogram CPU. I don't see how any of these would be effective. I would guess mugger would simply ask password and do it himself. The article needs technical review.

<comment><USER22> Well, if it is organizecd crime I could imagine they could use some sort of coercion on the store manager. Or even better yet they could simply bribe a store manager. But if there is a manager with the power to unlock then he is the weak point.

<comment><USER23> Walking into an Apple Store and threatening the manager is a quick way to end up in prison for a long time. The stores are under heavy surveillance. Don't let the lack of guards fool you, they know who is doing what with loads of face tracking.

<comment><USER24> Org crime would never walk into a place and start making threats, they would approach the manager through somebody they both know in the community who makes the bribe offer 'just produce fake receipts, unlock phone and pocket $100 each time'. These stores are all over the world it's probably not impossible to convince the manager of a foreign Apple store in a highly corrupt country making peanuts to reset iCloud logins on stolen US phones that have been shipped over.

<comment><USER22> And if they did not take the bribe then the next step would be coercion and again it would happen outside of the store. But my bet is there are plenty of people out there willing to take the bribe for what ever reason. I think they get about $65,000usd salary on average according to glassdoor. Plenty of room to take offers for a better lifestyle.

</comment></comment></comment></comment></comment><comment><USER25> I have a question, if you remotely wipe your iPhone is it usable at that point, or bricked?

If usable, couldn't a thief just steal your iPhone and wait for you to wipe it?

<comment><USER23> Not really. The next time you try to activate it. The activation servers will recognize it as being attached to an iCloud account and ask for your iCloud password.

This is why resellers want it removed from iCloud and will visually confirm it. You can get halfway through the setup process before realizing it's still locked to another account.

We learned the hard way, once, when returning a company phone.

</comment></comment><comment><USER26> When unlocked can they access the data?

<comment><USER27> What do you mean by access the data?

Activation lock effects the ability for the phone to be set up (e.g. activated).

Actual data on the phone is encrypted to a set of keys, that are themselves protected by the SEP, which checks the passcode, does the timer enforcement, and increments counters, etc.

The moment the device is reset/wiped the keys are gone forever and the data cannot be recovered (even if your took it apart and read the flash directly)

</comment></comment><comment><USER28> Can they bypass MFA?

<comment><USER29> Yes. It's called a knife.

</comment></comment><comment><USER30> tl;dr mostly by beating it out of their victims and relying on people feeling bad about the plight of robbers.

<comment> SG- It sounds like you didn't actually read the article tho.

<comment><USER31> He did, I believe. The question is, if I were a criminal and robbed someone at gunpoint for their iPhone, would it make any sense to _not_ ask the victim about their iCloud password at the same time? I'd still be going down with armed robbery if caught, but if not caught I'd still be ahead either over $150 to pay for a corrupt Apple manager to unlock it or have the bad luck of being recorded on Apple security cameras while spoofing the Genius Bar employee with a fake invoice?

I don't care much about the repair industry, they can sell every part of a phone, both legit or stolen, except the display and the logic board. The display can't be resold anyway as it will have been extensively scratched anyway and the logic board rarely breaks.

<comment><USER25> I legitimately don't know my iCloud password, it's in (and generated by) my password manager, so if my phone asks me for it, I need to go to my PC and open Keepass.

I'm a bit fucked if I get mugged!

<comment><USER32> That's the best solution to the problem if you ask me. I wonder how would a thief react to that response tho.</comment></comment></comment></comment></comment>


CEO of WrkRiot Indicted by the Department of Justice - <AUTHOR> https://www.cnet.com/news/isaac-choi-wrkriot-indicted/?ftag=COS-05-10aaa0b&linkId=38508242 <comment><USER2> For background, here are the HN discussions of what was happening at WrkRiot:

\- Penny Kim's article about getting scammed by WrkRiot:

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

\- TechCrunch article about it:

[https://news.ycombinator.com/item?id=12394679](https://news.ycombinator.com/item?id=12394679)</comment>


Axum, Microsoft's Approach to Parallelism - <AUTHOR> http://www.infoq.com/news/2009/04/Axum <comment><USER2> I think this should've been implemented as a compile-time C# extension, similar to LINQ. The addition of a new language makes things confusing. You write your code in C#, then you have to rewrite some in Axum? Then you have to connect them? Historically, you can't mix two languages in a single assembly, so you have to double the number of your assemblies? And you still can't do circular references between assemblies.

<comment><USER3> That article is in my opinion lacking information. It doesn't do a good job explaining the reasoning behind the new language. When I first heard about Axum I thought the same thing. I think if it easily ported to a library, it would already be in the .NET framework.

The idea behind Axum is one specialist on a team, or one contractor, could implement concurrency. Meanwhile most programmers wouldn't have to think about it. This may not make much sense from a tech standpoint but it does from a business standpoint. This sounds like a sensible solution from my experience working at windows dev shops.

From a slightly more thorough article:

 _In an interview with Dr. Dobbs Journal, Niklas Gustafsson, a software architect and member of Microsoft's Parallel Computing Platform team, said:

"The basic principle of Maestro is to reduce the complexity of a parallel application to the point where most programmers should be able to write a parallel application without even thinking about it as being parallel. In a model based solely on shared memory, such as we have with all object-oriented languages, you have enormous problems with reference aliasing. This means that any two given reference variables of the same type may or may not point at the same object. If they don't, concurrent access is safe, if they do, it's typically not; a lot of programmer productivity is lost trying to rein in this complexity."_[1]

[1] [http://www.eweek.com/c/a/Application- Development/Microsoft-C...](http://www.eweek.com/c/a/Application- Development/Microsoft-Cooking-Up-New-Parallel-Programming-Language- Axum-868670/)

[EDITED: Syntax]</comment></comment>


Redbox's Workaround for Stocking Disney Movies Backfires with Lawsuit - <AUTHOR> https://gizmodo.com/redboxs-crafty-workaround-for-stocking-disney-movies-ba-1820925295 <comment><USER2> Although the digital download portion muddies the water, this seems to fall clearly under the first sale doctrine. As mentioned in the article, the seemingly applicable case of digital downloads getting exempted from first sale was only applies because the downloaded music was already downloaded once and sending it to someone else constituted copying which I assume falls under dmca.

I predict Disney will lose.

Big textbook publishers have been trying to pull this crap for years and were finally trounced in the Supreme Court when it was ruled that once a textbook is sold to someone, you don't get to dictate whether and where it can be resold.

Disney is selling a code for a one time download. Once you purchase it, and you haven't used it yet, you should have the right to do whatever you want with it.

<comment><USER3> There's a good chance Disney will win without having to pay off any politicians.

In a nutshell: first sale doctrine applies to physical goods, i.e., the DVD purchased by Redbox. It doesn't apply to non-tangible goods (specifically, the code that accompanies the DVD) because intangible goods are licensed, not sold. So, Redbox while Redbox can sell the DVDs it purchases without restraint, it has to abide by the terms of the license if it wants to sell the download code.

<comment><USER4> I'm not sure why you think that first sale doctrine doesn't apply to intangible goods. There are some court cases to say it does apply to software, (verner v Autodesk, [https://www.techdirt.com/articles/20080522/0016171201.shtml](https://www.techdirt.com/articles/20080522/0016171201.shtml)).

Companies definitely want to exempt digital goods from first sale, but there's no logical reason to do so. Hopefully this case helps establish precedent.

<comment><USER3> That ruling was overturned because it was simply wrong as a matter of law. Intangible goods are licensed, not sold. Will explain in follow up when I get to a computer. [https://en.m.wikipedia.org/wiki/Vernor_v._Autodesk,_Inc](https://en.m.wikipedia.org/wiki/Vernor_v._Autodesk,_Inc).

Basically, under US and Western law, an intangible good is only "sold" when all of the relevant right to it are sold. If you only sell copies, you are only selling a right to use the copy, which the law calls a license. (The copy doesn't actually exist, by the way, it's just a legal construct, as downloading actually creates a new set of bits.) Since the license is trivially copied, the owner of the good is allowed to control how the license is used.

<comment><USER5> How western is EU?

[https://en.wikipedia.org/wiki/UsedSoft#ECJ_ruling](https://en.wikipedia.org/wiki/UsedSoft#ECJ_ruling)

But its not applicable in this case, same German court rejected resale of used games on account of identifying them as art and not software.

</comment></comment></comment></comment></comment><comment><USER6> This is how Redbox always plays hardball with the studios; don't want to negotiate a fair deal for us to stock your movies? Fine, we'll give our employees credit cards, send them to Best Buy, and have them buy 10 DVDs. Then we'll have a pizza party, unwrap all the shrinkwrap, and then ship them out to all the field workers who stock the kiosks.

How is this any different, except with digital downloads codes instead of physical discs?

FWIW, I worked at Redbox back in the day as the company's social media manager. The process I described is exactly what happened when the studio that owned the Twilight movies refused an agreement that would let Redbox stock "Breaking Dawn (Part 1)" earlier than 54 days. Fun times.

Of course, it was all fun until we discovered that we'd sent out disc 2 (special features) instead of disc 1 (the movie) by mistake to about 80% of the kiosks. The Twitter shitstorm from angry suburban moms was ... not fun.

</comment><comment><USER7> Looking the arguments here I can see things going either way

Way #1 first sale doctrine. You sold me a box + dvd + code. I can sell the box, dvd, and code separately. I can use the box for other things. I can build art from the DVDs. I can sell the code

Way #2 license doctrine. You sold me a license to me specifically. That license is non transferable. The first thing that came to mind for me is plane tickets. Some company's websites even say if the name you register doesn't match your ID you have to buy a new ticket, no exceptions. No idea if that's legal or not, just repeating what the site (Expedia) said when I bought tickets last week. I'm sure there are better examples. Paying for gym membership. You could argue I pay $XX a month for ~720hrs of access. I should be able to re-sell every hour of access.

How do you decide which it is? It seems like First Sale doctrine comes down to selling physical things? IIRC you can't resell iOS apps, Steam apps, etc... I guess the difference is you register for iOS, plane tickets, Steam.

<comment><USER8> Well most of the time the license is about permission to use software.

It doesn't matter if you have the Windows 98 disk, if you don't have a license you're committing copyright infringement to use it. So you could sell the paper code, but the recipient doesn't have the right to use it.

I'm actually unsure of what legal mechanism is used for enforcing software licenses though... is it an implicit contract when buying the DVD for example?

<comment><USER9> _Well most of the time the license is about permission to use software.

It doesn't matter if you have the Windows 98 disk, if you don't have a license you're committing copyright infringement to use it._

I don't think this is entirely decided yet. IIRC GPLv2 did not include a specific license to use the software, since the right to use a legally obtained copy was believed to be implied. Some downloads of drivers and applications don't include any EULA; it would be absurd to think that those downloads are unusable even when the owner of the copyright is the one distributing the software.

As for specific applications that do include an EULA, as I understand it some countries don't recognize any agreement that was not available for reading at the time of purchase.

</comment></comment></comment><comment><USER10> Reselling digital download codes seems like a bizarre risk for such a well known established company to take.

<comment><USER11> Yes, but they both doubled their revenue while undercutting Disney, so the potential payoff was very large. Plus, the stipulation that "codes are not for sale _or transfer_" seems to be a particularly egregious stipulation that may be overly broad, thus arguable.

<comment><USER12> I don't see how Disney can arbitrarily put a word on the box that limits your ability to do something with it.

What is they put "not for use as a coaster" and you resell the disc as a coaster? Can they sue you for that?

<comment><USER13> They can put whatever words they want in the box, probably assuming that few people would have the resources to fight them about it.

<comment><USER12> Looks like they hit the jackpot.

I'll say it another way, just because it's on the box doesn't mean they can legally limit you. So yeah they can put whatever they want but we'll see if it holds up.

</comment></comment></comment></comment></comment><comment><USER14> Disney could avoid this issue by printing the download codes onto the discs.

<comment><USER15> Are you sure? Couldn't Redbox "dissasemble" the disc by transferring the code to paper and physically removing it from the disk? How would that be different than buying an all-in-one computer, taking it apart and selling each component individually?

<comment><USER14> Ah, perhaps. I was thinking they'd have to copy the code, which seems harder to get away with.

</comment></comment></comment><comment><USER16> This seems like it will end as one of those "why we can't have nice things" moments.

I thought it was pretty cool that the kids' new Star Wars disc came with a download code so we didn't have to grab the version we _actually_ watch as a torrent. But after this case, win or lose, really, you know that Disney will stop offering that code.

There is no real upside for them, and people are being dicks about it. So it goes away.

So yeah, cool idea reselling it. But all it does in the end is make the world a little worse for everybody.

<comment><USER17> "why we can't have nice things" assume good faith on part of large corporations. In reality, they push for shit like this the hardest. They pioneer dickishness.

</comment></comment><comment><USER18> This is going to be interesting. They're not selling any copyrighted material; just the _ability_ to download the material.

I don't understand one thing, though: why can't Disney make these codes single-use? Or limit them to a handful of uses? Or use some form of customer authentication (like a CC number, or phone number) to limit the access to these codes?

<comment><USER19> Aren't the codes that came with the DVDs that Netflix is then reselling one- time use? So Netflix doesn't ever use them, just sells them (i.e. the ability to download the material) to someone once. Netflix only has many to sell because they bought so many DVDs. At least that was my understanding, but maybe I'm wrong.

Edit: And by Netflix I mean Redbox, oops.

<comment><USER20> It's not Netflix (the provider of digital movies and TV shows with a subscription). It's Redbox (a company which specializes in renting movies out using automated kiosks on a per-night basis).

<comment><USER21> > Netflix (the provider of digital movies and TV shows with a subscription)

Netflix started 20 years ago by mailing rented movies to people, a business they still engage in with millions of customers. [https://dvd.netflix.com](https://dvd.netflix.com)

<comment><USER22> Sure, but it's still not Netflix in the article.

</comment></comment></comment></comment></comment><comment><USER23> Yeah, you know what? Fuck redbox on this one.

Selling the digital codes separately, while renting the physical item? That sounds like kind of ridiculous behavior, considering you'd imagine them to have a wholesale side-channel for their operation. Do they have unskilled workers acquiring optical disks via retail, over the counter, and then shucking them out of the consumer product package, and sleeving them for rental operations?

But, still, fuck Disney too. It is completely irrational that they insist on operating as this elitist, vertically integrated smoke stack that issues forth a plume of animated gruel intended to placate sheltered infants, piped in by a specially insulated A/V channel for two hours at a time, at like $40 bucks a go.

Both of them suck, but if the game is cricket, the rules are stacked in Disney's favor in this instance.

<comment><USER24> > Do they have unskilled workers acquiring optical disks via retail, over the > counter, and then shucking them out of the consumer product package, and > sleeving them for rental operations?

Yes, that's what the article said they do. That is perfectly legal with the DVDs. You are allowed to resell things you buy, that's the first sale doctrine, and it's why you can sell a used book or DVD without paying a licensing fee. But it's unclear if it applies to the download code.

This is literally what the article was about.</comment></comment>


Almost a Year After Stallman Was 'Cancelled', FSF Has Elected a New President - <AUTHOR> https://itsfoss.com/fsf-new-president/ <comment><USER2> > 150 eminent liberals including JK Rowling

Who is still calling Rowling a liberal, let alone an eminent one?

<comment><AUTHOR> Any links for outsiders?

<comment><USER3> [https://www.vanityfair.com/style/2020/09/jk-rowling- transpho...](https://www.vanityfair.com/style/2020/09/jk-rowling-transphobia- new-novel-troubled-blood-controversy?utm_brand=vanity-fair&utm_social- type=earned)

<comment><USER4> Does a single illiberal position disqualify one from being liberal, despite their other opinions? [https://en.wikipedia.org/wiki/Politics_of_J._K._Rowling](https://en.wikipedia.org/wiki/Politics_of_J._K._Rowling) says she leans left overall.</comment></comment></comment></comment>


Your flight purchase's confirmed ($800), would you like to upgrade for $10,000? - <AUTHOR> https://www.evernote.com/shard/s31/sh/32ac96bb-d76a-4339-a27c-7f3eb900a659/04db0da543e030d81223aee0a9d59bd1/deep/0/f89k_83_.png

<comment><USER2> It is so easy to loose $10,000. Highly misleading. Also the number is in green makes it less highlighted. Upgrade button highlighted. No Congrats text on top, so someone in hurry may click it considering a step left in order process.</comment>


LinkedIn is moving to Azure - <AUTHOR> https://engineering.linkedin.com/blog/2019/building-next-infra <comment><USER2> At first I thought, wow! You don't see a company that big up and change cloud providers very often!

Then I remembered Microsoft bought them (3 years ago now).

<comment><USER3> Yes...seems to be completely a political decision rather than a technical one..also it reminded me of gitlab's decision to move out of Azure...

<comment><USER4> Vertical integration more than political. Like Samsung phones using Samsung DRAM and storage.

</comment></comment></comment><comment><USER5> As an Azure customer, I have hopes that having a bigger fish in the pond would help improve reliability and availability, but those would likely happen for services that are already reliable.

</comment><comment><USER6> What do they currently use?

<comment><USER7> Their own data centers.</comment></comment>


Let Me Pirate that For You - <AUTHOR> http://lmptfy.com

<comment><AUTHOR> <http://lmptfy.com/?q=hackers>

</comment><comment><USER2> What does it do? Or, if it just "is what it is" then what was the impetus for creating it?

<comment><USER3> It's The Pirate Bay's version of <http://lmgtfy.com/>

<comment><AUTHOR> You are right.

</comment></comment></comment><comment><AUTHOR> thanks :) Add your search query and share it with your friends when they ask about content.

ie <http://lmptfy.com/?q=metallica>

</comment><comment><USER4> Love the Bitcoin doubloons ;D

<comment><AUTHOR> so do we - can you tell ? Bitcoin is another awesome project worthy of support.

<comment><USER5> I'm glad to see more projects starting to accept Bitcoin. :)

</comment></comment></comment><comment><USER6> This is great... I can actually use this more than the google alternative!

</comment><comment><USER7> Great I think you broke TPB's search!</comment>


Zenefits Program Let Insurance Brokers Fake a Mandatory Training Course - <AUTHOR> http://www.buzzfeed.com/williamalden/zenefits-program-let-insurance-brokers-fake-training <comment><USER2> BuzzFeed reporters are saying on Twitter they this incident is the root cause for the weird firing. (And implied by Sacks' letter)

> _That was how executives discovered the Macro program, which Conrad had > created based on a belief that 52 hours was too long to spend in training, > the lawyer for Sacks said._

That's literally a joke you'd see on Silicon Valley.

</comment><comment><USER3> I find it hilarious that buzzfeed is actually a leader in investigative reporting now.

I don't mean this sarcastically either, their investigative pieces are top notch, but they can be biased or emotional sometimes.</comment>


Announcing the UBiome $100k Microbiome Grant Contest - <AUTHOR> http://www.ubiomeblog.com/announcing-the-ubiome-100k-microbiome-grant-contest/

<comment><USER2> "...is offering talented researchers with big ideas a grant of up to $100,000 of microbiome sampling kits"

This is not a $100k grant, this is a grant of $100k worth of microbiome kits.</comment>


A mild case of borderitis - <AUTHOR> http://www.usabilitypost.com/2010/07/23/a-mild-case-of-borderitis/ <comment><USER2> I was puzzled why Gandi.net does not look anything like this now. Just realised the article is over 2.5 years old. Though, I suppose no less useful a tip.

</comment><comment><USER3> Really good post.

I see what the guy wanted to do originally, drawing more attention of a particular box, but the result is only kinda cluttered and make people look AWAY from it.

I wonder, why usability is so hard to get, I have the impression that most people like to design looking at the final result, instead of first drawing black and white mockups with a clear layout, resulting into form stumping funcionality.

<comment><USER4> I think it's often the opposite, the product of over-designing something. The designer comes up with a design, but he feels it's not good enough, so he keeps iterating and adding more, eventually ending up with something more complex than it needed to be. I think most of us folks here building stuff can relate to this. What's hard is for the designer to settle, to think "alright, this will not wow people and is not mind blowing, but it will do the job well".

<comment><USER5> I think this is exactly it. Speaking as a designer, its hard to just let go and keep things simple because we always want to tinker. I come from a print and graphic design background where form vastly outweighs function, so learning simple web design was something I had to work at and learn in order to get a nice balance of function and form.

</comment></comment></comment><comment><USER5> Too many people abusing borders. Great little article. Also, I see a lot of box-shadow abuse too. Use a box-shadow to create a sense of depth around your main content wrapper, but no more than that!

</comment><comment><USER6> Yes, I totally agree with this post.

You should not design your website to have so many borders because a container inside a container inside another container just looks really odd. Although it may look good at first, from a fresh eye's perspective, it is very clunky.

Good job on updating your website to split the post into two columns!

</comment><comment><USER7> I call this "container hell."</comment>


Blog Debunks 13-Year-Old Scientist's Solar Power Breakthrough - <AUTHOR> http://www.theatlanticwire.com/technology/2011/08/blog-debunks-13-year-old-scientists-solar-power-breakthrough/41520/#.Tk_v5AAtGZw.reddit <comment><USER2> Holy crap man, is there any need to post up yet another article based upon an article originally posted here on HN?

Come on, no need to literally drill it deep down inside the kids self esteem.

It's not even 2 pages back on HN either. I've said it before, these duped threads are getting pretty lame. How many posts does it take to convey the message already been read,, and heck, still being read. This one is even worse of an article because it's about a blog debunking the ordeal. A blog that was covered on HN like said twice in this comment of mine.</comment>


3D-printed skull simulates sensations of brain surgery - <AUTHOR> http://www.newscientist.com/article/dn24741-3dprinted-skull-simulates-sensations-of-brain-surgery.html#.UqpZa_RdV8E

<comment><USER2> Wow. It is one the best application of 3D printers I have seen.

One nitpick: The name of the professor is incorrectly split in the article. His actual name is Vickneswaran A/L Mathaneswaran. I have learned that A/L stands for "son of" in Malaysia. Westerners get confused because many people of Indian origin have only one name and use their father's name as last name.

<comment><AUTHOR> I think its quite cool as well. Great application of the technology, where the custom capabilities of 3D printing make it a true advantage. On demand, custom surgical training tools and implants are the future.</comment></comment>


Obama Owes us an Apology and an Explanation - <AUTHOR> http://danielmiessler.com/blog/obama-owes-us-an-apology-and-an-explanation <comment><USER2> > with the failure to close Gitmo

He tried and was blocked by congress. On the rest of the points, I agree.

<comment><USER3> Gitmo is part of our military - as Commander in Chief, Obama can close Gitmo with a telephone call.

To prove this assertion - President Bush opened up Gitmo based on his role as Commander in Chief and didn't need to involve Congress.

<comment><USER4> That proof attempt fails, because opening and closing are fundamentally different. To close, you have to find something to do with almost 200 occupants, many of home will not be allowed by their home countries to return. This problem does not arise on opening.

</comment></comment></comment><comment><USER5> Would having him say "I truly believe that without these expanded powers we would not be sufficiently safe." make this all okay?

<comment><USER6> It would be a start.

I mean, _he_ should be saying _something_ , not having a deputy press secretary make a statement: [http://www.whitehousedossier.com/2013/06/07/obama-silent- sur...](http://www.whitehousedossier.com/2013/06/07/obama-silent-surveillance- controversy&#x2F);

Granted, that ended with: " _My final point here: The president welcomes a discussion of the tradeoffs between security and civil liberties._ "</comment></comment>