Supercomputers: Obama orders world's fastest computer - m-i-l http://www.bbc.co.uk/news/technology-33718311 <comment><AUTHOR> 10 years ago the fastest supercomputer was BlueGene/L which was rated at 136.8 TFlop/s. The current fastest supercomputer is rated at 33,862.7 TFlop/s, or 247 times faster.

It seems to me that the aim of taking 10 years to build a supercomputer that is only 20 times faster than the current one might fall a little short if it's aiming to take the top spot.

<comment><USER2> This isn't only about the FLOPS, the big trend of these countries* ordering new supercomputers by 2020/2025 is very focused on power. Current supercomputers consume a lot.

Also the FLOPS measurement is a bit broken: It focuses on dense linear algebra problem, for which GPU or other accelerators boost the results easily. If all you plan to do is running simulations that are easily parallelized on GPU it is fine, for other types of programs it is hard to tell which is the _fastest_ supercomputer.

* France is also ordering a would -be top 10 supercomputer : [http://www.hpcwire.com/off-the-wire/the-cea-agency-and-atos-...](http://www.hpcwire.com/off-the-wire/the-cea-agency-and-atos-team-to-deliver-exaflop-supercomputer-by-2020/)

<comment><USER3> > Also the FLOPS measurement is a bit broken

Does anybody have a better measurement?

Perhaps it could be the size of the matrix that can be inverted on it in an hour of time, with IEEE double precision floats, using some standard algorithm.

<comment><USER4> The "High Performance Conjugate Gradients" benchmark was proposed a couple years ago as an alternative metric for ranking supercomputers. Its proponents claim its behavior is more similar to real applications (irregular access patterns, lower ratio of computation to memory access, etc), compared to linear algebra problems like the "High Performance Linpack" benchmark currently used by the Top500.

The different performance numbers for top systems on HPCG vs HPL are pretty striking: [http://www.hpcg- benchmark.org/custom/index.html?lid=155&slid...](http://www.hpcg- benchmark.org/custom/index.html?lid=155&slid=279)

Original proposal to use HPCG as an alternative to HPL for supercomputer rankings: [http://www.sandia.gov/~maherou/docs/HPCG- Benchmark.pdf](http://www.sandia.gov/~maherou/docs/HPCG-Benchmark.pdf)

<comment><USER5> HPCG basically measures STREAM and has many technical flaws making it scale- dependent and difficulty to adjudicate. As codeveloper of a different benchmark, I'll just cite this paper from a third party. [https://hpgmg.org/static/MarjanovicGraciaGlass- PerformanceMo...](https://hpgmg.org/static/MarjanovicGraciaGlass- PerformanceModelHPCG-2014.pdf)

The reality is that there are many dimensions to supercomputing performance and it's impossible for one number to capture the utility of the machine. Our HPGMG benchmark ([https://hpgmg.org](https://hpgmg.org)) attempts to strike a balance and give useful supplementary information. I do think it's better than any other single benchmark for evaluating today's machines and will also prove to be more durable over time.

<comment><USER6> How would you use a benchmark like this to predict the performance of a well- designed asynchronous parallel conjugate gradient solver, like most modern deep learning neural networks that run on Internet HPC machines?

<comment><USER5> CG isn't truly asynchronous due to its reductions. It can be pipelined in various ways (we have several implementations in PETSc), but performance requires a quality implementation of asynchronous reduction (e.g., MPI_Iallreduce) which the vendors have been slow about developing (I've been working with some on fixing this and Cray has made recent progress).

With respect to deep learning and other applications using CG or related algorithms, the bottlenecks depend on the scale, and ability to expose locality, and operator/preconditioner representation. If there is no locality, then matrix-vector products require all-to-all communication which tend to dwarf the cost of the reductions in CG. Even with locality in the matrix- vector product, preconditioners often need to communicate globally in a scalable way similar to HPGMG. Operators need not be represented as a table of numbers or a sparse matrix format, but could use a tensor product, fast transform, or other information to compute the action using less storage. If they are represented explicitly (sparse or dense), then matrix-vector product performance (thus CG as a whole) is dominated by memory bandwidth for problem sizes that do not fit in cache. HPGMG tries to strike a balance between memory bandwidth demands and compute using a matrix-free representation. HPGMG also reports dynamic range expressed as Performance versus Time-to-solution as the problem size is varied, which allows applications to see performance barriers that might be relevant to them (e.g., see how Titan cannot do a solve in less than 200 ms while Edison can do 50 ms, and how that relates to climate simulation performance targets; see slide 7 of [https://jedbrown.org/files/20150624-Versatility.pdf](https://jedbrown.org/files/20150624-Versatility.pdf)).

<comment><USER7> Is it possible to calculate the theoretical performance of a cluster under HPGMG and then do a practical run and come with an efficiency number like in HPL ?

One of the biggest reasons for use of HPL is that many sizing considerations can be based off of the theoretical calculations.

But anyway this is very interesting. I definitely need to check this out.

<comment><USER5> HPL has an abundance of flops at all scales (N^{1.5} flops on N data), so one can expect a decent fraction of peak flop/s on any architecture with enough memory and adequate cache performance. This is a problem because architectural tricks like doubling the vector registers without commensurate improvements in bandwidth, cache sizes, load/store/gather/scatter produce huge (nearly 2x) benefit for HPL and little or no benefit to a large fraction of real applications.

HPGMG is representative of most structure-exploiting algorithms in that it does not have this abundance of flops, thus theoretical performance is actively constrained by both memory bandwidth and flop/s. We see many active constraints in practice; e.g., improving any of peak flop/s, memory bandwidth, network latency, or network bandwidth produces a tangible improvement in HPGMG performance. Depending on the fidelity of the performance model, these dimensions can be a fairly accurate predictor of performance, but ILP, compiler quality, on-node synchronization latency, cache sizes, and similar factors also matter (more for HPGMG-FE than HPGMG-FV).

I think it is actually quite undesirable for benchmark performance to be trivially computed from one parameter in machine provisioning. No computing center has a mission statement asking for a place on a benchmark ranking list (like Top500). Instead, they have a scientific or engineering mandate. Press releases tend to overemphasize the ranking and I think it is harmful to the science any time the benchmark takes precedence over the expected scientific workload. HPGMG is intended to be representative in the sense that if you build an "HPGMG Machine", you'll get a balanced, versatile machine that scientists and engineers in most disciplines will be happy with. I'd still rather the centers focus on their workload instead of HPGMG.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> A bit more informative is the actual fact sheet put out by the white house [1]. What they are really aiming for is exa _scale_ computing, which they define as being capable of applying exaFlops to exabytes. From my limited knowledge, the latter will actually be the bigger deal. As pointed out elsewhere, an exaflop supercomputer will probably come around beforehand.

[1] [https://www.whitehouse.gov/sites/default/files/microsites/os...](https://www.whitehouse.gov/sites/default/files/microsites/ostp/nsci_fact_sheet.pdf)

<comment><USER9> The real problem is getting 1 exaflop (or around it) within a reasonable power budget. The DOE's power budget for all of their supercomputing resources is 20 Megawatts, so at a full system level we would need to be at 50 GFLOPs per watt, while the best system right now is at 5.

<comment><USER10> Nvidia's Pascale GPU, due next year, is supposed to do 28 terraflops with 1300 watts which I make 21 GFLOPs per watt.

<comment><USER9> That's single precision, which the DOE doesn't care about. The latest NVIDIA GPU's do 8 to 16 times better at single precision (32 bit) floating point compared to double precision (64 bit).

The best next generation DP GFLOPs/watt from one of the big players will most likely be the 2016 Xeon Phi, at ~10-12GFLOPs/watt... You are also forgetting that GPUs also have a ~100W+ CPU sitting next to it, which brings down total efficiency significantly.

Shameless self promotion: My startup ([http://rexcomputing.com](http://rexcomputing.com)) is aiming for 64 double precision GFLOPs/watt, and 128 GFLOPs/watts single precision for its first chip next year.

<comment><USER10> Your chip looks cool. I guess it may be tricky to adapt software to run on the thing? Or else you could try to sell Obama 4 million of them for his new computer.

</comment></comment></comment></comment></comment><comment><USER6> It looks like they are explicitly saying they want to make a machine that works for both types of HPC -- classic low-latency high-bandwidth internode communication (physics simulations) and modern Internet-driver high-bandwidth storage/node communications.

This is because the supercomputer community has long ignored the Internet- style of computation (MapReduce etc). But most of the new generation of scientists are adapting their codes to this new style, because dollar-for- dollar they can get more throughput than the classic style machines. Classic machines invest heavily in low-latency communication and typically require APIs like MPI to achieve it, while Internet HPC just uses well-designed TCP- based socket communications.

Building dual-design systems like this- especially when the community has little or no skill at building NG Internet HPC systems- is likely to produce a system that is good at few things.

Instead, build two systems. One is the largest (but not necessarily exaflop) you can afford and is a classic supercom[puter. Then, for the second, hire some datacenter designers from Google/Facebook and have them build a modern HPC cloud design.

The biologists will flock to the second one; they have long been underserved by the DOE supercomputing community.

<comment><USER11> > especially when the community has little or no skill at building NG Internet > HPC systems

I would argue that the community of people who actually have the skills to take advantage of the interconnects in a classic HPC system is vanishingly small, and in consequence we've overbuilt them on an epic scale.

Allow me to vent. I had the good fortune to have a login on a "petascale" HPC system, and access to an allocation of hours.

The /scratch filesystem would fail weekly, which killed everybody's jobs. If you had a big run going when /scratch failed, you lost everything. Scratch failed so much because the models that were being used often did wildly inappropriate amounts of file IO --- debugging print statements, detailed intermediate calculations, excessively verbose output --- that worked all right in development but when run in parallel brought the filesystem to its knees.

Furthermore, the login nodes were almost unusably slow because of all the Python and Perl post-processing scripts running on them. This isn't even a matter of users being cheap with their hours --- post-processing would have been a tiny fraction of their allocations. Instead, it's that many of them gave no thought at all to how the post-processing might be structured and run through the batch scheduler, and saw no downside to abusing the login nodes for that purpose.

In conclusion, I can attest to at least one HPC system that was badly mismatched to its users' needs and level of sophistication, despite allocations of hours being awarded only to a small number of researchers from across the country through a highly competitive process. Building these things serves national and institutional pride far more than any utilitarian interest.

<comment><USER6> You're describing an exceptionally poorly built and used system. That said, it's not inconsistent with what I've seen as well.

My claim is that the design of classic interconnects is a big waste of money, because only a few codes need it, yet the cost dominates (>50%) of the cluster. I've learned, from years of studying Google's papers, that there are better ways to build code that communicates, and those mechanisms are much easier to teach to scientists and computer scientists than MPI.

<comment><USER12> That's true for many purposes, but is it true for physical simulations? Don't they need communication on every time step?

<comment><USER6> I would say no.

Here is my argument: when I worked for DOE, everybody told me I had to run my MD simulations on a super computer using all the processors, and I would judged on my parallel efficiency. This meant using a code that used MPI to communicate at every (or every N) timesteps. I asked, instead, "Why not just run N independent simulations, and pool the results?" In this case, you run an M-thread simulation on each machine (where M = number of cores on the machine) with no internode communication at all except to read input files and write output files.

The short answer is, that approach works just fine, but the DOE supercomputer people won't let you run embarassingly parallel codes because they already spent money on the interconnect to run tightly coupled codes.

In reponse to this, I went to Google, built Exacycle (loosely coupled HPC) and published this well-cited paper: [http://www.ncbi.nlm.nih.gov/pubmed/24345941](http://www.ncbi.nlm.nih.gov/pubmed/24345941) which in my opinion put the last nail in the coffin of DOE-style physics simulations for molecular dynamics.

That said, there are systems which are so large you can't practically simulate a single instance of the system on a single machine, so you have to partition. Simulating the ribosome is a nice example. However, simulating the ribosome currently provides no valuable scientific data except to tell us that we have major problems with our simulation systems (force field errors, missing QM, electrostatic approximations,e tc).

<comment><USER12> Interesting! Would it be accurate to say that as the amount of computing power and memory per CPU has increased over the years, so also has the percentage of scientific problems where a single simulation instance will fit on a single CPU? Certainly if you can do so, it's more efficient (in both machine and human resources) to partition by one job per CPU.

<comment><USER6> Yes, for example when I did my PhD work ~2001 with a T3E I could run a simulation of a duplex DNA in a box of water by running it in parallel. This was true both for memory and CPU reasons. It limited to me studying a single sequence at a time, or 2-3 which was the practical limit on the number of concurrent jobs. This used the well-balanced design of the T3E, which had a great MPI system.

Eventually it reached the point (~2007) where I could fit the whole simulation on a single 4-core Intel box with similar performance. Then, I ran one "task" per machine, and scaled to the number of available machines. This uses only inter-node communication, which goes over a hub or crossbar on the motherboard. Much faster.

Now, I can fit many copies of DNA on a single machine (one task per core). This is far and away the best, because each processor just accesses its own memory, greatly reducing motherboard traffic, so the problem is basically CPU- bound instead of communication bound (this also now applies to GPUs, such that single GPUs can run one large simulation within its own RAM and not have to spill data back and forth over the CPU/GPU communication path).

This moves the challenge to the IO subsystem- I generate so much simulation data that I need a fat MapReduce cluster to analyze the trajectories.

<comment><USER13> none of this is news - what you're describing is really just strong scaling. and sure, most systems already have subsets of nodes set aside for post- simulation cleanup.

<comment><USER6> Here is the news: the Jupiter paper is now published. [http://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p183....](http://conferences.sigcomm.org/sigcomm/2015/pdf/papers/p183.pdf)

I'm not just describing strong scaling. I'm describing a cost-effective way to achieve it; that's what really matters.

Why have subsets of nodes for post-simulation cleanup? Why not just run that cleanup on the same nodes you used for simulation? Or other general nodes? Otherwise, you've got two sets of nodes which are used at lower utilization than they would normally be.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER14> > The supercomputer would be 20 times quicker than the current leading > machine, which is in China.

So given Moore's Law, by the time it's finished in 2025, it will be 50 times slower than 2025's fastest?

Yes, yes, Moore's Law is slowing, transistors on a chip =/= flops, etc. Still seems like they'd want to aim higher than 20x in 10 years.

<comment><USER15> You're assuming the goal is to build the fastest supercomputer in the world. I think the goal is probably closer to "get the computing resources we need at the lowest cost".

<comment><USER16> Well, the title literally says "world's fastest computer."

<comment><USER17> Probably fluff added by the headline writer to sound more exciting. The White House press release doesn't make world's-fastest claims: [https://www.whitehouse.gov/blog/2015/07/29/advancing-us- lead...](https://www.whitehouse.gov/blog/2015/07/29/advancing-us-leadership- high-performance-computing)

</comment></comment></comment></comment><comment><USER18> Can anyone provide back of the napkin calculations on this proposed supercomputers computing power vs Googles compute farm?

<comment><USER19> You could compare raw FLOPS (Floating point operations per second) but that would only tell part of the story. These supercomputers are highly engineered for low network latency between nodes, which is necessary for many scientific workloads. Google and other companies are generally able to express their algorithms in highly parallel ways, which means there are much reduced requirements for communication between nodes.

Therefore, even if the raw performance in terms of FLOPS sound similar, the two systems will have widely differing performance on real workloads.

<comment><USER20> Depends on what you mean by a "real" workload.

Capturing and indexing the entire web is certainly a real workload, even if it is massively psrallelizable, so it would probably run equally well on Google's infrastructure as on a supercomputer because those fast interconnects wouldn't provide much advantage, right?

However,when simulating a nuclear explosion or a weather system (maybe that's what you mean by "real" workloads?), the heavy node-to-node communication makes the supercomputer much, much better suited.

</comment></comment></comment><comment><USER21> Don't we already have a exabyte-scale supercomputer in Utah run by the NSA?

<comment><USER22> Yeah, but everyone knows that thing's doing illegal stuff (illegal now or soon-to-be illegal), and Obama doesn't want that on his record.

<comment><USER23> Do you have a source for that information?

<comment><USER22> [http://www.usnews.com/news/politics/articles/2015/07/27/nsa-...](http://www.usnews.com/news/politics/articles/2015/07/27/nsa- will-stop-looking-at-old-phone-records)

The NSA's currently being sued over its metadata collection. I wrote that comment slightly tongue-in-cheek, but repurposing that supercomputer for civilian use would actually be a great way to recoup some of your losses.

</comment></comment></comment></comment><comment><USER24> I suppose that "supercomputers" are all multi-processor these days, so the colossal FLOP numbers are counted as an aggregation over many processors and one has to coordinate these processors in any application that takes advantage of the FLOP specs.

Now I am curious what is the fastest single processor?

<comment><USER25> On a per-core basis, probably Power 8: [http://www.anandtech.com/show/9193/the- xeon-e78800-v3-review...](http://www.anandtech.com/show/9193/the- xeon-e78800-v3-review/7)

<comment><USER26> If your memory bandwidth limited then, yes. Otherwise your better of with a decently clocked intel. Anything that spends a portion of its time running out of L2 or better on the Xeon will be significantly faster.

</comment></comment></comment><comment><USER27> Press: "What's it for?" Obama: "Uuuh... NASA."

<comment><USER28> I think he added an extra "A" there at the very last minute. :-)

<comment><USER29> Quite a large NAS don't think ?

</comment></comment></comment><comment><USER30> I'd really love to see speed measured by performance by a single collective computation of an O(n) or O(n log n) algorithm. This would emphasize the importance of balancing communication performance with computation. Not holding my breath, the LINPACK is strong with these people...

</comment><comment><USER31> Reading over the list of priorities in the PDF linked from the Whitehouse blog, the one that I was the most pleased about was improving HPC productivity.

<comment><USER32> Let's hope this is not just bluster :(

</comment></comment><comment><USER33> IMHO if you need to break down a task well enough to run on a supercomputer, there isn't a lot more to do to make it run on a regular server farm.

edit: Actually, in the scenarios you'd use a supercomputer for, the added latency and overhead (shoddy servers, network, etc.) would most likely make the run time orders of magnitude higher.

<comment><USER34> Maybe for embarrassingly parallel tasks, but if you require nontrivial interprocess communication, a server farm can't compete with the interconnect of a modern supercomputer.

</comment></comment><comment><USER35> NSA director be making that smug frog face right about now

</comment><comment><USER36> too bad for him that he didn't order it earlier, maybe he could have figured out a way to stay for more then 8 years as President...

</comment><comment><USER37> Step 1: Order exascale computer. Step 2: ??? Step 3: Profit.

U.S. and other countries have been in a race for exascale. The thing holding us back isn't funding or political will: exascale is so ridiculously hard that it requires fundamentally different architectures. The main issues are making our CPU's do more work, eliminating memory bottlenecks, and dramatically improving energy efficiency of both. It's just very tough, technical challenges that might also have to operate on process nodes that are themselves tough.

Rexx Computing is one attempt whose founder posts here a lot [except in one thread dedicated to it lol]. I'm curious if any other exascale researchers read HN and can post their concepts as it's probably interesting stuff. Here's some links for readers interested in this stuff.

LLNL gives data on exascale and its challenges [https://asc.llnl.gov/content/assets/docs/exascale- white.pdf](https://asc.llnl.gov/content/assets/docs/exascale-white.pdf)

Also describes problems but skip to Venray's TOMI approach [http://www.edn.com/design/systems-design/4368705/The- future-...](http://www.edn.com/design/systems-design/4368705/The-future-of- computers--Part-1-Multicore-and-the-Memory-Wall)

Rexx Computing's approach [http://www.theplatform.net/2015/03/12/the-little- chip-that-c...](http://www.theplatform.net/2015/03/12/the-little-chip-that- could-disrupt-exascale-computing/)

Intel's relatively conventional approach [http://www.exascale-computing.eu/wp- content/uploads/2012/02/...](http://www.exascale-computing.eu/wp- content/uploads/2012/02/Exascale_Onepager.pdf)

Architecture from Univ of Texas and NVIDIA [https://www.cs.utexas.edu/users/skeckler/pubs/SC_2014_Exasca...](https://www.cs.utexas.edu/users/skeckler/pubs/SC_2014_Exascale.pdf)

Boise exploring non-Von-Neuman with ParalleX [http://cswarm.nd.edu/news- events/assets/PSAAP_II_Kick-off_CS...](http://cswarm.nd.edu/news- events/assets/PSAAP_II_Kick-off_CS.pdf)

Same group enlightens on details that all fight with [http://sites.ieee.org/boise-cs/files/2015/04/Thomas- Sterling...](http://sites.ieee.org/boise-cs/files/2015/04/Thomas-Sterling- Exascale-Computing-BSU-talk-20150409.pdf)

Bonus: 1,000 core, cache-coherent, optical interconnect. Sort of thing might be useful in exascale. [http://dspace.mit.edu/openaccess- disseminate/1721.1/67490](http://dspace.mit.edu/openaccess- disseminate/1721.1/67490)

Have fun with these. Submit a link if I left out any chip architecture in exascale race that's pretty cool.

<comment><USER38> Step 1: Nuclear test ban treaty. Step 2: Avoid nuclear test disasters. Step 3: Maintain military status quo.

Notice step 3 implies international stability and hence profit. NNSA stresses computation so heavily because stockpile stewardship cannot be done by noncomputational means.

<comment><USER37> Interesting point. Exascale is a lot more than that though: many stakeholders. And, even if none, it's still going to get funded as another international pissing contest (see Top 500). ;)

</comment></comment></comment><comment><USER39> I wonder how many bitcoins can be mined with it :)

</comment><comment><USER40> Why not just use commodity spot instances?

<comment><USER41> Haha.. AWS?

<comment><USER40> Sure, I'm asking sincerely.

<comment><USER42> One of the issues faced in super computing isn't just raw horsepower or more cpu's, it's latency. It's not enough to just connect a ton of machines via ethernet, you need specialized hardware to provide high-throughput sharing of data.

<comment><USER40> Thanks for the insight!

</comment></comment></comment></comment></comment><comment><USER43> Thanks Obama (no sarcasm).

</comment><comment><USER44> It kills me every time I read about how the world's nth-fastest computer is just used to simulate nuclear explosions, so it was a delight to see that they're planning on using this one for some good.

<comment><USER19> I don't know if this is what you're referring to, but a common application for government-owned supercomputers is simulating the degredation of nuclear warheads. The degradation of the fissile material as well as its surroundings is highly critical to a nation's security, and also very hard to model well.

Of course in an ideal world those cycles would be used to help cure cancer, but given that these warheads exist, it's probably a good idea to invest resources into getting an idea of what shape they're in.

<comment><USER45> The old way to do that was to blow one of them up every so often. The Nuclear Test Ban Treaty put a stop to that.

</comment></comment></comment><comment><USER41> I think one of the primary motivations for doing this is to break cryptographic keys, and using that for surveillance and to hack into Chinese websites.

<comment><USER46> Is this in the realm of feasibility for modern crypto? And what about past/current transmissions using older crypto.</comment></comment>


Best designed app - <AUTHOR> https://itunes.apple.com/us/app/google-wallet/id575923525

<comment><USER2> Why does this have the title of 'best designed app'? I don't see anywhere that it has recieved this award, or is this just your personal opinion?</comment>


Show HN: Share and discover user curated Apple Music Playlists - <AUTHOR> https://www.playlists.am <comment><AUTHOR> Last week a friend and I were discussing Apple Music (am) playlists. And how it is nearly impossible to find any user generated playlists. So we decided to create a tool for it, and here we are showing it to you guys. Any feedback is welcome, and thanks for checking it out!

</comment><comment><USER2> Cool! Beautiful interface, and love the ability to star without logging in.

Any plans to add support for other apps like Spotify? I've always thought an "Instagram for playlists" would be a fun app.

<comment><AUTHOR> Thanks! Yeah, first off we're starting with Apple Music since it lacks the discover features that Spotify does have. But if we gather a decent amount of users, we'll definitely keep improving the site!</comment></comment>


What skills do you need to be an entrepreneur? Only two. - <AUTHOR> http://www.sebastianmarshall.com/what-skills-do-you-need-to-be-an-entrepreneur-only-two

<comment><USER2> I have a real problem with the way a large number of people on HN dismiss college because there are better & less expensive ways to learn the things you need to know and get the credentials you need. Of course there are. The diagnosis is correct, but the prescription is wrong.

There is no better & less expensive way for someone between the ages of 18 and 21 to surround themselves with people the same age, who are as smart as they are, and learn how to be a positive social creature.

Maybe it's because I have a liberal arts degree instead of an engineering degree, but college taught me how to be a person, in the broadest sense. I'm perfectly happy to admit I went to college because that was "the thing to do," and I'm glad I can relate to so many people by virtue of having done it.

My best friends are still the 5 people living on my freshman floor who played counterstrike on 2ms ping university servers at 4am with our doors open, shouting at each other down the hall.

College is FUN. F-U-N. It is a highly structured 4-year period where you have exactly 2 responsibilities: graduate and don't die.

Sure, there might be less expensive ways to socialize, but none that so forcefully eject you from the shell you built around yourself in high school - something I suspect many who hope to eventually be in startups have built. You can say "oh, go to tech meetups", but you can still stand in the corner there, an intimidated 18-year old, just as easily as anywhere else.

If you can take Guy Kawasaki's advice: live off your parents as long as humanly possible. And if you have to pay for college yourself, consider it an investment in what many people consider the best 4 years of their lives.

<comment><USER3> This is good advice and all, but the problem is many people can't afford to go to college with just two responsibilities like you have listed. Going to college and working to help pay for it SUCKS. Some of the most miserable bits of my life were weeks on end of no sleep because I had a job and midterms/finals.

So, if you have a well off family or you are willing to go $60k in debt and make it the most fun experience of your life, then that is one thing. But for a large portion of practical people who realize the implications of $60k in unsubsidized school loans, college is a rough four years.

<comment><USER2> You make a fair point; everyone has to do their own cost/benefit analysis. I just wanted to challenge the chronic devaluation of some of college's intangible benefits. Some life experiences are worth more than money, and I've heard more than a few older folks refer to the best things in their lives as: 1. Kids, 2. Marriage, 3. College.

<comment><USER3> I agree. I am not discounting what I learned from college, which was how to suffer through and reach a goal. Can't discount that experience too much :)

</comment></comment></comment></comment><comment><USER4> I made an account just to comment on this blog...

The part about the rocket scientist just irked me. Why are you trying to impress upon someone else your beliefs on the importance of money? Some of the brightest people I know are also the most distant from material goods; as long as they have a fully belly and a roof over their heads, they are completely satisfied working on what they want, regardless of monetary compensation.

Of course, HN is full of people chasing after money, but personally, I have a great respect for people who perform great work for the sake of great work, and I would NEVER chastise them for not hungering for wealth.

<comment><USER5> I think his point was that being super smart doesn't mean you are a great entrepreneur. Nor is being super smart a requirement for being an entrepreneur.

I agree that money is not the only means to the end (I'll assume most rational people are trying to maximize their happiness which may or may not involve more money), but his post was about what makes entrepreneurs. And entrepreneurs need to put making money #1.

<comment><USER6> I second this. I am super smart and I am a shit entrepreneur. I try, but it's just pathetic.

</comment></comment></comment><comment><USER7> Albert Einstein:

"Education is what is left after you've forgotten everything you've learned."

Learning only things you think you'll need (e.g. coding) limits your thinking considerably. I always find it amazing how knowledge from absolutely unrelated fields helps me to solve specific problems.

<comment><USER8> I totally agree. You should invest as much time as you can in improving the quantity and quality of your knowledge on any field and topic that you find interesting. You always see huge bookshelves with thousands of books in the home's of the rich and smart. Make sure you've got some Moby Dick and some Financial Modeling in your bookshelf, and not just X, Y, and Z programming language for dummies.

That being said, education is a continuous habit of the curious and intellectual, and not a byproduct of formal education. Four years in college teaches you very little in the grand scheme of things, and is in lots of cases not a prerequisite to keep improving your knowledge and skills.

</comment></comment><comment><USER9> Brilliantly written, despite the seemingly over-discussed topic - esp. here on HN.

"Private victory precedes public victory" - this resonated most with me.

<comment><USER10> I was curious about that bit. It sounds good, but is it actually _true_? The thing that makes me skeptical is that I really enjoy reading biographies, and I can think of plenty of very successful people who were emotional wrecks (e.g. "tortured geniuses") while they were doing whatever led to their success.

</comment></comment><comment><USER11> Rule of thumb: if it has hard Math in it (engineering, physics...) or labs/facilities you cannot afford (chemistry...) or it requires a degree to work (medicine...) or you want to be a professor go to college, otherwise (literature, languages, philosophy, history...) you can do it on your own, it will be mostly on books.

Computer science is an edge case since it has some math/logic in it, that's why every two months there's a heated thread in HN/reddit/etc that started by someone asking or answering "do I need to go to college to be a software developer?" or similar.

<comment><USER6> In college you are forced to learn all the boring stuff about code readability, data structures and algorithms, code life cycles,etc...

Most of those I know who have taught themselves code (engineers, physicists, statisticians and mathematicians) in a non-academic environment spurge spaghetti, and I hate them to death.

<comment><USER6> Are the minuses because you disagree? Please discuss.

For me, dealing with codebases generated by the untrained is a daily problem. I do what I can to try and help - I sound like a broken record rattling on about naming variables what they are and whatnot.

<comment><USER11> I actually agree in part with what you say regarding having the discipline of going to class and a teacher versus self-learning.

You are probably being downvoted because of the second sentence talking bad about self-learned programmers when it's a popular opinion that there are many self-learned programmers.

I personally only downvote when someone is being rude/out of line or says something that is flat-out false, never for opinions. I find HN to be harsh frequently (no specially more so than other inet places but still) and I'm actually a bad day away of taking the route others have taken and just leave.

<comment><USER6> I may have been too harsh. The problems i see are actually from experts in non computer science fields. They don't even know that software engineering exists, and are used to being right.

At least non statisticians are respectful of stats. Doesn't apply to programming.

</comment></comment></comment></comment></comment><comment><USER12> Many people who advocate or encourage skipping college in favor of experience/entrepreneurship overlook one thing: how difficult it is to succeed. Most real-world businesses end up failing and online entrepreneurship can be just as cut-throat (if not more), having a college-level degree gives you at least something to fall back on. College is also a great networking tool to build the relations that can one day help your startup.

</comment><comment><USER13> "3. Selling bottled water for more than you paid on a hot day accomplishes this, and you could make decent coin doing it…"

I took the most exception at this comment for some reason. I guess because it seems like a serious suggestion instead of an example of what I understand as arbitrage. Maybe because it seems the most hand-wavey of all the suggestions.

Yeah, you can sell bottled water on the beach for more than you paid but, I think it's dubious to say that you can make decent coin in the long, or even mid-term. When I think "decent coin" I think of an income that can support my lifestyle and family.

Valuable as a way to learn about business? Sure.

<comment><USER14> >Valuable as a way to learn about business? Sure.

hah. well, it depends on what you want to learn.

I was taught business that way; If anything, in an even lower-paying way. I grew pumpkins, with my Father's help, and then took them door to door in a wheelbarrow, selling them. Seventy five cents for the big ones and fifty cents for the little ones. I made maybe $25-$30 a year that way. I was maybe 10-12 at the time.

The thing of it is, most HN readers, and especially Sebastian, would call me a loser even today; he would say I'm still overly focused on the "provide value" side of the coin; the business I spent the last five years on is worth maybe a cheap south-bay condo[1] right now, and I believe has the lowest margins in the industry. It pays my rent, sure, but if Sebastian looks down on patio11, he's going to look down on me, and really, anyone else who takes that view of business.

[1] note, I actually like doing this, I wouldn't sell at that price; but as far as I can tell, that's market value, give or take.

<comment><USER15> I'd never call you a loser for building stuff in the world. Never. I think that's fantastic and wish you the best in your endeavors. Additionally, if you were to drop me a line and asked something I could lend a hand with, I'd do what I could.

I think weakness and mediocrity sucks, and it's worth fighting to transcend the weak/mediocre elements of ourselves that we all have. But I'd never look down on someone for building, I'd never call someone moving forwards a loser, never. Best wishes in your endeavors.

</comment></comment></comment><comment><USER16> Pretty vague: thesis is you only need to add value, and skim some of that value for yourself. Gosh, wish I'd thought of that.

How about: develop the skills to let you do either of those? Any guidance there? No, just some handwaving about college either being useful or maybe not.

<comment><USER15> > Any guidance there? No, just some handwaving about college either being > useful or maybe not.

Did you read past the first three paragraphs?

I put down like ten books, 4-5 websites, another half-dozen authors, and 3-4 things you could try out conduct-wise.

<comment><USER16> Sorry, no, I didn't - I stopped somewhere between the lemonade stand and the story about some guy you knew.

</comment></comment></comment><comment><USER17> 1.5 - Ensure that others know of the value.

(Sort of a prereq or a part of #2.)

</comment><comment><USER6> I started with nothing but a dream, and twelve million pounds in my pocket.</comment>


A lonely death - <AUTHOR> https://www.nytimes.com/2017/11/30/world/asia/japan-lonely-deaths-the-end.html?target=comments&hp&action=click&pgtype=Homepage&modref=HPCommentsRefer&clickSource=story-heading&module=second-column-region&region=top-news&WT.nav=top-news#commentsContainer <comment><USER2> Are there any books, fictional or other-wise discussing this issue in the context of a developed country?</comment>


Scientists pinpoint the singularity for quantum computers - <AUTHOR> https://phys.org/news/2017-10-scientists-singularity-quantum.html <comment><USER2> Referring to the point where quantum computers are better at one esoteric thing that's not even useful as a "singularity" is laughably atrociously ridiculous. The actual relevant technical term is "quantum supremacy" [1], which is _already_ misleading (implies complete dominance but actually refers to not being completely dominated). There's no need to make it worse!

Also, the theorists didn't "pinpoint" anything. They showed that quantum supremacy via boson sampling was harder than previously thought. They improved the classical simulation algorithm, raising the bar quantum computers will have to jump over.

I guess popsci has standards for terribleness that just weren't being met? They couldn't pick a merely semi-terrible title, like "Scientists raise the quantum supremacy bar"?

1: [https://arxiv.org/abs/1203.5813](https://arxiv.org/abs/1203.5813)

</comment><comment><USER3> I think the title should be "Efficient classical algorithm for boson sampling discovered".

I don't get the whole singularity thing.

<comment><USER4> A singularity originally referred to a single point where (the mathematical description of) a field has infinite strength. For example, a black hole that had collapsed to an infinitely dense, infinitely small point. But lots of people now are referring to the event horizon around the back hole as the singularity. So when something starts to tip inevitably, it's called a singularity even though that's just the beginning of getting there.

<comment><USER5> I always intended it as "the point beyond which _no description is possible_ ", from the mathematical concept of singularity as a point in which a mathematical object is not defined. Which sort of fits with the idea of a point in progress beyond which no description of the future is possible.

<comment><USER6> "Wait. I've seen this. I stand here, right here, and I'm supposed to say something. I say, 'Everything that has a beginning has an end, Neo.' . . . What? What did I just say?"

</comment></comment></comment></comment><comment><USER7> Skip it, friends. This is a badly-written, and unimportant article. also, phys.org using clickbait? I thought they were good.

</comment><comment><USER8> Algorithms that don't use quantum computation and plain silicon devices are such a hard hurdle to overcome. I can see a possible future where silicon reaches its limit and maybe then we will be forced to engineer Quantum Computation but even so that is still 90 years of research to get them practical. I found that out when studying Quantum Computation at school.</comment>


How to find size of an array in C without sizeof - <AUTHOR> http://arjunsreedharan.org/post/69303442896/the-difference-between-arr-and-arr-how-to-find <comment><USER4> The result you get with this trick is signed, while the result you get with sizeof is unsigned.

Edit: Just to clarify, what you get is ptrdiff_t instead of size_t. So if array size is greater than PTRDIFF_MAX, you get undefined behavior [1].

[1] [http://en.cppreference.com/w/c/types/ptrdiff_t](http://en.cppreference.com/w/c/types/ptrdiff_t)

<comment><USER5> How likely do you run into array bigger than 2gb?

<comment><USER6> The "how likely is it, really?" response to questions of technical correctness has always bothered me. It takes a mindset completely alien to mine to say "Here's a race condition. Sure, it's undefined behavior, but the race is narrow, so it's rare" or to say "Sure, memory allocation can theoretically fail, but in practice almost never does" or to say "fsync is too slow and most computers have batteries these days".

Software is unreliable enough as it is due to problems beneath our notice. It seems reckless to avoid fixing problems that we do notice. Sure, you could argue that rare problems _are_ rare and that users probably won't notice them --- this attitude is penny-wise and pound-foolish, because you can't meaningfully reason about a system that's only probably correct.

<comment><USER7> The problem you're latching on to I think is how the context for caculating a probability can vary.

If it were really as likely as, say, the sun exploding that X happened then it would be of no use to expend time on X.

BUT very often people speaking about the probability of events given suspicious constraints. While a memory allocation might not fail in most situations it will fail often in some situations. And a one-in-a-million chance is almost guaranteed when there are millions of uses.

<comment><USER8> That's why it's called one in a million...

<comment><USER9> One in a million happens quite often if you're processing something like ~100k requests a second.

<comment><USER10> But it's extremely unlikely when you're processing 10 requests a week, such as might be the case for the web server in a consumer-grade router.

<comment><USER6> It's amazing how skilled blackhats are at converting "rare bug that doesn't affect the UI" into "massive DDoS cannon".

<comment><USER10> And you can see how risk analyses by senior engineers with tons of embedded experience who are used to working with systems that are not networked leads to problems when their systems are later networked.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER11> I'm surprised at all of the comments calling this stupid or pointless. The point is not that you should this trick in lieu of sizeof; the point is to shed light on a subtly of C arrays.

<comment><USER12> I suspect this article made a lot of people feel stupid, or in other words, it taught us something. Sometimes the ego gets out of check.

I think the article is well-presented and educational.

<comment><USER13> >I think this article made a lot of people feel stupid

I don't think so. Anyone with a solid understanding of C understands pointer arithmetic. I think the article isn't obvious only to those who have a weak understanding of the language.

<comment><USER14> There are many that have a weak understanding of the language.

I got asked some years back why I defaulted to C in some interview questions -- I grew up with the language, understand the nuances and many of the implementations.

It's now possible to make your way through a university education in CS without ever touching or understanding C. This is a problem.

<comment><USER15> > It's now possible to make your way through a university education in CS > without ever touching or understanding C. This is a problem.

I did not study CS, but I had a number of CS modules/classes. LaTeX was the only programming language I recall using. Students with better handwriting could probably get away with not doing any programming at all.

It's not clear to me that this is a problem, but I imagine that the systems requirement of most CS programs will involve C.

For what it's worth, I default to python in interviews even though it's my least favorite out of the languages that I use frequently.

<comment><USER16> > I default to python in interviews even though it's my least favorite out of > the languages that I use frequently.

Why is that ? I would image that you'd use the language you are most comfortable with and trust the most during an interview ? What makes Python a good 'interview' language but a less good bread and butter language for you ?

<comment><USER17> If he's listing LaTeX as a programming language and talking about how little programming he had, I suspect he's stuck with R or Matlab.

<comment><USER18> TeX is a "real" programming language.

<comment><USER19> It's a macro expander. Good luck debugging that.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER20> Author of the article here. There's no intention here to encourage people to use this in code (in fact the opposite). This article is more of a "Did you know cool shit like this exist?".

<comment><USER21> Please fix your site's header :)

<comment><USER20> I'll appreciate if you could provide a screenshot :)

<comment><USER21> (1)- Taken using chrome extension:[http://imgur.com/a/PYMRD](http://imgur.com/a/PYMRD) (2)- Print screen of chrome version 54.0.2840: [http://imgur.com/a/dDwK9](http://imgur.com/a/dDwK9) (3)- Print screen of internet explorer version 11 :[http://imgur.com/a/uxAv5](http://imgur.com/a/uxAv5)

All running on 32bit windows 8.1

<comment><USER22> Author might have fixed it already, but it looks alright to me on Chrome 55.0.2883.95 / macOS 10.12.

[http://imgur.com/a/fhDr1](http://imgur.com/a/fhDr1)

</comment></comment></comment></comment></comment><comment><USER23> Whether you use this method of getting the number of elements in an array or the more traditional sizeof method, _please_ encapsulate the logic in a macro.

Instead of writing either of these:

      size_t length = sizeof array / sizeof array[0];

      size_t length = (&array)[1] - array;

Define this macro instead:

      #define countof( array )  ( sizeof(array) / sizeof((array)[0]) )

Or if you must:

      #define countof( array )  ( (&(array))[1] - (array) )

And then you can just say:

      size_t length = countof(array);

Edit: I used to call this macro 'elementsof', but it seems that 'countof' is a more common name for it and is a bit more clear too - so I'm going to run with that name in the future.

<comment> brian-armstrong Why a macro and not a static inline function?

<comment><USER23> That's a good question! Can you share the code for that function?

</comment></comment></comment><comment><USER24> Interesting. I've been working with C for almost 30 years (first taught it to myself when I was 14) and never thought about the actual _type_ of _array_.

<comment><USER25> You're not alone. I've been programming in either C or C++ for 25 years, and it wouldn't have occurred to me that you can have a "pointer to array of size N" that includes the size. Though I probably could have been led there with a little Socratic questioning.

<comment><USER26> The reason why people don't usually run into this is because C tries really hard to decay your arrays to pointers to first element, so there are very few cases where it actually comes up - sizeof(array) and &array are some of the few. On top of that, writing down the type of such an array is not exactly obvious, and requires parentheses:

        int (*p)[10];

This all is much more interesting in C++, because there, in conjunction with references, this lets you write functions that take arrays as arguments _and know their length_. Like so:

        template<size_t N>
        void foo(const int (&a)[N]) {
            for (size_t i = 0; i < N; ++i)
                cout << a[i];
        }

        int a[10];
        foo(a);

</comment></comment></comment><comment><USER27> For the completeness sake, the size of an array can also be computed via linker symbols, see for example: [http://stackoverflow.com/questions/29901788/finding-the- last...](http://stackoverflow.com/questions/29901788/finding-the-last- variable-in-attribute-section).

Same constraints apply (pointer arith).

I am not sure why this method, applied to ordinary arrays, would be preferred to sizeof (), but since we're shedding light here...

EDIT: pointer arith constraints only apply if we compute the difference (end - beg) in the C code. We could also do that in the linker script itself, and I don't recall whether or not C semantics of ptrdiff_t would be preserved in that case. Such preservation doesn't seem very probable to me, so potentially this method might allow to avoid overflows (or to move them much higher) -- to be checked in the 'ld' doc!

<comment><USER28> Do all linkers guarantee not to round this up to a word size?

</comment></comment><comment><USER29> Was anyone else's first thought "Hmm... cool," followed by "I hope nobody asks me this on an interview?"

<comment><USER30> If you are asked this in an interview, it's not longer an interview... I would simply reply "what circumstances would dictate the necessity of such rather than producing clean code for my coworkers?"

<comment><USER29> Hence why I hope noone asks me it. :)

</comment></comment></comment><comment><USER31> Despite the argument at the end, this is undefined behavior in the latest C specification. The code dereferences a pointer one past the last element.

C11 6.5.6/8:

If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated

<comment><USER32> The snipper only calculates the pointer, and does not dereference it. Should be fine.

<comment><USER33> It's a complicated situation. There's a pointer to an array, and that pointer is dereferenced, resulting in an array (that then decays to a pointer). But that second array/pointer is not dereferenced. I'm not sure if it's legal.

<comment><USER34> Where is it dereferencing the array?

        *(&arr + 1) - <USER3>

That translates to taking the address one point past the array and subtracting the address of the array from it. It doesn't actually dereference the location past the end of the array.

While:

        (&arr)[1] - <USER3>

might appear to be doing something different, it actually isn't.

<comment><USER33> &arr is a pointer to an array (it points to the existing array).

&arr + 1 is a pointer to an array that begins just after the existing array.

* is the dereference operator, so it seems to me that *(&arr + 1) dereferences the pointer to the array, resulting in an array (or a reference to an array), which then decays to a pointer.

<comment><USER35> >so it seems to me that _( &arr + 1) dereferences the pointer to the array

It doesn't. Because an array is already a pointer, in _(&arr + 1) &arr is a pointer to a pointer (ie, a handle) so *(&arr) is dereferencing the handle to the pointer. So it's still one pointer level deep - it doesn't dereference it completely.

<comment><USER26> It doesn't matter what it is a pointer to, type-wise. It is still a pointer one-past-the-end, and it is being dereferenced.

Also, &arr is not a pointer to a pointer. It's a pointer to an array. Specifically, its type is int(* )[5] in this example, and so when you dereference it, the result is of type int[5]. So if you do e.g. sizeof(* &arr + 1), you'll get 5 * sizeof(int).

</comment></comment></comment></comment></comment></comment></comment><comment><USER36> While this is as interesting as any c arcana, I truly hope that people are not passing around pointers to arrays and then using sizeof(array)/sizeof(elem) to figure out how big they are, like they are stuck in a first year programming assignment that denies them the use of malloc, so they use C99 VLAs everywhere.

</comment><comment><USER37> How is this better than the sizeof method? This looks like a clever way to access sizeof information without explicitly using the sizeof operator.

<comment><USER38> It isn't better. I don't think it was claimed to be.

But if you really understand C, it should also not be a surprise that it works this way.

</comment></comment><comment><USER39> Why do we dereference the array pointer? Wouldn't that give us the value at the address when we just want the address? Also wouldn't the subtraction just give us a number of bytes and thus we'd still need to divide by sizeof(int))?

<comment><USER40> Pointer arithmetic works element-wise, not byte-wise.

So if _p_ is a pointer, then p+1 refers to the next element after p, regardless of the size of the pointee. And so (p+1) - p is 1, again regardless of the size of the pointee.

In this case, &arr is a pointer to array, and &arr + 1 would point to the next array following the first one. But we wanted to calculate the number of elements in the array, not the fact that we have one array. So we dereference the pointer, thus getting an array type, which in turns "decays" to a pointer to the first element of the array, which has the right type for counting the elements using pointer arithmetic.

<comment><USER39> Thank you.

</comment></comment></comment><comment><USER41> there is a classic mistake here... the idea that pointer arithmetic does not rely on sizeof.

that's the entire mystery opened and closed afaik. sure you can use some obscure notation if you like, but why not just use sizeof?

</comment><comment><USER42> Thanks for posting this question. The responses are very interesting.

</comment><comment><USER43> this is undefined behavior. &arr + 1 can overflow. There's no guarantee &arr isn't near memory end boundary. &arr + 1 is converted at compile time to rbp - X where X is an integer determined by the compiler similarly to how sizeof works.

Basically ptr + integer requires the compiler to determine the sizeof ptr's type.

<comment><USER44> _this is undefined behavior. &arr + 1 can overflow_

No. From 6.5.6 Additive operators:

7 For the purposes of these operators, a pointer to an object that is not an element of an array behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

8 [...] if the expression P points to the last element of an array object, the expression (P)+1 points one past the last element of the array object [...] If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated.

So _& arr + 2_ can overflow, and _& arr + 1_ cannot be dereferenced, but _& arr + 1_ shall not overflow and is not undefined behaviour.

<comment><USER43> But arr != &arr even though they have the same value. #8 applies to arr (P), but in the post OP is using &arr which is a ptr to array[x] and doesn't apply to it.

<comment><USER44> That's why I quoted paragraph 7: _arr_ is not an element of an array, so _& arr_ (being a pointer to an object which is not an element of an array) behaves like a pointer to the first element of an array of length one with the type of the _arr_ as its element type.

So &arr behaves like it's a pointer to the start of int[5][1].

<comment><USER43> Yes &arr does behave like arr when it comes to ptr arithmetic but the compiler does not guarantee that &arr + 1 does not overflow. It only guarantees arr + 1. if you have a ptr from heap, ptr + 1 if not alloced previously is UB.

> If both the pointer operand and the result point to elements of the same > array object, or one past the last element of the array object, the > evaluation shall not produce an overflow;

this point doesn't apply to &arr + 1.

<comment><USER45> How so? If the array has five elements, you can pass &arr to a function that expects an int[5][], and that function certainly can build a pointer that points one past the last element.

Likewise, the compiler ensures that you can build &arr[5] and that is the same address as &arr+1. &arr+1 _cannot_ overflow.

<comment><USER43> The compiler guarantees that arr + 1 doesn't overflow by making sure arr's address is small enough to not overflow when accessing one element past the array size. &arr + 1 is not one past the array you asked the compiler to allocate.

if you're on a 16bit system and you define char x[36], the compiler guarantees that x's address is not more than 65500. if you do &x + 1 then you'll overflow, x + 1 won't.

You can pass whatever you want to the functions and apply the operands you want and the compiler will happily comply with you. But when you pass it 65500 and add 72 to it, it's going to overflow.

<comment><USER46> Wait, wait.

      char *p = x;
      p += 36; // overflow?

As arr == &arr, so are pointers P and Q that point just after last array item (1+&x[35]) and just after entire array (1+&x). As 22.214.171.124 above said, P _is_ okay, and so must be Q. They said about last element, not second. Can you please explain why is x+1 even an argument?

>if you're on a 16bit system and you define char x[36], the compiler guarantees that x's address is not more than 65500 65499?

<comment><USER26> No, he is correct. The C and C++ standards do allow pointers past the last element of an array to be produced via a pointer to an element of said array. They also have a provision where a pointer to a _nonarray_ value is treated as if it were a 1-element array (so you can do "int x; int* p = *x + 1"). But in this case, the value is obviously an array object, and it's not an element to another array; hence, it is not legal to do &arr + 1 ("... otherwise, the behavior is undefined").

This is 6.3.6 "Additive operators" in ISO C90 standard, for anyone curious.

<comment><USER40> No, he isn't correct.

> They also have a provision where a pointer to a nonarray value is treated as > if it were a 1-element array

That is not what it says. Let me quote the exact words ( _emphasis_ mine):

For the purposes of these operators, a pointer to an object that is _not an element of an array_ behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

You're right that what we have is obviously (a pointer to) an array object, _not an element of another array_. This is precisely the case where this special provision kicks in, and thus it is legal to do &arr + 1.

<comment><USER26> It looks like we're quoting different standards (or different versions of them). I was referring to ISO C90, which specifically says "nonarray object". I guess yours is C99 or C11?

<comment><USER40> I quoted from C99 but C11 has the same wording.

I used to prefer C89 but learned the hard way that there are quite a few "bugs" in the standard, where it is ambiguous or otherwise fails to give a clear answer. So C99 is my go-to standard these days, even though I only care for a subset of its features.

"nonarray object" definitely sounds like such a bug. I think the intent of this clause is clear: it is meant to make sure you can always pass a pointer to a single object that treats its argument as a pointer to an array element, and does pointer arithmetic on it. One of the most common construct is simply looping over an array by incrementing the pointer, and this must work without producing an overflow when the pointer points past the array, the way it's conventionally written. If it weren't for this clause, passing a pointer to a single object to be treated as an array of size 1 would break a lot of code. Going further, is the object allocated by malloc an array or a nonarray? That would then be a critical question to ascertaining the correctness of most code out there.

And I cannot think of any reason why only pointers to nonarray objects should be usable in this manner.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER47> Given how many bugs & errors stem from simple fails in range checks etc, I would much rather go with the tried and true way rather than use something "clever".

Quoting [http://stackoverflow.com/a/16019052/1470607](http://stackoverflow.com/a/16019052/1470607)

      Note that this trick will only work in places where `sizeof` would have worked anyway.

<comment><USER48> Yes. This only works for arrays on the stack, at best. It assumes that arrays are placed on the stack in the order of declaration, which is not a requirement of the C standard and may differ between compilers.

Unless you're writing a buffer overflow exploit, in which case you need to know exactly what's on the stack and where, this isn't a good way to program.

Update: misread the article; thought he was differencing with the beginning of the next array.

<comment><USER49> I don't see how the code assumes anything about the placement of the array. Indeed, it works just fine for static arrays:

        $ cat test.c
        #include <stdio.h>

        int arr[5];

        int main(int argc, char *argv[]) {
        	printf("%lu, %ld\n", sizeof(arr) / sizeof(*arr), (&arr)[1] - arr);
        }

        $ gcc test.c && ./a.out
        5, 5

Not saying it's "a good way to program" \- it's needlessly obfuscated compared to the standard sizeof alternative. But it doesn't rely on anything tricky.

</comment></comment></comment><comment><USER50> nice exposition to c array types.

in c++, a compile-time equivalent to sizeof would be:

      template<typename T, size_t N> size_t sz(T(&)[N]) { return N; }

</comment><comment><USER51> I would do this only when I am obfuscating code.

</comment><comment><USER52> Many implementations historically also allocated enough memory to include one extra element at the end of the array.

<comment><USER53> I find this improbable.

<comment><USER36> Agreed, compiler implementors rarely decide to use more memory than is required. There may be a _stack canary_ , but this is between stack allocated variables and control flow structures, not for every array.

</comment></comment></comment><comment><USER54> That pun in the first sentence alone made the article worth it.

</comment><comment><USER55> The printf commands say "the address of..." but proceed to print out the value, not address.

<comment><USER56> Looks fine to me. An address is just a number, this one being hex encoded.

<comment><USER55> Okay. In my experience "the address of x" is taken to be synonymous with "&x", but I suppose that's a pedantic difference.

<comment><USER56> arr is an array. So printing arr[0] would print the contents within the first position of arr, and &arr[0] would print its address. However if you simply print arr, then that's not the contents of the array, so it will print the address. &arr[0] should print the same as arr.

</comment></comment></comment></comment><comment><USER57> C is such a boondoggle of a language... We're condemned to forever explore its every weird nook and cranny for historical reasons, rather than because it is the cleanest, best approach to things possible.

<comment><USER27> C for sure has its weird sides, but does appear much more logical and consistent when observed "from the below", from how-the-hardware-runs perspective.

For example, the shift operators have higher precedence than bitwise masking (and/or/xor) since this way the expressions setting/clearing ranges of bits won't require parentheses (so increased readability) _and_ the masking constants in them will be the narrowest. Loading a wide immediate value into a register sometimes takes several instructions, so such precedence also brings in the least cost as well (nowadays compilers take care of that to some extent).

But people frequently mess up this aspect, use lots of parens (and ending up with wide masks) saying this rule is not intuitive. It is.

<comment><USER58> You could attempt to rationalize some of its (terrible) design decisions after-the-fact by finding convenient examples, but compared to the clarity and surety of straight-up assembly, C is a dystopian nightmare of enormous unseen complexity and undefined behavior.

</comment></comment></comment><comment><USER59> I haven't written C in a while, but I think this is pretty stupid. sizeof() is a compile-time thing in C, so it's substituted with a number by the time you get an executable. See:

[http://stackoverflow.com/questions/671790/how-does- sizeofarr...](http://stackoverflow.com/questions/671790/how-does-sizeofarray- work)

I think this is effectively doing the same thing, but in a non-standard way; ie. I think `int n = (&arr)[1] - arr;` is substituted with the actual the number by the compiler the same way sizeof() would be, only noone will know wtf is going on.

Disclaimer: I didn't look at the generated code to confirm; I guess it could even be compiler/runtime dependent.

<comment><USER49> I don't think anyone is proposing that people use this. I read it as an exercise to stretch our understanding of other bits of the language.</comment></comment>


Java Pwns Everyone Again - <AUTHOR> http://blog.beyondtrust.com/bid/89011/Java-Pwns-Everyone-Again

<comment><AUTHOR> According to this:

[http://www.theregister.co.uk/2012/08/30/oracle_knew_about_fl...](http://www.theregister.co.uk/2012/08/30/oracle_knew_about_flaws/)

Oracle knew about this for quite some time..

</comment><comment><AUTHOR> To disable java applets in chrome:

chrome://plugins/

Scroll down to Java and hit the disable link.</comment>


How do you implement password recovery securely? - <AUTHOR> Emails are sent clear-text, so how do you implement a password recovery feature that uses email, without resorting to those what-is-your-grandmother's-middle-name security questions?
Here's a good way, but it still sends a password via email, so is not good for money-handling sites, and is vulnerable to man-in-the-middle attacks: http://blog.moertel.com/articles/2007/02/09/dont-let-passwor...

<comment><USER2> You're creating a web site and want to lower the entry barrier for people signing up. So you require nothing more than a valid email address to register. So far, so good. But now some of your users have forgotten their login passwords. Now what? How do you reconnect them to their accounts?

One option is to send account-recovery tokens to their email addresses. (That is the method described in the post that you linked to.) It's a reasonable method because a valid email address was all it took for your users to register in the first place. The account-recovery emails amount to asking the recipients re-perform the original registration test: do they own the email addresses they claim to own? If the accounts are worth the same now as when the users signed up (i.e., virtually nothing), that test is probably all you need.

If, however, users can accumulate real value on your site, even if the value is small, attackers will have incentive to hijack accounts. So the test for reclaiming an account must be less susceptible to attack than the do-you-own- this-email-address test, which is fairly weak.

Unfortunately, that's where your options start to become expensive in terms of usability. Most users are familiar with entering passwords, receiving emails, and clicking on links, but beyond that is probably asking too much of casual web surfers. You can't ask them to sign challenge messages with their private keys and expect them to know what you're talking about.

Hence the popularity of security questions. Users are familiar with filling out forms and answering questions, so it's a plausible option for account recovery. But, as I'm sure you are aware, it has problems. It's not very secure because the answers to many security questions are limited and therefore can be guessed. Further, many people are reluctant to provide the answers in the first place because the "good" questions are invasive. People are rightfully suspicious when you ask for their mothers' maiden names. So if your site uses security questions, you raise the barrier for initial registration, and you'll lose some users right there.

So what other options do you have? If your accounts are somehow tied to the physical world, say to bank accounts or credit cards, you can piggyback off of real-world authentication. But that's probably not an option for most Web 2.0 sites.

If none of those options work for you, consider not offering account recovery at all. When users sign up, make it very clear (several times) that if they lose their passwords, they are effectively locked out. Tell them to write down their passwords and store them in a safe location. For certain kinds of sites, it's a reasonable option.

There are other options, too, each imposing a different set of burdens on your users and offering different degrees of reliability in exchange. Ultimately, which is best for you depends on your goals, your users, and your aversion to risk. There is no one-size-fits all approach for sites requiring more than trivial security.

(If all you need is trivial security, however, there is a minimal entry level for all such sites: salt and hash each and every password using a hash function designed for password hashing, and use recovery tokens for account recovery. Less-secure options are not any easier, for you or your users, so there's no justification for them.)

Cheers. --Tom</comment>


Linus on branching - <AUTHOR> http://codicesoftware.blogspot.com/2010/11/linus-on-branching.html <comment><USER2> I think the main issue there is that the trunk is not stable, not that people forked off unstable points.

We only land tested, verified code in the trunk. Each trunk revision is pretty much a separate release. Features are developed in feature branches and multiple features are merged into an acceptance branch for testing. Once accepted, they are merged into the trunk and put in production.

This is using SVN though. I wonder how it compares to a git workflow.

<comment><USER3> _they are merged into the trunk_

Do you mean to say that this process never introduces bugs? With subversion's merge model?

<comment><USER4> I can't speak for the grandparent, but we use a similar system here and also on SVN.

We have a 'core' team and a number of 'project' teams. Every team works in it's own branch, which is branched off of the trunk. The trunk is kept in a stable state.

No one really uses 'feature branches', which I find to be a shame (but hey, it is SVN so feature branches are not convenient). Rather the core team creates a new branch each sprint (scrum here - 3 week sprints) and at the end of each sprint merges it back into trunk, after it has been verified as stable by QA.

Project teams can either branch from trunk and stay off in la-la land until the end of time, or they can try to keep up to date. The way they keep up to date is by merging back into trunk and then starting a new branch. This process is hand-held by the core team and goes through the same QA process to verify it is stable.

How does this work out? Well merging is a major event. Aside from the stability verification work that goes into it a core team member (usually the lead) will generally spend about a day on a merge/branch cycle.

So it feels slow and big, but we do maintain a very stable trunk.

SVN merge issues are a pain, but so long as we never do double-merges (that is, merging a branch into trunk, continuing work on the branch, then merging it a 2nd time into trunk) we seem to avoid the most common gotcha.

This system would be improved if a DVCS was used instead. The issues to adoption of that are both user and technical. We have a wide range of users of widely varying technical skill levels so the ecosystem of SVN clients is going to be difficult to usurp. We also store a LOT of very large binary data in the repository and would find it very inconvenient to separate it out (code version and asset version matching is essential), and in my tests of using git-svn (for example) it simply choked. Like an exception thrown from the bowls of the client type of choke.

</comment></comment></comment><comment><USER5> The rest of [http://codicesoftware.blogspot.com/2010/11/linus-on- branchin...](http://codicesoftware.blogspot.com/2010/11/linus-on- branching.html) is also interesting:

"It's actually made worse by rebasing. A lot of people end up rebasing on top of such a random kernel (again, just because it's the 'most recent'). It's very annoying."

"Not to mention that rebasing easily results in bugs of its own, when you do hit merge conflicts or double-apply something that already got applied (and wasn't seen as a duplicate and merged away automatically, because the code had been further modified since). We had that in the DVB pull request just yesterday."

For me, this sounds like a problem with either the tool or the development process. Any thoughts on how to do it 'properly'?

<comment><USER6> Yes. Never rebase unless you are absolutely certain that branch has never been published to anyone.

Whenever you want to rebase your branch on top of some other branch, just merge into your branch instead.

</comment></comment><comment><USER7> This depends very much on a project. Ideally you should have a good test suite assuring that a given revision is correct before merging it into the mainline. If this is the case then every commit on the mainline should be considered an acceptable branching point.

The advice in the article certainly makes sense for the kernel, but could be an overkill for well-tested small and medium projects. Keep in mind that the kernel is a special case both because of its size and the fact that such a low-level and hardware-dependent code cannot be comprehensively unit tested.

</comment><comment><USER8> My sense is that the latest point release of the kernel is a better jumping-on point for development, rather than from -current, which is volatile & changing multiple times daily.

Perhaps when they start the branch, it's expected to be a small fix, & that it won't last very long. Making it work & making sure it won't break anything will be quick. So you'd try to keep your merge costs down by starting from the most recent version.

It's optimizing based on faulty information. Building on a dev kernel might be really hard to troubleshoot, & merging is easier than that.

</comment><comment><USER9> Getting involved with protracted git usage discussions is like trying to follow Doc Brown explain the vagaries of the time continuum[1].

[1][http://answers.yahoo.com/question/index?qid=20091109190826AA...](http://answers.yahoo.com/question/index?qid=20091109190826AAT40Tx)

</comment><comment><USER10> Wow, i had no idea plastic scm existed, pretty cool. No capistrano module yet?</comment>


Blizzard has learned 11 lessons on innovation that can help almost any business - <AUTHOR> http://innovation.freedomblogging.com/2008/04/04/11-innovation-lessons-from-creators-of-world-of-warcraft/ <comment><USER2> 1-7: eerily familiar... Good though to see them backed up by a company outside the web.

8 is interesting. So instead of just building upon the best aspect of the games, they do a lot to improve the worst. Guess that makes sense though given that games generally have a more restricted flow than apps.

9, Another good datapoint in the ongoing debate over "release early to customers" vs "release high quality." Then again, they do use somewhat of a hybrid as I'm sure they have testers before they do the full scale release. Or do they?

10, There are "new" types of games coming out of the console gaming industry? I'm hardly convinced...

<comment><USER3> A lot of this stuff seems really obvious, but having worked in the game industry, the general view seems to be that "that would all be nice if we could do it". In particular, the quality feedback loop is often sorely missing. This is why there are so many mediocre to bad games. I suspect the reason for this disparity between theory and practice at most publisher- independent studios is some mixture between the iron grip of publishers on developers, and developers' reluctance to even try to do anything about it. Maybe I've missed something though, few of the politics ever seeped through to programmers. (apart from "you're not working hard enough")

</comment></comment><comment><USER4> if only they actually did all that stuff. they've been promising a new war3 patch for years. if they'd just have one guy making a few small balance changes per _month_ it'd be much better than it is. it's not rocket science to watch pro games and slightly nerf everything you see a lot of, and slightly buff everything you never see, until there is more variety used.</comment>


Two French rivers disappear underground in cracks and sinkholes - <AUTHOR> http://strangesounds.org/2018/08/french-rivers-disappear-underground-doubs-river-has-disappeared-between-pontarlier-and-morteau-1km-swallowed-up-by-large-cracks-in-the-riverbed.html <comment><USER2> An interesting and little-known fact is that the Danube in Germany does exactly the same for roughly 155 days per year [1], which is called "Donauversinkung" ("swallowing of the Danube"). Between the towns of Immendingen and Fridingen on the Swabian Alb the water just disappears underground [2]. This started to happen around 300 years ago, and until the 1870s nobody knew exactly where it went. They then did experiments with Uranin and ultimately proved that the water re-surfaces in the Aachtopf [3]. Now, the water from the Aachtopf flows directly into Lake Constance, therefore into the Rhine, and therefore into the North Sea. Normally, the Danube flows into the Black Sea, which essentially means that on roughly 155 days per year, the disappearing water moves the European watershed [4], which I find highly fascinating.

E: as the Danube laters flows through the once independent state of Württemberg, and the Rhine through the once independent state of Baden, there was also a nice court battle between them because of the lost water in the 1920s - the "Donauversinkungsfall" [5] ("the court case of the swallowing of the Danube")

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

[2] [https://upload.wikimedia.org/wikipedia/commons/2/20/Donauver...](https://upload.wikimedia.org/wikipedia/commons/2/20/Donauversinkung.jpg)

[3] [https://en.wikipedia.org/wiki/Aachtopf#/media/File:AachTopfP...](https://en.wikipedia.org/wiki/Aachtopf#/media/File:AachTopfPano02.jpg)

[4] [https://en.wikipedia.org/wiki/European_watershed](https://en.wikipedia.org/wiki/European_watershed)

[5] [https://de.wikipedia.org/wiki/Donauversinkungsfall](https://de.wikipedia.org/wiki/Donauversinkungsfall)

<comment><USER3> Am I understanding correctly that the Danube always seeps into the ground near Immendingen (since 300 years), but if the conditions are dry enough there is not enough water to flow past this sink hole, so all of it drains into the European watershed?

It should be noted that this only the first few hundred meters of the Danube and it's relatively flat there so the exact way the water sheds is probably always subject to changes up there (at least across large spans of time). There are relatively small masses of water that flow up there, so things are not set in stone as much (literally).

<comment><USER2> This is correct. The main sinkhole is roughly 3 km downstream from the source. Disappearing water was first noticed 300 years ago, and the first total disappearance was in the 1870s. It is expected that this process will eventually make a small creek [1] the new source river of the Danube over the next 1,000 to 10,000 years.

There is a group of hobby enthusiasts who are digging into the cave system since 1990 [2], expecting to find a cave containing an enormous underground lake, as the amount of water disappearing into the underground is much larger than the amount of water later carried by the Aach. AFAIR, they managed to finally reach the underground river ~15 years ago. arte did a documentary about them, called "Die schwarze Donau" ("The black Danube"). You find it on YouTube, but it's in German.

E: here is an image of the underground Danube found by the hobbyists mentioned above after 13 years of digging: [http://www.wolfgang- bauer.info/pages/reportagen/schwarze_don...](http://www.wolfgang- bauer.info/pages/reportagen/schwarze_donau/gfx/gfx_content_breit.jpg)

E2: if you are interested in the subject, I highly recommend visiting the Skocjan cave in Slovenia, which was also formed in a karst region by an underground river. I found the visit to be an almost surreal experience [3][4][5].

[1] [https://de.wikipedia.org/wiki/Kr%C3%A4henbach_(Donau)](https://de.wikipedia.org/wiki/Kr%C3%A4henbach_\(Donau\))

[2] [http://www.wolfgang- bauer.info/pages/reportagen/schwarze_don...](http://www.wolfgang- bauer.info/pages/reportagen/schwarze_donau/schwarze_donau.html)

[3] [https://cache- graphicslib.viator.com/graphicslib/thumbs674x4...](https://cache- graphicslib.viator.com/graphicslib/thumbs674x446/41626/SITours/one-day-karst- and-sunny-vipava-valley-tour-in-bovec-538902.jpg)

[4] [https://cdn.tourismontheedge.com/wp- content/uploads/2011/02/...](https://cdn.tourismontheedge.com/wp- content/uploads/2011/02/DSC_2293_skocjanske_jame_cerkvenikov_most_big.jpg)

[5] [http://www.pension- silvia.si/images/activities/the_skocjan_c...](http://www.pension- silvia.si/images/activities/the_skocjan_caves/pension_silvia_the_skocjan_caves_05.jpg)

<comment><USER4> interesting. You can visit a similar cave system with an underground river (and go on a boat ride) in Czech Republic [https://en.m.wikipedia.org/wiki/Punkva_Caves](https://en.m.wikipedia.org/wiki/Punkva_Caves)

</comment></comment></comment></comment><comment><USER5> For the Doubs, this is well-known that it is losing water under its bed and that the Loue river is this water coming out at a different point.

You can see the source of the Loue[0] on the Wikipedia page. The river is basically coming out of the mountain with already a very high flow rate. This is one of the nicest river in the east part of France, it is a pleasure to walk along or navigate it.

Edit: Found videos[1] where you can see the holes sucking the water in the river bed.

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

[1]: [https://www.estrepublicain.fr/edition-haut- doubs/2018/07/31/...](https://www.estrepublicain.fr/edition-haut- doubs/2018/07/31/doubs-a-sec-entre-pontarlier-et-morteau-les-failles- responsables)

<comment><USER6> > _This connection with the Doubs was only discovered in 1901 when a spillage > from the Pernod factory into the Doubs was transmitted into the Loue._

Suits my definition of drinking water.

</comment></comment><comment><USER7> This is one reason why it's prudent to scout rapids before running them. For example, sections of the Brule River in Minnesota are runnable above and below Devil's Kettle.[0] And by the time you saw the drop, it'd be too late to avoid the falls or sinkhole.

Even so, sinkholes can be subtle enough to miss, and still fatal.[1] Karst is some dangerous geology for boating. Although riverbeds are generally quite smooth, which is pleasant enough if you go for a swim.

0) [http://www.startribune.com/scientists-think-they-ve- solved-t...](http://www.startribune.com/scientists-think-they-ve-solved-the- mystery-of-devil-s-kettle-falls/414996694/)

1) [https://www.boston.com/news/national- news/2018/06/12/sinkhol...](https://www.boston.com/news/national- news/2018/06/12/sinkhole-whirlpool-arkansas-river-kayaker-dies)

</comment><comment><USER8> No discussion on why the cracks and sinkholes appeared. I'm looking around on Google but it seems there's very little information (in English anyway).

<comment><USER9> My neighborhood lake disappeared in a similar manner. We have Karst geology in Missouri. Might be similar.

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

<comment><USER10> I grew up in the Risle Valley, that is pictured in the video. I can confirm that we have the same geology. For only a few years, the river is disappearing every summer, which sounds surprising in a global warming context. But no big deal here, just geology.

</comment></comment></comment><comment><USER11> It says 13 days ago, but the linked video is from 2012?!

<comment><USER12> My local newspaper is the same way.

Talks about a very visual thing .... doesn't have any photos.

It's crazy because all those media companies fired their photographers and in the age of the internet ... __PHOTOS AND VIDEOS ARE IMPORTANT! __

</comment></comment><comment><USER13> Similar situation for the Popo Agie River near Lander, Wyoming. Only it resurfaces soon after going underground.

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

<comment><USER14> This pattern is fairly common when there is karstic geology, but also happens in other cases: [https://en.wikipedia.org/wiki/Subterranean_river](https://en.wikipedia.org/wiki/Subterranean_river)

I don't know how common seasonal variation is (per the other comment about the Danube doing a similar thing to the French river).

</comment></comment><comment><USER15> In Florida, one of the branches of the Suwannee disappears into the Santa Fe River sink at O'Leano [0], supposedly travels 5 more miles underground, then comes back up three miles away at River Rise [1].

[0] [https://www.floridastateparks.org/park/Oleno](https://www.floridastateparks.org/park/Oleno) [https://www.youtube.com/watch?v=0JiXOk1pXus](https://www.youtube.com/watch?v=0JiXOk1pXus)

[1] [https://www.floridastateparks.org/park/River- Rise](https://www.floridastateparks.org/park/River-Rise)

</comment><comment><USER16> Cached: [http://webcache.googleusercontent.com/search?q=cache:PpWRy3i...](http://webcache.googleusercontent.com/search?q=cache:PpWRy3isPKAJ:strangesounds.org/2018/08/french- rivers-disappear-underground-doubs-river-has-disappeared-between-pontarlier- and-morteau-1km-swallowed-up-by-large-cracks-in-the- riverbed.html+&cd=1&hl=en&ct=clnk&gl=us)

</comment><comment><USER17> In Detroit the buried rivers are called the ghost waters. There has been talk on and off about resurfacing some of them where practical. Can you imagine a gondola ride in the Motor City? Something that I'd sure like to see in my lifetime.

[http://www.modeldmedia.com/features/ghostwater413.aspx](http://www.modeldmedia.com/features/ghostwater413.aspx)

</comment><comment><USER18> Sensationalism all the way. At least one of the rivers has seen it already in 1 976 (quite recently as far as Geology and Topography go) and several other rivers in several parts of the world do the same or similar things.

Worst case scenario, the water permanently goes elsewhere, either to an aquifer or to another river or lake. People adapt. End of history.

<comment><USER19> >End of history.

So, you are saying this is an Armageddon level event?

</comment></comment><comment><USER20> This sounds related to Eurasia losing enough groundwater to affect the movement of the North Pole.

[https://www.jpl.nasa.gov/news/news.php?release=2016-100](https://www.jpl.nasa.gov/news/news.php?release=2016-100)

<comment><USER21> Read the article. It's from the area's Karst topography.

</comment></comment><comment><USER22> Same with the Lost rivers in Idaho</comment>